You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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轴标签列,再转换为堆叠面积图所需的宽格式:

  1. 合并Label与Year为统一X轴标签
    创建新列,将Label和Year拼接为唯一标识字符串(如Label - Year),确保每个分组对应唯一X轴刻度。

  2. 转换为宽格式数据
    使用pivot()将长格式数据转为宽格式:以合并后的X轴标签为索引,Label为列,Total为值,缺失值填充0(保证每个X轴位置包含所有Label的数值)。

  3. 绘制堆叠面积图
    基于宽格式数据调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:00:48