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
相关产品推荐
相关产品推荐

