2011-08-05 79 views
4

我在python中使用matplotlib库来生成发布质量的xy散点图。我遇到了关于图例中标记的问题。我正在绘制2个不同的xy-scatter系列;一个是形成曲线的一组xy点,另一个是单个xy点。Matplotlib图例:如何分配多个散点值

我希望图例显示3个标记为“曲线”,1个标记为单点。我知道如何更改图例标记的数量的唯一方法是在声明图例时使用“scatterpoints”参数。但是,该参数设置了图例中所有系列的标记数量,并且我不确定如何更改每个图例条目单独的

很遗憾,我无法将照片作为新用户发布,但希望此说明足够。 有没有办法使用matplotlib为每个图例条目分别设置散点值?

编辑:这里是链接显示图像与散点不同的值。

scatterpoints = 3:http://imgur.com/8ONAT

scatterpoints = 1:http://imgur.com/TFcYV

希望这使得问题有点更清晰。

+0

你要在三个“片段”分裂“曲线”,并使用不同的标记每个段?你想如何将标记分配给散点“曲线”的点? –

回答

4

你可以得到传说中的行,自己去改变它:

import numpy as np 
import pylab as pl 
x = np.linspace(0, 2*np.pi, 100) 
pl.plot(x, np.sin(x), "-x", label=u"sin") 
pl.plot(x, np.random.standard_normal(len(x)), 'o', label=u"rand") 
leg = pl.legend(numpoints=3) 
l = leg.legendHandles[1] 
l._legmarker.set_xdata(l._legmarker.get_xdata()[1:2]) 
l._legmarker.set_ydata(l._legmarker.get_ydata()[1:2]) 
##or 
#l._legmarker.set_markevery(3) 
pl.show() 

Legend.legendHandles是传说中的所有行的列表,以及该行的_legmarker属性标记。

您可以调用set_markevery(3)或set_xdata()& set_ydata()更改标记数。

enter image description here

+0

这个答案对我很好,谢谢。我将添加一个警告:对于由pyplot.plot()生成的Line2D集合存在_legmarker属性,但对于由pyplot.scatter()生成的RegularPolyCollection集合不存在。这在我的情况下是可以的,因为我只是将我需要绘制的单个点从plt.scatter()转换为plt.plot()。 –