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

如何在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位置的分组柱子)。具体步骤如下:

  1. 清理数据(移除重复的workflow列,原DataFrame的索引已对应工作流名称):
# 移除重复的workflow列
df_clean = df.drop('workflow', axis=1)
  1. 转置数据结构:
# 转置后,行变为blocked_*,列变为各个工作流
df_transposed = df_clean.T
  1. 绘制柱状图:
# 绘制分组柱状图,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:35:26