Matplotlib图表图例显示异常求助及bar_labels作用咨询
问题解答:Matplotlib 3.6柱状图图例异常及bar_labels参数说明
一、图例显示异常原因及解决办法
你碰到的图例仅显示红色一项的问题,核心原因是Matplotlib 3.6及更早版本不支持通过ax.bar()的label参数传入列表自动合并相同图例项——这个合并功能是Matplotlib 3.7版本才新增的特性。在3.6版本中,直接给label传列表,只会识别第一个非下划线开头的有效标签(以_开头的标签会被Matplotlib判定为隐藏标签),所以最终只显示了"red"这一项。
两种可行的解决方式:
- 升级Matplotlib到3.7及以上版本:升级后直接运行原代码,就能得到预期的合并图例效果。
- 手动创建图例条目(适合不愿升级的场景):通过自定义
Patch对象生成对应颜色的图例,代码示例如下:
import matplotlib.pyplot as plt from matplotlib.patches import Patch fig, ax = plt.subplots() fruits = ['apple', 'blueberry', 'cherry', 'orange'] counts = [40, 100, 30, 55] bar_colors = ['tab:red', 'tab:blue', 'tab:red', 'tab:orange'] bars = ax.bar(fruits, counts, color=bar_colors) ax.set_ylabel('fruit supply') ax.set_title('Fruit supply by kind and color') # 手动去重生成图例元素 legend_elements = [ Patch(facecolor='tab:red', label='red'), Patch(facecolor='tab:blue', label='blue'), Patch(facecolor='tab:orange', label='orange') ] ax.legend(handles=legend_elements, title='Fruit color') plt.show()
二、bar_labels参数的作用
代码里的bar_labels是用来定义每个柱子的标签文本的,但默认不会直接显示在图表上。它的核心作用是配合ax.bar_label()函数,给每个柱子添加标注(比如在柱子上方显示标签或数值)。举个例子,在ax.bar()之后添加以下代码,就能显示这些标签:
ax.bar_label(bars, labels=bar_labels)
注:以_开头的标签会被bar_label自动去掉下划线,所以_red会显示为red。
效果对比
- 预期效果图:

- 实际效果图(Matplotlib 3.6):

内容的提问来源于stack exchange,提问作者user996159
相关产品推荐
相关产品推荐

