【问题标题】:Matplotlib - Hide error bars' label & points in legendMatplotlib - 在图例中隐藏误差线的标签和点
【发布时间】:2013-06-07 17:04:00
【问题描述】:

这是我的意思的一个例子:

import matplotlib.pyplot as plt

xdata = [5, 10, 15, 20, 25, 30, 35, 40]
ydata = [1, 3, 5, 7, 9, 11, 13, 15]
yerr_dat = 0.5

plt.figure()

plt.plot(xdata, ydata, 'go--', label='Data', zorder=1)

plt.errorbar(xdata, ydata, yerr = yerr_dat, zorder=2, fmt='ko')

plt.legend()

plt.show()

它将绘制这个:

我不想要图例中的错误点和None标签,我怎样才能把它们去掉?

我在其版本 1.0.1.1190 中使用 Canopy


编辑

使用此代码尝试乔的解决方案后:

import matplotlib.pyplot as plt

xdata = [5, 10, 15, 20, 25, 30, 35, 40]
ydata = [1, 3, 5, 7, 9, 11, 13, 15]
yerr_dat = 0.5
value = 20

plt.figure()

scatt = plt.plot(xdata, ydata, 'go--', label='Data', zorder=1)
hline = plt.hlines(y=5, xmin=0, xmax=40)
vline = plt.vlines(x=20, ymin=0, ymax=15)

plt.errorbar(xdata, ydata, yerr = yerr_dat, zorder=2, fmt='ko')

plt.legend([scatt, vline, hline], ['Data', 'Horiz line', 'Verti line = %d' % value], fontsize=12)

plt.show()

我收到此警告:

/home/gabriel/Canopy/appdata/canopy-1.0.0.1160.rh5-x86/lib/python2.7/site-packages/matplotlib/legend.py:628: UserWarning: Legend does not support [<matplotlib.lines.Line2D object at 0xa09a28c>]
Use proxy artist instead.

http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist

  (str(orig_handle),))

这个输出:

第一个标签由于某种原因没有显示。想法?


编辑 2

原来我在该行中缺少一个逗号:

scatt, = plt.plot(xdata, ydata, 'go--', label='Data', zorder=1)

添加它后,一切都像魅力一样。谢谢乔!

【问题讨论】:

  • 不管怎样,我无法用 Python 2.7.5、matplotlib 1.2.1 和 IPython 0.13 复制它。尝试更新你的 matplotlib。
  • @nordev - Matplotlib 的图例行为在1.11.2 中发生了变化(我不记得是哪个副手了)。在此之前,无论是否明确指定了label,所有绘制的艺术家都将显示在图例中。无论如何,更新 mpl 会修复它,但这是最近更改的设计决策,而不是错误。
  • 根据 Canopy 自己的站点 (enthought.com/products/canopy/package-index) 它使用 matplotlib v 1.2.0,所以这可能已经从 1.2.1 开始修复。
  • @Gabriel - 嗯......我以为它比那更早改变了。无论如何,看起来那是它被改变的时候。我很惊讶它是在一个点发布中溜进来的。一定被认为是一个错误,但它肯定存在于早期版本中(尽管它会显示“错误栏 1”而不是“无”)。不久前有一个 Legend 类的重构。可能与此有关。
  • @Gabriel - 你少了一个逗号。应该是scat, = plt.plot...plot 总是返回一个元组,即使只有一个艺术家。 (这归功于plot 的重载功能使其表现得像matlab 的plot。)这是一个常见的“陷阱”。

标签: python matplotlib enthought


【解决方案1】:

在较新版本的 matplotlib 上,您需要的是默认行为。只有具有明确指定标签的艺术家才会出现在图例中。

但是,控制图例中显示的内容很容易。只需传入您要标记的艺术家即可:

import matplotlib.pyplot as plt

xdata = [5, 10, 15, 20, 25, 30, 35, 40]
ydata = [1, 3, 5, 7, 9, 11, 13, 15]
yerr_dat = 0.5

plt.figure()

dens = plt.plot(xdata, ydata, 'go--', zorder=1)

plt.errorbar(xdata, ydata, yerr = yerr_dat, zorder=2, fmt='ko')

plt.legend(dens, ['Density Profile'])

plt.show()

或者,您可以为 errorbar 绘图指定 label='_nolegend_',但我不知道 matplotlib 的哪些版本支持它,并且传入艺术家和标签的明确列表将适用于任何版本。

如果您想添加其他艺术家:

import matplotlib.pyplot as plt

xdata = [5, 10, 15, 20, 25, 30, 35, 40]
ydata = [1, 3, 5, 7, 9, 11, 13, 15]
yerr_dat = 0.5

plt.figure()

# Note the comma! We're unpacking the tuple that `plot` returns...
dens, = plt.plot(xdata, ydata, 'go--', zorder=1)
hline = plt.axhline(5)

plt.errorbar(xdata, ydata, yerr = yerr_dat, zorder=2, fmt='ko')

plt.legend([dens, hline], ['Density Profile', 'Ceiling'], loc='upper left')

plt.show()

【讨论】:

  • 如果我要显示多个图例,我该怎么办?假设我也在绘制hline 并且我也想要一个图例?很抱歉延长了这个问题。
  • 只需将它添加到您传入的艺术家列表中。正如我所写的示例,dens 实际上是一个带有单个 Line2D 艺术家的元组(plot 总是返回一个元组)。 legend 需要一系列艺术家和一系列标签。我将在稍后更新我的示例以显示这一点。
  • 我在尝试此操作时收到警告:UserWarning: Legend does not support [&lt;matplotlib.lines.Line2D object at 0xa09a28c&gt;] Use proxy artist instead. 我将使用发出此警告的确切代码更新问题。
  • 糟糕,我刚刚注意到那个鬼鬼祟祟的逗号!
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
相关资源
最近更新 更多