如何在多列上绘制 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_table
和 aggfun='sum'
重塑数据框
- 使用
pandas.DataFrame.plot
绘图,它使用 matplotlib
作为默认绘图后端
- 请参阅 How to give a pandas/matplotlib bar graph custom colors 为线条或条形指定不同的颜色。
- List of named colors
- Choosing Colormaps
- 如有必要,请参阅此 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)
我有一个类似于以下的数据集:
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
将 - 使用
pivot_table
和aggfun='sum'
重塑数据框
- 使用
pandas.DataFrame.plot
绘图,它使用matplotlib
作为默认绘图后端- 请参阅 How to give a pandas/matplotlib bar graph custom colors 为线条或条形指定不同的颜色。
- List of named colors
- Choosing Colormaps
- 如有必要,请参阅此 answer 以使用许多子图改进子图 size/spacing。
'Date'
列转换为日期时间
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)