将图例并排放置

5 python matplotlib legend

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

输出是:

在此输入图像描述

我希望传说是:

在此输入图像描述

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

Gui*_*ute 5

如果您不为 提供额外的参数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)