如何基于带MultiIndex的DataFrame按产品分类绘制多列折线图?
解决方案:无需拆分DataFrame,一键实现需求
嘿,我刚好也处理过类似的多级索引绘图需求,完全不用拆成多个DataFrame!Pandas的unstack()配合绘图参数就能轻松搞定,下面给你两种简洁的实现方式:
方法一:Unstack+子图(最推荐)
直接将Product索引拆为列的二级索引,然后利用subplots=True让每一列数据单独生成一个子图,每个子图里自动区分不同Product的折线:
import pandas as pd import matplotlib.pyplot as plt # 初始化你的DataFrame index = pd.MultiIndex.from_tuples( zip(['A','A','A','A','B','B','B','B'],[2012,2013,2014,2015,2012,2013,2014,2015]), names=['Product','Year'] ) df = pd.DataFrame({ 'col1':[10,20,10,30,50,20,60,80], 'col2':[40,20,40,30,50,20,60,80], 'col3':[10,20,80,30,80,20,80,10], },index=index) # 核心操作:拆Product索引为二级列,然后绘图 df.unstack('Product').plot( kind='line', subplots=True, # 每个原列单独生成子图 figsize=(10, 8), marker='o' # 加上标记点更清晰 ) plt.tight_layout() # 自动调整子图间距 plt.show()
这样生成的图里,每个子图对应col1/col2/col3,每个子图内会有两条折线分别对应Product A和B,x轴自动设为Year,完全匹配你的需求。
方法二:Groupby+循环绘图(灵活定制)
如果你需要更细致地控制每个子图的样式,可以用groupby结合Matplotlib的子图对象:
fig, axes = plt.subplots(1, 3, figsize=(12, 4)) # 创建1行3列的子图 for idx, col in enumerate(df.columns): # 按Product分组,绘制当前列的折线 df.groupby('Product')[col].plot( ax=axes[idx], marker='s', legend=True ) axes[idx].set_title(f'{col} Trend') # 设置子图标题 axes[idx].set_xlabel('Year') # 设置x轴标签 plt.tight_layout() plt.show()
这种方式适合需要自定义每个子图标题、颜色、图例等场景,代码稍长但灵活性更高。
两种方法都不用拆分DataFrame,选哪种取决于你对绘图样式的定制需求~
内容的提问来源于stack exchange,提问作者Veki
相关产品推荐
相关产品推荐

