理解`pylab.legend`的默认用法

时间:2013-04-09 18:40:36

标签: python matplotlib legend

我正在使用pylab生成此图像: Image with messed up legend

传说不是我想要的。点表示实际数据点,线条由polyfit制成。我想这个图例包含十个条目,每个颜色的线条和点合并在一起,或只包含十个点线。

相关的代码:

for i in range(start, start + size*chunks):
    colorVal = scalarMap.to_rgba(values[i])
    slc1, slc2 = start + i*size, start + (i+1)*size
    mylegend.append(" = ".join([self.dtypes[v1],
                              "%.2f" %data[v1, slc1]]))
    jx = data[x, slc1:slc2]
    jy = data[y, slc1:slc2]
    p  = np.polyfit(jx, jy, deg = 2)
    lx = np.linspace(jx[0], jx[-1], 1000)
    ly = p[0]*lx**2 + p[1]*lx + p[2]
    pl.plot(jx, jy, "o", color = colorVal)
    pl.plot(lx, ly, color = colorVal)
pl.xlabel(self.dtypes[x])
pl.ylabel(self.dtypes[y])
pl.title(title)
pl.axis(axis)
pl.legend(my_legend, loc = "upper left", shadow = True)
pl.grid("on")
pl.show()

我意识到错误是什么:我在my_legend列表中添加了10个点,然后pylab的图例功能从中读取,直到列表结束。因此,只有一半人成功。但是,我不知道如何解决它。有没有办法让图例函数只为循环的每次迭代注册一个条目?

另外,我想按相反顺序列出的要点。我试过了

pl.legend(my_legend[::-1])

但这没效果。

对这两个问题的任何想法?

1 个答案:

答案 0 :(得分:2)

一旦您了解pylab.legend是如何运作的,pylab.legend(my_legend, ...)的行为就会被占用。当您调用for i in range(start, start + size*chunks): [...] label = " = ".join([self.dtypes[v1], "%.2f" %data[v1, slc1]]) [...] pl.plot(jx, jy, "o", color = colorVal, label=label) pl.plot(lx, ly, color = colorVal) [...] pl.legend(loc = "upper left", shadow = True) 时,标签的字符串列表与绘制的前10行相关联。你的方式,前10行是前5个循环中添加的行。 要显示点,你可以这样做:

label=label

如果您想要线条的图例,只需将mylines放入另一个绘图命令中。

另一种方法是创建一个mylegend列表(类似于pl.legend(mylines, mylegend, ...))并仅附加一个plot命令,然后调用{{1}}