如何在Matplotlib中以blocked_*列为X轴绘制多柱状图?
解决pandas柱状图X轴设置问题
问题背景
现有如下pandas DataFrame:
workflow blocked_14 blocked_7 blocked_5 blocked_2 blocked_1 au_in_service_order_response au_in_service_order_response 12.00 11.76 15.38 25.0 0.0 au_in_cats_sync_billing_period au_in_cats_sync_billing_period 3.33 0.00 0.00 0.0 0.0 au_in_MeterDataNotification au_in_MeterDataNotification 8.70 0.00 0.00 0.0 0.0
需要创建柱状图,将blocked_14、blocked_7等blocked_*列作为X轴,每个X轴类别下显示对应三个工作流的数值。尝试df.plot(x='workflow', kind='bar')会把工作流放在X轴,不符合需求;而使用df.plot(x=['blocked_14','blocked_7',...], kind='bar')时触发报错:
ValueError: x must be a label or position
解决方案
核心思路是转置DataFrame,让blocked_*列成为行索引(即X轴类别),工作流成为列(即每个X位置的分组柱子)。具体步骤如下:
- 清理数据(移除重复的
workflow列,原DataFrame的索引已对应工作流名称):
# 移除重复的workflow列 df_clean = df.drop('workflow', axis=1)
- 转置数据结构:
# 转置后,行变为blocked_*,列变为各个工作流 df_transposed = df_clean.T
- 绘制柱状图:
# 绘制分组柱状图,X轴为blocked_*,每个位置对应三个工作流的数值 ax = df_transposed.plot(kind='bar', figsize=(10, 6)) # 可选:添加标签和标题 ax.set_xlabel('阻塞周期') ax.set_ylabel('数值') ax.set_title('各工作流在不同阻塞周期的数值') ax.legend(title='工作流')
如果原DataFrame的workflow列不是重复值,而是需要保留的标识,可先将其设为索引再转置:
# 将workflow设为索引 df.set_index('workflow', inplace=True) # 转置并绘图 df.T.plot(kind='bar')
错误原因说明
df.plot()的x参数仅支持单个列名或位置,不能传入列名列表。通过转置数据,我们把需要作为X轴的blocked_*转换为行索引,而pandas的plot.bar()默认将行索引作为X轴,完美匹配需求。
内容的提问来源于stack exchange,提问作者PrimuS
相关产品推荐
相关产品推荐

