Pandas绘制堆叠面积图遇ValueError,如何实现Label+Year双X轴分组?
解决堆叠面积图多列X轴分组的问题
给定以下按Label和Year分组统计的数据集:
+--------------------+-------+-------+ | Label| Year| Total| +--------------------+-------+-------+ | FTP|02/2018| 193360| | BBBB |01/1970| 14| | BBBB |02/2018|4567511| | SSSS|02/2018| 187589| | Dddd|02/2018| 41508|
需要绘制堆叠面积图,要求X轴同时展示Label和Year作为分组依据,但使用x=['Label','Year']参数时触发ValueError: x must be a label or position错误,无法实现多列X轴分组。
错误原因
pandas的plot()方法x参数仅支持单个列名或位置索引,不允许直接传入多列列表,这是报错的核心原因。
解决步骤
要实现需求,需先预处理数据,将多列合并为单个X轴标签列,再转换为堆叠面积图所需的宽格式:
合并Label与Year为统一X轴标签
创建新列,将Label和Year拼接为唯一标识字符串(如Label - Year),确保每个分组对应唯一X轴刻度。转换为宽格式数据
使用pivot()将长格式数据转为宽格式:以合并后的X轴标签为索引,Label为列,Total为值,缺失值填充0(保证每个X轴位置包含所有Label的数值)。绘制堆叠面积图
基于宽格式数据调用plot(kind='area', stacked=True)完成绘图。
完整代码示例
import pandas as pd import matplotlib.pyplot as plt # 加载数据集(替换为你的数据加载方式) data = { 'Label': ['FTP', 'BBBB ', 'BBBB ', 'SSSS', 'Dddd'], 'Year': ['02/2018', '01/1970', '02/2018', '02/2018', '02/2018'], 'Total': [193360, 14, 4567511, 187589, 41508] } df = pd.DataFrame(data) # 处理Label空格并合并为X轴标签 df['X_Label'] = df['Label'].str.strip() + ' - ' + df['Year'] # 转换为宽格式 wide_df = df.pivot(index='X_Label', columns='Label', values='Total').fillna(0) # 绘制堆叠面积图 wide_df.plot(kind='area', stacked=True, figsize=(12, 6)) # 美化图表 plt.title('Stacked Area Chart by Label & Year') plt.xlabel('Label - Year') plt.ylabel('Total') plt.xticks(rotation=45, horizontalalignment='right') plt.tight_layout() plt.show()
关键说明
- 用
str.strip()清理了BBBB的多余空格,保证Label名称一致性。 - 宽格式转换后,每个X轴刻度对应一个
Label - Year组合,堆叠区域自动累加不同Label的Total数值。 - 若数据中存在同一Year下多个Label的情况,该方法依然适用,堆叠逻辑会自动适配。
内容的提问来源于stack exchange,提问作者Kavya Shree
相关产品推荐
相关产品推荐

