【问题标题】:error of adding a legend for a plot in Python 3.2 Matplotlib在 Python 3.2 Matplotlib 中为绘图添加图例的错误
【发布时间】:2015-02-15 00:14:35
【问题描述】:

我需要为 Python 3.2 Matplotlib 中的绘图添加图例。

但是,我添加“black_dash”后,无法显示图例

我的代码:

   blue_line, = plt.plot([0, 1], [-3, -3], color='b', linestyle='-',    linewidth=1)

   black_dash, = plt.plot([0, 1], [-7, -7], color='k', linestyle='--', linewidth=1)

   plt.legend([blue_line, black_dash] , ["boundary of reg_zip", "lat/lon line"] , loc='upper center', bbox_to_anchor=(0.5, -0.5), \
           fancybox=True, shadow=True, ncol=5, fontsize=11)

图例应该有两行及其解释。

更新:

我需要在图例中画一个实心黑色圆圈,但我得到了错误:

 File "C:\Python32\lib\site-packages\matplotlib\backends\backend_agg.py", line 146, in draw_path

self._renderer.draw_path(gc, path, transform, rgbFace)

**TypeError: float() argument must be a string or a number**

我的代码:

plt.plot([0, 1], [-3, -3], "ro", ms=10, mfc="k", mew=2, mec="k", label="boundary of reg_zip")

谢谢

【问题讨论】:

  • 编辑中的代码没有错误。提供一个演示错误的最小示例。在所有这些麻烦之后,赞成或接受的答案也会很好......

标签: python python-3.x matplotlib windows-7 matplotlib-basemap


【解决方案1】:

这应该是可行的

plt.plot([0, 1], [-3, -3], color='b', linestyle='-', linewidth=1, label="blue line")
plt.plot([0, 1], [-7, -7], color='k', linestyle='--', linewidth=1, label="black dash")
plt.legend(loc='upper center', fancybox=True, shadow=True, ncol=5, fontsize=11)
plt.show()

所以基本上,给线条添加标签,而不是图例,图例需要按名称识别对象,如果你不标记它们就不能(它还会自动更改图例中的线条以适应当前外观)。

还要检查您的 y 轴范围。它经常尝试自动调整它们的大小,并且使用水平线它经常失败并将它们放置在图形的最边缘。他们在那里,你只是看不到他们!

编辑 1:

因为我看到你对此感到困惑。我做了几个情节。第一个是文本(通常是任何其他框)。其次是传说中的位置由loc 关键字确定。第三个是由bbox_to_anchor决定的传奇人物。注意文本框与图例框不对应。主要原因是bbox_to_anchor 锚定了图例的右上角,而文本锚定了框的左下角。

还要注意loc 关键字并不像bbox_to_anchor 那样依赖于图形缩放。要摆脱这种讨厌的习惯,您必须通过做来声明bbox_to_anchor的转换

plt.legend(bbox_to_anchor=(1, 1),
       bbox_transform=plt.gcf().transFigure)

legend manual 中所述。

此外,如果您的图例甚至不适合交互式绘图屏幕中的灰色绘图区域,您必须选择“配置子图”图标,并更改值,直到您可以再次找到您的图例。

同样重要的是要认识到,将 loc 关键字添加到带有 bbox_to_anchor 的图例中根本没有任何区别。 bbox_to_anchor将践踏您提供图例的所有其他位置。

现在,如果您不愿意阅读手册并更深入地研究 matplotlib 实现,我不是说您不应该真正干预bbox_to_anchor 选项,但我建议避免使用@987654337 @ 在所有情况下,除非您的图表过于拥挤,您必须将其放在外面。 (在这种情况下是考虑图形设计的好时机?)

最后,这是从上方绘制图形的代码。

import matplotlib.pyplot as plt

plt.plot((0,0), (1,1), label="legend")

legends = []
for i in range(0, 11):
    legends.append(plt.legend([str(i)], loc=i))

for legend in legends:
    plt.gca().add_artist(legend)
#legends with loc=5 and 7 overlap
plt.show()


plt.plot((0,1), (0,1), label="legend")

legend1 = plt.legend(["0,0"], bbox_to_anchor=(0, 0))
legend3 = plt.legend(["1,1"], bbox_to_anchor=(1, 1))
legend2 = plt.legend(["0.5,0.5"], bbox_to_anchor=(0.5, 0.5))
legend4 = plt.legend(["0.5,0"], bbox_to_anchor=(0.5, 0))
legend6 = plt.legend(["0,0.5"], bbox_to_anchor=(0, 0.5))
legend5 = plt.legend(["1,0.5"], bbox_to_anchor=(1, 0.5))
legend7 = plt.legend(["0.5,1"], bbox_to_anchor=(0.5, 1))
legend8 = plt.legend(["1,0"], bbox_to_anchor=(1, 0))
legend9 = plt.legend(["0,1"], bbox_to_anchor=(0, 1))

plt.gca().add_artist(legend1)
plt.gca().add_artist(legend2)
plt.gca().add_artist(legend3)
plt.gca().add_artist(legend4)
plt.gca().add_artist(legend5)
plt.gca().add_artist(legend6)
plt.gca().add_artist(legend7)
plt.gca().add_artist(legend8)
plt.gca().add_artist(legend9)

plt.show()

【讨论】:

  • 谢谢,但它不起作用。仍然没有传说。
  • 我的错,你的 bbox_to_anchor 也被掀了。你为什么不直接删除它?就像我说的那样,用线条,“它们就在那里,你只是看不到它们!”
  • @user3601704 这个编辑是否使它更清晰?除此之外,剩下的唯一一件事就是让我给你写代码。我不会:P
  • 谢谢,我更喜欢位于图底部而不是图内部的图例,因为我的图是带有邮政编码多边形的地图。我不希望图例文本框覆盖多边形。
  • 我使用了 "legend4 = plt.legend(["0.5,0"], bbox_to_anchor=(0.5, 0))", ,它显示出来但覆盖了我的轴标签和刻度,那么,如何要将它向下移动,我尝试了 bbox_to_anchor=(0.5, -0.5),图例框消失了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2014-12-02
  • 1970-01-01
相关资源
最近更新 更多