如何用DataFrame.plot绘制配对列柱状图:同对同色且其一无填充
为配对列DataFrame绘制带配对颜色的柱状图
问题描述
我有一个包含配对列的多层索引DataFrame,想要绘制柱状图时实现:
- 每一对列使用唯一的颜色
- 每对中的一列有填充色,另一列无填充但保留同色边缘
尝试直接使用df.plot.bar()指定color和edgecolor参数,但误以为edgecolor是按行应用,而ChatGPT给出的手动循环绘制方案过于冗长,希望找到基于DataFrame.plot的简洁实现方式。
简洁解决方案
可以通过自动生成color和edgecolor参数列表,直接传递给df.plot.bar(),无需手动绘制每个柱子:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ ('A', '1'): [1, 2, 3], ('A', '2'): [4, 5, 6], ('B', '1'): [7, 8, 9], ('B', '2'): [10, 11, 12] }) # 定义每个配对组的颜色(数量与配对组一致) pair_colors = ['C0', 'C1'] # 生成color列表:每组第一列用对应颜色,第二列无填充 color_list = [] # 生成edgecolor列表:每组两列都使用对应组的颜色 edgecolor_list = [] for color in pair_colors: color_list.extend([color, 'none']) edgecolor_list.extend([color, color]) # 绘制柱状图 ax = df.plot.bar(color=color_list, edgecolor=edgecolor_list) ax.set_title('配对列柱状图(填充/无填充配对)') ax.legend(title='列标签')
方案说明
- 列表生成逻辑:遍历每个配对组的颜色,为每组的两列分别设置
color(填充色/无填充)和edgecolor(统一组颜色),避免手动逐个列指定参数,适配任意数量的配对组。 - 基于DataFrame.plot:完全利用pandas内置的绘图接口,无需手动调用matplotlib的
ax.bar(),代码更简洁且保留pandas绘图的便捷性(自动处理索引、图例等)。 - 效果验证:每对列的第一个柱子有填充色,第二个柱子无填充但边缘与同组颜色一致,完全符合需求。
补充说明
如果你的pandas版本较新,其实最初尝试的代码逻辑是正确的——edgecolor参数列表是按列分配的,每个列的所有柱子都会使用对应边缘颜色。自动生成列表的方式只是让代码更易维护,避免手动写死参数列表。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

