我的代码如下所示:
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是什么以及为什么我需要一个基本的东西。
答案 0 :(得分:2)
问题是您无法将Line
个对象直接传递给legend
来电。相反,你可以做的是创建一些不同的对象(known as proxy artists)来填补空白,可以这么说。
以下是散点图和线图的两个代理对象scatter_proxy
和line_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()
答案 1 :(得分:1)
至少在您的简单示例中,如果您不将任何句柄传递给legend
,则会更简单:
...
axs[pos].legend()
...
结果:
您可以像这样覆盖标签:
...
axs[pos].legend(['smtng', 'smtng2'])
...
结果:
如果你想使用手柄,你可以。但是,您必须考虑plot
返回Line对象列表。因此,您必须将其传递给legend
,如下所示:
...
axs[pos].legend([h1, h2[0]],['smtng', 'smtng2'])
...
如果您想在图例中添加一些不存在的图例,或者如果您想要(由于某种原因)使图例中的图片与图表中的图片不同,您只需要使用代理艺术家。