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

Pandas/Matplotlib如何绘制分组柱状图并按指定列设置颜色编码

分组柱状图实现方案

你之前的写法生成多图的核心原因是:遍历groupby返回的对象逐组调用绘图方法时,每次都会创建新的独立画布/坐标轴,自然没法把所有柱子合并到同一张图。只要先把数据转换为适配分组柱状图的宽表结构,单次调用绘图接口就能实现需求。

实现步骤

  • 第一步:聚合+重塑数据结构
    首先把数据处理成行索引为data_range分组、列名为trade_type类型、单元格值为对应均值的格式,用unstack()就能完成长表转宽表的操作:
# 如果已经提前算好了mean列,直接用下面这行重塑结构
plot_df = df.groupby(['data_range', 'trade_type'])['mean'].first().unstack()

# 如果还没计算均值,把first()换成mean()即可,会自动按两个维度聚合算均值
# plot_df = df.groupby(['data_range', 'trade_type'])['你的原始数值列名'].mean().unstack()

如果需要固定trade_type的展示顺序,可以在unstack之后手动重排columns顺序:

# 替换成你自己的trade_type枚举值顺序即可
plot_df = plot_df[['现货交易', '合约交易', '杠杆交易']]
  • 第二步:单次调用柱状图接口绘图
    直接对处理好的宽表调用bar绘图,会自动生成符合要求的分组柱状图:
import matplotlib.pyplot as plt

ax = plot_df.plot(
    kind='bar',
    figsize=(10, 6), # 自定义画布大小
    rot=0 # 可选:把横轴标签改成水平显示,默认是倾斜90度
)

# 可选:给每个柱子顶部加数值标签,方便读数
for container in ax.containers:
    ax.bar_label(container, padding=2)

plt.tight_layout() # 自动调整布局避免标签被截断
plt.show()

最终效果

  • 横轴自动按data_range做分组标注,每个分组下并排展示3个柱子,对应3种交易类型
  • 同一种trade_type的柱子全局使用统一颜色,自动生成匹配的图例
  • 所有元素都在单张图内,不会生成独立多图

不要逐组循环调用绘图方法,pandas的内置绘图接口原生支持对宽表直接生成分组柱状图,提前把数据结构处理对是最简便的实现方式。

内容的提问来源于stack exchange,提问作者LGR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:18:37