【问题标题】:How to add more items to the matplotlib legend?如何向 matplotlib 图例添加更多项目?
【发布时间】:2014-02-25 03:22:20
【问题描述】:

当我几个小时前遇到这个问题时,我以为只需几分钟的谷歌搜索就可以解决,但我来了。

我使用单个 plt.bar() 调用绘制所有值:

plt.bar(range(len(vals)), vals, width=1, color=colors)

这将创建一个条形图,其中的条形采用颜色编码。当我尝试创建图例时,它只显示一种颜色和一个标签。所以例如这样做:

labels = ['Group 1', 'Group 2', 'Group 3']
plt.legend(labels,
   loc='best',
   ncol=3)

仅在图例上显示“第 1 组”以及众多条形颜色中的一种。如何向图例添加更多项目?

我知道这个问题是因为我在一个图中分配了多种颜色,但在这种情况下,这是该部分最干净的解决方案。

我发现建议使用“ax.get_legend_handles_labels()”的资源,但这会为我返回两个空列表。

编辑:

@falsetru, 这是一个代码示例,描述了应用您的解决方案后的问题。我包括了所有相关部分。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

items= ['item1','item2','item3']           #item names
vals = [1, 2, 3]                           #values to be plotted
groups = [['item1','item2'], ['item3']]    #defines item groupings

colors = [''] * len(items)
color_space = iter(cm.Paired(np.linspace(0, 1, len(groups))))
for c in groups:
    col = next(color_space)
    for l in c:
        i = items.index(l)
        colors[i] = col

for i, (val, c) in enumerate(zip(vals, colors)):
    plt.bar([i], [val], width=1, color=c)

labels = ['Group 1', 'Group 2']
plt.legend(labels, loc='best')

plt.show()

这是输出,但我希望第 2 组显示下一种颜色。

【问题讨论】:

    标签: python matplotlib legend


    【解决方案1】:

    vals(y 值)、indices(x 值)分组,就像对 groups 所做的那样:

    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    import numpy as np
    
    indices = [[1, 3], [2], [4]]               # <-----
    vals = [[1, 2.5], [1.5], [3.5]]            # <-----
    labels = ['Group 1', 'Group 2', 'Group 3']
    
    color_space = iter(cm.Paired(np.linspace(0, 1, len(vals))))
    for xs, ys, label in zip(indices, vals, labels):
        col = next(color_space)
        plt.bar(xs, ys, width=1, color=col, label=label)
    
    plt.legend(loc='best')
    plt.show()
    

    【讨论】:

    • 感谢您的回复!这绝对是朝着正确方向迈出的一步。仍然存在一个问题,因为我有一组相同颜色的条,所以图例错误地显示了前 x 个条的颜色,其中 x 是颜色组的数量。
    • @sebo,我不明白你的评论。您能否用minimal, complete example code 更新显示您的问题的问题?
    • 我添加了一张描述问题的图片。如果它仍然有帮助,我可以尝试提出一个最小的代码示例。
    • @sebo,请显示生成图像的代码。
    • 感谢更新 - 这解决了我提供的示例代码,但在我的实际代码中还有一个限制。条形的排序方式必须与它们在 items 和 vals 列表中的方式相同。另一方面,组中的项目可以是任何顺序。因此,例如,如果示例代码中的组是 [1,3] 和 [2],这将不起作用。
    猜你喜欢
    • 2020-08-18
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2019-09-17
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多