是否可以在matplotlib中添加字符串作为图例项

Osm*_*hop 28 python matplotlib legend legend-properties pandas

我在matplotlib中生成一些图,并希望为某些数据添加解释性文本.我希望在我的图例中有一个字符串作为'0-10'项目上方的单独图例项目.有谁知道是否有可能这样做?

在此输入图像描述

这是我的传奇代码:
ax.legend(['0-10','10-100','100-500','500+'],loc='best')

Cle*_*H. 43

替代解决方案,有点脏但很快.

import pylab as plt

X = range(50)
Y = range(50)

plt.plot(X, Y, label="Very straight line")
# Create empty plot with blank marker containing the extra label
plt.plot([], [], ' ', label="Extra label on the legend")


plt.legend()

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 聪明的解决方案.我比其他人更喜欢这个.荣誉 (4认同)

Jef*_*ner 37

当然.ax.legend()有一个两个参数形式,接受一个对象列表(句柄)和一个字符串列表(标签).使用虚拟对象(也称为"代理艺术家")来获取额外的字符串.我选择了一个matplotlib.patches.Rectangle没有填充和下面的0 linewdith,但你可以使用任何支持的艺术家.

例如,假设你有4个bar对象(因为你没有发布用于生成图形的代码,我无法完全重现它).

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
fig = plt.figure()
ax = fig.add_subplot(111)
bar_0_10 = ax.bar(np.arange(0,10), np.arange(1,11), color="k")
bar_10_100 = ax.bar(np.arange(0,10), np.arange(30,40), bottom=np.arange(1,11), color="g")
# create blank rectangle
extra = Rectangle((0, 0), 1, 1, fc="w", fill=False, edgecolor='none', linewidth=0)
ax.legend([extra, bar_0_10, bar_10_100], ("My explanatory text", "0-10", "10-100"))
plt.show()
Run Code Online (Sandbox Code Playgroud)

示例输出

  • 这实际上是一件很平常的事情.我打赌你做过类似的事情:`line = ax.plot(x,y)`.问题是`plot`会返回*list*行,所以你需要找到真正的艺术家.你可以做`line = ax.plot(x,y)[0]`或做`line,= ax.plot(x,y)`,它利用参数解包. (4认同)
  • 谢谢,这有效。我还想使用不同的图来执行此操作,该图在条形顶部绘制了一条线,但出现以下错误 c:\Python27\lib\site-packages\matplotlib\legend.py:628: UserWarning:图例不支持 [<matplotlib.lines.Line2D object at 0x0A7027B0>] 请改用代理艺术家。 (2认同)

小智 18

我找到了另一种方法来做到这一点,只需尝试:

plt.legend(title='abc xyz')
Run Code Online (Sandbox Code Playgroud)

我在工作中用过这个!

  • 正如目前所写的,您的答案尚不清楚。请[编辑]添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (5认同)
  • 这应该被标记为正确答案;这正是OP想要的,而且一点也不hacky。 (2认同)