【问题标题】:How to obtain a correct legend for a barplot when the first bar is modified?修改第一个条时如何获得条形图的正确图例?
【发布时间】:2020-05-16 20:08:23
【问题描述】:

我有一个分组条形图,我根据数据值用不同的面颜色标记图中的一个条形图(为简单起见,没有分组的示例)。当我添加一个图例时,它总是从第一个条中获取颜色。如果第一个条是“标记条”,这会导致错误的颜色。我总是希望它是情节陈述中的颜色,而不是改变的颜色。

from matplotlib import pyplot as plt

x = [1,2,3,4]
y = [1,2,3,4]
marked = 0

bars = plt.bar(x, y, color='k',label='label')
bars[marked].set_facecolor('r')
plt.legend()
plt.show()

这会导致图例中出现一个红色框。但我希望它与其他条的颜色相同,这是在我的真实代码中动态设置的——在这个例子中:黑色。

我尝试添加:

if marked == 0:
   plt.legend([bars[1]])

但这并没有像希望的那样工作......

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    一个简单的解决方案似乎是改变语句的顺序:

    bars = plt.bar(x, y, color='k', label='label')
    plt.legend()
    bars[marked].set_facecolor('r')
    

    如果无法做到这一点,也可以重新标记这些条形。使用bars = plt.bar(..., label='label'),标签被分配给 bar 容器元素。在创建图例时,第一个条将用于决定颜色。请注意,以下划线开头的标签将被跳过。因此,要让第二个条用作颜色,请删除容器的标签(分配以下划线开头的标签),并将其原始标签添加到第一个条。

    可选地,为了获得图例中的特殊栏,可以为其分配一个明确的标签。

    from matplotlib import pyplot as plt
    
    x = [1, 2, 3, 4]
    y = [1, 2, 3, 4]
    marked = 0
    
    bars = plt.bar(x, y, color='k', label='label')
    bars[marked].set_facecolor('r')
    if marked == 0:
        bars[1].set_label(bars.get_label())
        bars.set_label('_nolegend_')
    
    bars[marked].set_label('special') # optionally give the special bar an explicit label
    
    plt.legend()
    plt.show()
    

    【讨论】:

    • 看起来您忘记更改代码 sn-p 中的顺序。但是在改变颜色之前调用 plt.legend 对我有用。请编辑来世的答案,我会接受。
    • 非常感谢您指出复制粘贴错误。似乎我太急切地想着完整的解决方案,其中包括一个用于修改后的条的额外标签。
    • 最后我最终使用了第二种解决方案,因为循环中编写了多个条,并且循环中没有颜色变化,它更方便。很有帮助。
    猜你喜欢
    • 2016-01-13
    • 1970-01-01
    • 2017-12-06
    • 2021-12-16
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2017-10-31
    相关资源
    最近更新 更多