[英]matplotlib put legend side-by-side
我正在 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)
output 是:
我希望传说是:
如何访问图例并使其如上图所示?
如果您不向legend
提供额外的 arguments ,它将按照创建顺序将艺术家放入图例中,并按容器对它们进行排序(但在这里您不在乎,因为您只有属于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)
请注意,我们有几个解决方案来订购艺术家。 在这里,我们可以遵循线标签中的模式,或者只是它们的标记类型。
对我来说,这似乎是一个干净且面向对象的解决方案。 对于修改代码少得多的解决方案,您可以这样做:
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}')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.