如何更改matplotlib图例中条目的顺序和分组?

vuktfyat  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(206)

这就是我的传奇现在的样子

我希望它看起来像这样:

我的代码:

ax = cars.plot.barh(stacked=True)
ax.invert_yaxis()
plt.legend(loc="center", ncols=4)

我尝试添加plt.plot(0, np.zeros([1, 3]), '.', ms=0, label='fake')ax.plot(0, np.zeros([1, 3]), '.', ms=0, label='fake')行,但结果如下:

标记为“fake”的条目应该从后面添加。然后我可以将标签从“fake”更改为“”以创建空条目。

hgqdbh6s

hgqdbh6s1#

我不认为这是明确支持的。您可以通过添加额外的、虚假的条目到图例中来解决它(在您的示例3中)。考虑:

import numpy as np
import matplotlib.pyplot as plt

plt.figure()

# Actual data
for i in range(13):
    plt.plot(np.random.random(), np.random.random(), '.', label=chr(ord('A') + i))

# Fake data, for the legend
plt.plot(0, np.zeros([1, 3]), '.', ms=0, label=' ')

plt.legend(ncol=4)
plt.show()  # or plt.savefig('figname.png')

这里我使用了0的标记大小(ms),以确保绘制的伪数据点不会出现在图或图例中。

eqoofvh9

eqoofvh92#

您可以添加一些虚拟图例句柄来填充空白区域:

from matplotlib import pyplot as plt

labels = 'abcdefghijklm'
for i, label in enumerate(labels):
    plt.bar([i], (i + 1) ** 2, color=plt.cm.turbo_r(i / len(labels)), label=label)
handles, labels = plt.gca().get_legend_handles_labels()
dummy_handle = plt.Rectangle((0, 0), 0, 0, color='none', label='')
plt.legend(handles=handles + 3*[dummy_handle], ncol=4)
plt.show()

相关问题