matplotlib绘制barplot时为指定柱标签设置对应颜色及正确图例
问题根源
原有代码的bug来自两处:
- 遍历
df.Types的每个元素时,每次都调用ax.bar()绘制全量6根柱子,相当于整组柱形被重复绘制了6次,只是图层重叠肉眼看不出,但属于冗余绘制 - 每次重复绘制时都传入了分组label参数,同一个分组标签被多次注册到图例中,最终出现大量重复的图例条目
修复方案
不需要循环重复绘图,先给每个柱子匹配好对应颜色,单次完成柱形绘制后手动生成分组图例即可,可直接运行的修复后代码如下:
import matplotlib.pyplot as plt import pandas as pd from matplotlib.patches import Patch mdict = {"Types": ["A", "B", "C", "D", "F", "G"], "Count": [3, 4, 5, 6, 7, 6]} df = pd.DataFrame(mdict) fig, ax = plt.subplots(figsize=(15, 8)) # 建立标签到颜色的映射关系 type_color_rule = { "A": "red", "B": "red", "C": "green", "D": "green", "F": "blue", "G": "blue" } # 按顺序生成每个柱子对应的颜色列表 bar_color_list = [type_color_rule[item] for item in df.Types] # 单次绘制全部柱形,避免重复绘制 ax.bar(df.Types, df.Count, color=bar_color_list) # 自定义图例项,匹配三类分组的颜色和名称 legend_items = [ Patch(facecolor="red", label="Type 1"), Patch(facecolor="green", label="Type 2"), Patch(facecolor="blue", label="Type 3") ] ax.legend(handles=legend_items) plt.show()
实现效果
- 柱形仅绘制一次,无冗余图层
- A、B柱显示为红色,对应Type 1;C、D柱显示为绿色,对应Type 2;F、G柱显示为蓝色,对应Type 3
- 图例仅展示3个分组条目,无重复项
内容的提问来源于stack exchange,提问作者Tuyen
相关产品推荐
相关产品推荐

