使用一次“绘图”调用绘制多条曲线时的一个图例条目

时间:2018-09-25 11:45:57

标签: python matplotlib

我通过使用一个plot调用方式绘制多条曲线来创建网格:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.array([[0,1], [0,1], [0,1]])
y = np.array([[0,0], [1,1], [2,2]])

ax.plot([0,1],[0,2], label='foo', color='b')

ax.plot(x.T, y.T, label='bar', color='k')

ax.legend()

plt.show()

生成的图例具有与曲线一样多的“条”条目(请参见下文)。我希望每个plot调用都只有一个图例项(在这种情况下,只有一次'bar')。

我希望这样做,这样我就可以拥有其他绘图命令(例如,绘制“ foo”曲线的命令),如果有标签,它们的曲线会自动 包含在图例中。我特别想避免在构建图例时手动选择手柄,而是使用matplotlib的功能通过在绘制时通过是/否包括标签来处理此问题。我该如何实现?

enter image description here

2 个答案:

答案 0 :(得分:2)

这里是一种可能的解决方案:您可以使用下划线不会产生图例条目的事实。因此,将除第一个标签之外的所有标签都设置为"_",可以禁止这些标签显示在图例中。

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

x = np.array([[0,1], [0,1], [0,1]])
y = np.array([[0,0], [1,1], [2,2]])

ax.plot([0,1],[0,2], label='foo', color='b')

lines = ax.plot(x.T, y.T, label='bar', color='k')
plt.setp(lines[1:], label="_")
ax.legend()

plt.show()

enter image description here

答案 1 :(得分:1)

以下是使用现有图例手柄和标签的一种方法。您首先获得三个handles, labels,然后仅显示第一个。通过这种方式另外,您不仅可以控制放置手柄的顺序,而且还可以显示绘图中的内容。

ax.plot(x.T, y.T,  label='bar', color='k')
handles, labels = ax.get_legend_handles_labels()
ax.legend([handles[0]], [labels[0]], loc='best')

enter image description here

替代方法,其中图例将取自特定图(线组)-在这种情况下为ax1

ax1 = ax.plot(x.T, y.T,  label='bar', color='k')
plt.legend(handles=[ax1[0]], loc='best')

用两个数字将其扩展到您的问题

ax1 = ax.plot([0,1],[0,2], label='foo', color='b')
ax2 = ax.plot(x.T, y.T,  label='bar', color='k')
plt.legend(handles=[ax1[0], ax2[1]], loc='best')

@SpghttCd建议的另一种使用for循环的替代方法

for i in range(len(x)):
    ax.plot(x[i], y[i], label=('' if i==0 else '_') + 'bar', color='k')

ax.legend()

enter image description here