颠倒传奇的顺序

Yak*_*kov 21 python reverse matplotlib legend

我使用以下代码绘制条形图.需要以相反的顺序呈现图例.我该怎么做?

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()
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 40

你可以打电话

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[::-1], labels[::-1], title='Line', loc='upper left')
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


小智 12

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

\n
plt.legend(title="Line", loc=\'upper left\', reverse=True)\n
Run Code Online (Sandbox Code Playgroud)\n

默认值是reverse=False(之前的行为)\xe2\x80\x94,将其设置为reverse=True现在将按照与堆叠条形相同的顺序显示图例中的条目。请参阅Axes.legend 文档

\n


Car*_*ews 8

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

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)
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢它的优雅——但它导致我的传说中的一些项目超出了盒子范围。 (2认同)

Vai*_*aro 7

或者您可以使用更简单的

handles, labels = ax.get_legend_handles_labels()
ax.legend(reversed(handles), reversed(labels), title='Line', loc='upper left')
Run Code Online (Sandbox Code Playgroud)

  • ax.legend(*map(反转, ax.get_legend_handles_labels()), ...) (3认同)

Jam*_*ull 5

我没有对此进行测试,因为我没有您的数据,但这是基于此处有关控制图例条目的文档。

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])
Run Code Online (Sandbox Code Playgroud)