如何在Matplotlib中为高亮彩色柱状图配置对应匹配的图例标注
Matplotlib高亮柱形图例颜色不匹配的解决方法
问题原因
这个图例颜色错位的问题是Matplotlib的默认生成逻辑导致的:
- 当你直接用字符串列表给
plt.legend()传图例说明时,程序会默认取绘图流程里第一个柱形容器的初始颜色(也就是你一开始设置的灰色)生成图例色块 - 你后续循环修改单个柱形为蓝色的操作,完全不会被图例的自动识别逻辑捕捉,所以哪怕实际柱子是蓝色,图例还是会绑定一开始的灰色样本
- 原代码还有个隐藏bug:
plt.xticks(pos, labels)里的pos从来没被定义过,直接运行会报NameError,这个也得一起修正。
调整方案
要让图例和实际柱形颜色完全对应,不能让程序自动选择默认样本,需要手动把图例色块和真实柱形绑定:
- 循环修改柱子颜色的时候,顺手把第一个灰色普通柱、第一个蓝色高亮柱的对象存下来,作为图例的颜色样本
- 调用
plt.legend()的时候,把存好的样本对象、对应的说明文字当参数传入,这样图例取的颜色就是实际柱子的颜色 - 把xticks里没定义的
pos替换成实际的x坐标值,也就是画柱子时用的data参数。
修改后可直接运行的代码
import matplotlib.pyplot as plt data = range(1,6) labels = ['a','b','c','d','e'] relevant_bars = ['b','e'] # 提前初始化两类柱形的图例样本 gray_sample = None blue_sample = None bars = plt.bar(data, data, color='gray') for i in range(len(bars)): if labels[i] in relevant_bars: bars[i].set_color('blue') # 留存第一个找到的蓝色柱作为高亮图例样本 if blue_sample is None: blue_sample = bars[i] else: # 留存第一个找到的灰色柱作为普通柱形图例样本 if gray_sample is None: gray_sample = bars[i] # 修正未定义的pos参数,使用柱形的x坐标作为刻度位置 plt.xticks(data, labels) # 手动绑定样本对象和对应图例说明,保证颜色完全匹配 plt.legend([gray_sample, blue_sample], ['非相关柱形', 'Relevant bars(相关高亮柱)']) plt.show()
更简便的实现技巧:你也可以在循环修改柱形属性时,直接给对应对象设置
label标签,后续直接调用plt.legend()即可自动去重匹配正确颜色,不需要手动找样本对象。对应代码片段:for i in range(len(bars)): if labels[i] in relevant_bars: bars[i].set_color('blue') bars[i].set_label('Relevant bars') else: bars[i].set_label('Non-relevant bars')
内容的提问来源于stack exchange,提问作者user7864386
相关产品推荐
相关产品推荐

