我正在 for 循环中绘制一系列图:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1, 100)
y = np.sin(x)
for i in range(1,6):
plt.plot(x, i*y, label=f't= {i}')
plt.plot(x[::2], i*y[::2], marker='o', linestyle='None', markersize=2,label=f'a= {i}')
plt.legend(loc='best', ncol=2)
Run Code Online (Sandbox Code Playgroud)
输出是:
我希望传说是:
如何访问图例并使其如上图所示?
如果您不为 提供额外的参数legend,它会将艺术家按照创建的顺序放入图例中,并按容器对它们进行排序(但在这里您并不关心,因为您只有属于 的艺术家ax.lines)。您应该手动对句柄进行排序以获得您想要的结果,然后将其提供给legend.
这很简单:
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = np.linspace(0,1, 100)
y = np.sin(x)
for i in range(1,6):
ax.plot(x, i*y, label=f't= {i}')
ax.plot(x[::2], i*y[::2], marker='o', linestyle='None', markersize=2,label=f'a= {i}')
handles = [line for x in ("t", "a") for line in ax.lines if line.get_label().startswith(x)]
# handles = [line for m in ("None", "o") for line in ax.lines if line.get_marker() == m]
ax.legend(handles=handles, loc='best', ncol=2)
Run Code Online (Sandbox Code Playgroud)
请注意,我们有多种解决方案来订购艺术家。在这里,我们可以遵循线条标签中的模式,或者简单地遵循它们的标记类型。
对我来说,这似乎是一个干净且面向对象的解决方案。对于修改代码少得多的解决方案,您可以这样做:
for i in range(1,6):
plt.plot(x, i*y, label=f't= {i}')
for i in range(1,6):
plt.plot(x[::2], i*y[::2], marker='o', linestyle='None', markersize=2,label=f'a= {i}')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
533 次 |
| 最近记录: |