matplotlib 使用一个plot调用绘制多条曲线时一个图例项

ecfsfe2w  于 2022-11-15  发布在  其他
关注(0)|答案(3)|浏览(202)

我使用一个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()

得到的图例有多少条曲线就有多少条“bar”(见下文)。我希望每个plot调用只有一个图例条目(在本例中只有一个时间“bar”)。
我希望这样我可以有其他绘图命令(例如绘制'foo'曲线的命令),如果它们有标签的话,它们的曲线会 * 自动 * 包含在图例中。我特别希望在构建图例时避免手动选择句柄,而是使用matplotlib的特性来处理这个问题,即在绘图时是否包含标签。我该如何实现这一点?

dfddblmv

dfddblmv1#

以下是一个可能的解决方案:您可以利用底缐不会产生图例项目的事实。因此,将第一个标签以外的所有标签设定为"_",会抑制这些项目出现在图例中。

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()

pexxcrt2

pexxcrt22#

以下是使用现有图例句柄和标签的一种方法。您首先获得三个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')

替代方法,其中图例取自特定地块(一组线)--在本例中为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')

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

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

ax.legend()

vuktfyat

vuktfyat3#

也许不太优雅,但最简单和最直接的方法是使用一对元素在您指定的'标签'您想要的第二个绘图!

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, color='k')
ax.plot(x[0].T, y[0].T, label='bar', color='k')

ax.legend()

plt.show()

相关问题