如何在多列上绘制 groupby 的值

How to plot the values of a groupby on multiple columns

我有一个类似于以下的数据集:

import pandas as pd

data = {'Country': ['Spain', 'Italy', 'France', 'Germany', 'Portugal', 'Greece', 'UK', 'Spain', 'Italy', 'France', 'Germany', 'Portugal', 'Greece', 'UK', 'Spain', 'Italy', 'France', 'Germany', 'Portugal', 'Greece', 'UK'],
        'Date': ['Jan 2020', 'Jan 2020', 'Jan 2020', 'Jan 2020', 'Jan 2020', 'Jan 2020', 'Jan 2020', 'Feb 2020', 'Feb 2020', 'Feb 2020', 'Feb 2020', 'Feb 2020', 'Feb 2020', 'Feb 2020', 'Dec 2020', 'Dec 2020', 'Dec 2020', 'Dec 2020', 'Dec 2020', 'Dec 2020', 'Dec 2020'],
        'Sales': [20000, 30000, 10000, 10000, 30000, 10000, 10000, 50000, 40000, 30000, 20000, 30000, 10000, 10000, 60000, 70000, 80000, 10000, 30000, 10000, 10000]}
df = pd.DataFrame(data)

     Country      Date  Sales
0      Spain  Jan 2020  20000
1      Italy  Jan 2020  30000
2     France  Jan 2020  10000
3    Germany  Jan 2020  10000
4   Portugal  Jan 2020  30000
5     Greece  Jan 2020  10000
6         UK  Jan 2020  10000
7      Spain  Feb 2020  50000
8      Italy  Feb 2020  40000
9     France  Feb 2020  30000
10   Germany  Feb 2020  20000
11  Portugal  Feb 2020  30000
12    Greece  Feb 2020  10000
13        UK  Feb 2020  10000
14     Spain  Dec 2020  60000
15     Italy  Dec 2020  70000
16    France  Dec 2020  80000
17   Germany  Dec 2020  10000
18  Portugal  Dec 2020  30000
19    Greece  Dec 2020  10000
20        UK  Dec 2020  10000

我想可视化销售额在一年中按国家/地区变化的情况,因此我想显示 7 个直方图(每个国家/地区一个)。对于每个图,'Date' 将在 x-axis 上,'Sales' 值将在 y-axis 上。此外,还需要一个标识国家/地区的标题以及 x-label、y-label.

我已经尝试了在之前的讨论中找到的几个选项,但是 none 这些选项符合我想要实现的目标。我尝试了以下方法:

df.groupby('Country').hist(column='Sales', grid= False, figsize=(2,2))
df['Sales'].hist(grid=True, by=one_year_df['Country'])
df.groupby('Country').hist(grid= False, figsize=(2,2))
df.reset_index().pivot('index','Country','Sales').hist(grid=False, bins=12)
grouped = df.groupby('Country')

ncols=2
nrows = int(np.ceil(grouped.ngroups/ncols))

fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(12,12), sharey=False)

for (key, ax) in zip(grouped.groups.keys(), axes.flatten()):
    grouped.get_group(key).plot(ax=ax)

ax.legend()
plt.show()

然而,none 这些选项让我可以设置 'Date' 列,而且似乎无法设置 x-axis、y-axis 如我所愿,结果,情节毫无意义。

我还发现了另一段代码,似乎考虑了所有变量,但结果仍然不如预期:

fig, ax = plt.subplots(figsize=(15,7))
df.groupby(['Country']).sum()['Sales'].plot(ax=ax)
ax.set_xlabel('Date')
ax.set_ylabel('Sales')

欢迎任何意见或建议。谢谢。

  • 对于每个图,'Date' 将在 x 轴上,'Sales' 值将在 y 轴上。 最好显示为线图或条形图。直方图本质上是条形图(就可视化而言)。
  • 使用 pd.to_datetime
  • 'Date' 列转换为日期时间
  • 使用 pivot_tableaggfun='sum'
  • 重塑数据框
  • 使用 pandas.DataFrame.plot 绘图,它使用 matplotlib 作为默认绘图后端
  • 如有必要,请参阅此 answer 以使用许多子图改进子图 size/spacing。
import pandas as pd
import matplotlib.pyplot as plt

# convert the column to a datetime dtype
df.Date = pd.to_datetime(df.Date).dt.date

# reshape the dataframe
dfp = df.pivot_table(index='Date', columns='Country', values='Sales', aggfunc='sum')

# plot
ax = dfp.plot(figsize=(8, 5))
ax.legend(bbox_to_anchor=(1, 1.02), loc='upper left')

  • 如果绘制条形图,会很拥挤,因为每行数据都有一个条形图。
ax = dfp.plot(kind='bar', subplots=True, figsize=(14, 12), layout=(2, 4), rot=0, legend=False)