繁体   English   中英

matplotlib 并排放置图例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM