反转图例的顺序

Reverse the order of a legend

提问人:YAKOVM 提问时间:1/3/2016 最后编辑:Peter MortensenYAKOVM 更新时间:2/17/2023 访问量:50855

问:

我使用以下代码绘制条形图,需要以相反的顺序显示图例。我该怎么做?

colorsArr = plt.cm.BuPu(np.linspace(0, 0.5, len(C2)))
p = numpy.empty(len(C2), dtype=object)
plt.figure(figsize=(11, 11))

prevBar = 0
for index in range(len(C2)):
    plt.bar(ind, C2[index], width, bottom=prevBar, color=colorsArr[index],
            label=C0[index])
    prevBar = prevBar + C2[index]

# Positions of the x-axis ticks (center of the bars as bar labels)
tick_pos = [i + (width/2) for i in ind]

plt.ylabel('Home Category')
plt.title('Affinity - Retail Details(Home category)')

# Set the x ticks with names
plt.xticks(tick_pos, C1)
plt.yticks(np.arange(0, 70000, 3000))
plt.legend(title="Line", loc='upper left')

# Set a buffer around the edge
plt.xlim(-width*2, width*2)
plt.show()
Python matplotlib 反向 图例

评论


答:

5赞 Jamie Bull 1/3/2016 #1

我没有测试过,因为我没有你的数据,但这是基于这里关于控制图例条目的文档。

handles = []
for index in range(len(C2)):
    h = plt.bar(ind, C2[index], width, bottom=prevBar, color=colorsArr[index], label=C0[index])
    handles.append(h)
    prevBar = prevBar + C2[index]

plt.legend(title="Line", loc='upper left', handles=handles[::-1])

评论

0赞 Richard 7/24/2018
这个答案是什么?C2
1赞 Jamie Bull 9/13/2018
和问题一样,我想C2
0赞 Raphael 5/4/2021
AttributeError: 'list' object has no attribute 'get_label'
0赞 Raphael 5/4/2021
只是用逗号固定:h, = plt.plot[...]
92赞 unutbu 1/3/2016 #2

你可以打电话给

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[::-1], labels[::-1], title='Line', loc='upper left')

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2016)

C0 = list('ABCDEF')
C2 = np.random.randint(20000, size=(len(C0), 3))
width = 1.0
C1 = ['foo', 'bar', 'baz']
ind = np.linspace(-width, width, len(C1))


colorsArr = plt.cm.BuPu(np.linspace(0, 0.5, len(C2)))
fig = plt.figure(figsize=(11,11))
ax = fig.add_subplot(1, 1, 1)

prevBar = 0
for height, color, label in zip(C2, colorsArr, C0):
    h = ax.bar(ind, height, width, bottom=prevBar, color=color, label=label)
    prevBar = prevBar + height

plt.ylabel('Home Category')
plt.title('Affinity - Retail Details(Home category)')

# positions of the x-axis ticks (center of the bars as bar labels)
tick_pos = [i+(width/2.0) for i in ind]
# set the x ticks with names
plt.xticks(tick_pos, C1)
plt.yticks(np.arange(0,70000,3000))

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[::-1], labels[::-1], title='Line', loc='upper left')

plt.show()

enter image description here

9赞 Carl Drews 8/31/2017 #3

对图例垂直间距使用负数,如下所示:

matplotlib.pyplot.stackplot(X, *revDataValues,
    linewidth=1.0,
    edgecolor='black')

matplotlib.pyplot.legend(revNames,
    loc=6, bbox_to_anchor=(1.05, 0.5),
    labelspacing=-2.5, frameon=False,         # reverse legend
    fontsize=9.0)

带有反转图例的堆积面积图

评论

0赞 Soerendip 5/8/2019
什么是 *revDataValues?
0赞 Soerendip 5/8/2019
我认为这行不通。我想切换图例中的项目,而不是剧情中的项目。
2赞 Jeffrey Benjamin Brown 6/18/2019
我喜欢它的优雅 - 但它导致我传说中的某些物品超出了框框。
1赞 Mr. Vanderstelt 8/22/2019
这是我见过的最被低估的答案 - 非常优雅
0赞 Mohammed 8/8/2022
非常优雅的解决方案。frameon=False 将对标签超出框框的问题进行排序
25赞 Vaiaro 9/4/2018 #4

或者您可以使用更简单的

handles, labels = ax.get_legend_handles_labels()
ax.legend(reversed(handles), reversed(labels), title='Line', loc='upper left')

评论

3赞 user66081 8/3/2019
ax.legend(*map(reversed, ax.get_legend_handles_labels()), ...)
0赞 mins 12/19/2020
@user66081:请解释您的更正,因为原始解决方案似乎运行良好,并且与使用带有负步切片且没有映射的索引的所选答案相似。
0赞 user66081 12/19/2020
@mins:我想原因是你不需要记住哪个先来,你可以在IDE的建议列表中找到get_legend_handles_labels。“加”,负阶梯切片很丑。
7赞 Timmm 2/17/2023 #5

最新版本的 matplotlib (>=3.7) 现在提供了这个开箱即用的功能:

plt.legend(title="Line", loc='upper left', reverse=True)

默认值为(上一个行为)- 将其设置为 现在将以与堆积条相同的顺序显示图例中的条目。请参阅 Axes.legend 文档reverse=Falsereverse=True