子图上的Plot和Scatter图例

时间:2015-03-18 13:43:12

标签: python matplotlib legend subplot

我的代码如下所示:

pos = 0
x = [1,2,3]
y = [2,3,4]
y2 = [3,5,3]
fig, axs = plt.subplots(1,2)
for pos in [0,1]:
    h1 = axs[pos].scatter(x,y,c='black',label='scttr')
    h2 = axs[pos].plot(x,y2,c='red',label='line')
    axs[pos].legend([h1, h2])
plt.show()

生成没有文本的正确图例(它在句柄中显示对象名称)。如果我尝试为标签生成一些文本:

pos = 0
x = [1,2,3]
y = [2,3,4]
y2 = [3,5,3]
fig, axs = plt.subplots(1,2)
for pos in [0,1]:
    h1 = axs[pos].scatter(x,y,c='black',label='scttr')
    h2 = axs[pos].plot(x,y2,c='red',label='line')
    axs[pos].legend([h1, h2],['smtng', 'smtng2')
plt.show()

代码与以下内容崩溃:

  

可以使用代理艺术家。看到:   http://matplotlib.org/users/legend_guide.html#using-proxy-artist
  "使用代理艺术家&#34#; .format(orig_handle))

我真的不明白proxy artists是什么以及为什么我需要一个基本的东西。

2 个答案:

答案 0 :(得分:2)

问题是您无法将Line个对象直接传递给legend来电。相反,你可以做的是创建一些不同的对象(known as proxy artists)来填补空白,可以这么说。

以下是散点图和线图的两个代理对象scatter_proxyline_proxy。您可以使用matplotlib.lines.Line2D创建两者,但散点图中的一行有一条白线(因此无法有效看到)并添加了标记。我意识到线条颜色是白色有点黑客,但这是我能找到的最佳方式。

import matplotlib.pyplot as plt
import matplotlib.lines as mlines

pos = 0
x = [1,2,3]
y = [2,3,4]
y2 = [3,5,3]

fig, axs = plt.subplots(1,2)

scatter_color = 'black'
line_color='red'

for pos in [0,1]:
    h1 = axs[pos].scatter(x, y, c=scatter_color, label='scttr')
    h2 = axs[pos].plot(x, y2, c=line_color, label='line')

    scatter_proxy = mlines.Line2D([], [], color='white', marker='o', markerfacecolor=scatter_color)
    line_proxy = mlines.Line2D([], [], color=line_color)

    axs[pos].legend([scatter_proxy, line_proxy],['smtng', 'smtng2'])

plt.show()

enter image description here

答案 1 :(得分:1)

至少在您的简单示例中,如果您不将任何句柄传递给legend,则会更简单:

...
axs[pos].legend()
...

结果:

enter image description here

您可以像这样覆盖标签:

...
axs[pos].legend(['smtng', 'smtng2'])
...

结果: enter image description here

如果你想使用手柄,你可以。但是,您必须考虑plot返回Line对象列表。因此,您必须将其传递给legend,如下所示:

...
axs[pos].legend([h1, h2[0]],['smtng', 'smtng2'])
...

如果您想在图例中添加一些不存在的图例,或者如果您想要(由于某种原因)使图例中的图片与图表中的图片不同,您只需要使用代理艺术家。