【问题标题】:understanding default usage of `pylab.legend`了解 `pylab.legend` 的默认用法
【发布时间】:2013-04-09 18:40:35
【问题描述】:

我正在使用 pylab 生成此图像:

传说不是我想要的。点代表实际数据点,线条由 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])

但这没有用。

对这两个问题有什么想法吗?

【问题讨论】:

  • 正如 Francesco 所指出的,matplotlib 完全按照您的要求进行。您应该更改标题以减少煽动性和更具描述性,以帮助未来的用户。
  • 嗯,是的,正如我所写,我确实明白错误是什么,只是不知道如何解决它。英语不是我的第一语言,我认为标题绝不是煽动性的,但如果它被认为是这样,我会改变它。 “如何过滤 pylab 的图例内容?”在您看来是一个更好的标题?

标签: python matplotlib legend


【解决方案1】:

pylab.legend 的行为在你了解它是如何工作的之后就被挪用了。当您调用pylab.legend(my_legend, ...) 时,标签的字符串列表与绘制的前10 行相关联。按照您的方式,前 10 行是前 5 个循环中添加的行。 要仅显示点,您可以这样做:

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)

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

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

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2022-10-24
    • 2015-05-02
    • 1970-01-01
    • 2011-06-21
    • 2019-08-16
    相关资源
    最近更新 更多