Reu*_*ium 57 python matplotlib multi-index pandas
在表演之后groupby.sum(),DataFrame我在尝试制作我想要的情节时遇到了一些麻烦.

如何kind='bar'为每个创建一个子图()Code,其中x轴是Month和,条是ColA和ColB?
Reu*_*ium 83
我发现unstack(级别)方法可以完美地工作,这样做的另一个好处就是不需要有关代码数量的先验知识.
df.unstack(level=0).plot(kind='bar', subplots=True)
Run Code Online (Sandbox Code Playgroud)
seg*_*ult 15
使用以下DataFrame ...

# using pandas version 0.14.1
from pandas import DataFrame
import pandas as pd
import matplotlib.pyplot as plt
data = {'ColB': {('A', 4): 3.0,
('C', 2): 0.0,
('B', 4): 51.0,
('B', 1): 0.0,
('C', 3): 0.0,
('B', 2): 7.0,
('Code', 'Month'): '',
('A', 3): 5.0,
('C', 1): 0.0,
('C', 4): 0.0,
('B', 3): 12.0},
'ColA': {('A', 4): 66.0,
('C', 2): 5.0,
('B', 4): 125.0,
('B', 1): 5.0,
('C', 3): 41.0,
('B', 2): 52.0,
('Code', 'Month'): '',
('A', 3): 22.0,
('C', 1): 14.0,
('C', 4): 51.0,
('B', 3): 122.0}}
df = DataFrame(data)
Run Code Online (Sandbox Code Playgroud)
...您可以绘制以下内容(使用横截面):
f, a = plt.subplots(3,1)
df.xs('A').plot(kind='bar',ax=a[0])
df.xs('B').plot(kind='bar',ax=a[1])
df.xs('C').plot(kind='bar',ax=a[2])
Run Code Online (Sandbox Code Playgroud)

一个用于A,一个用于B,一个用于C,x轴:"月",条形图是ColA和ColB.也许这就是你要找的东西.
seaborn.groupby可以轻松地从没有 或 的数据帧聚合长格式数据.pivot_table。df,最简单的选择是将其转换为长格式pandas.DataFrame.melt,然后使用 进行绘图seaborn.catplot,这是 matplotlib 的高级 API。
estimator从更改mean为sum'Month'OP中的列是字符串类型。一般来说,最好将列转换为日期时间数据类型pd._to_datetimepython 3.8.11, pandas 1.3.2, matplotlib 3.4.2,seaborn 0.11.2seaborn.catplotimport seaborn as sns
dfm = df.melt(id_vars=['Month', 'Code'], var_name='Cols')
Month Code Cols value
0 2014-03 C ColA 59
1 2014-01 A ColA 24
2 2014-02 C ColA 77
3 2014-04 B ColA 114
4 2014-01 C ColA 67
# specify row and col to get a plot like that produced by the accepted answer
sns.catplot(kind='bar', data=dfm, col='Code', x='Month', y='value', row='Cols', order=sorted(dfm.Month.unique()),
col_order=sorted(df.Code.unique()), estimator=sum, ci=None, height=3.5)
Run Code Online (Sandbox Code Playgroud)
sns.catplot(kind='bar', data=dfm, col='Code', x='Month', y='value', hue='Cols', estimator=sum, ci=None,
order=sorted(dfm.Month.unique()), col_order=sorted(df.Code.unique()))
Run Code Online (Sandbox Code Playgroud)
pandas.DataFrame.plotpandas使用matplotlib和默认的绘图后端。pandas.DataFrame.pivot_table代替.groupby,因为生成的数据框具有正确的形状,而不需要取消堆叠。dfp = df.pivot_table(index='Month', columns='Code', values=['ColA', 'ColB'], aggfunc='sum')
dfp.plot(kind='bar', subplots=True, rot=0, figsize=(9, 7), layout=(2, 3))
plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)