matplotlib 并排放置图例

8tntrjer  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(188)

我在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)

输出为:

我希望图例为:

如何访问图例并使其如上图所示?

bis0qfac

bis0qfac1#

如果你不给予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)

请注意,我们有几种排序艺术家的解决方案。在这里,我们可以遵循线标签中的模式,或者只是它们的标记类型。

在我看来,这是一个干净的面向对象的解决方案。对于一个修改代码更少的解决方案,您可以这样做:

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}')

相关问题