【问题标题】:How to conciliate dots annotation in Matplotlib scatter plot with manual limit setting?如何通过手动限制设置协调 Matplotlib 散点图中的点注释?
【发布时间】:2020-05-05 09:33:08
【问题描述】:

我正在尝试使用手动限制设置来协调 Matplotlib 散点图中的点注释,但我收到错误消息或遇到设计问题。

这是我的代码:

fig, ax = plt.subplots(figsize = (20,10)) #manual limit setting
plt.axis([-2,3,-2.5,5])
plt.scatter(x, y)


for i, txt in enumerate(n):   #dot annotation   
    ax.annotate(txt, (x[i], y[i]))

这是输出的屏幕截图(我得到了最终的散点图,它是一个位于白色大矩形左角的小矩形:

我也试过这个:

 fig, ax = plt.subplots(figsize = (20,10))
    ax = plt.axis([-2,3,-2.5,5])
    plt.scatter(x, y)


for i, txt in enumerate(n):
    ax.annotate(txt, (x[i], y[i]))

当然,我收到了以下错误消息(即使图表正确显示,但每个对应点旁边没有标签)。

AttributeError: 'list' object has no attribute 'annotate'

出现错误是因为我的循环尝试遍历 ax = plt.axis([-2,3,-2.5,5]),这确实没有意义。

有什么办法可以解决这个问题吗?

谢谢

【问题讨论】:

  • 您使用的是哪个版本的 matplotlib?这个问题在 matplotlib 3.1.2 中是否仍然出现? (我认为它现在已经修复了,但如果没有,最好知道。)

标签: python matplotlib scatter-plot


【解决方案1】:

出现此问题的原因是在剪辑时文本的特殊大小写。通常您可能希望显示轴外的文本。因此注释和文本有一个annotation_clip 参数。但是,这会在保存注释时干扰bbox_inches="tight" 选项,因为注释仍然被视为布局的一部分,因此该图仍将轴外的注释考虑在内。

两种解决方案:

  1. 设置annotation_clip clip_on。 IE。您可以明确地告诉注释在轴上剪辑:

    ax.annotate(txt, (x[i], y[i]), annotation_clip=True, clip_on=True)
    
  2. bbox_inches 设置为None。使用 IPython 内联后端时,您可以告诉它不要通过

    %config InlineBackend.print_figure_kwargs = {'bbox_inches':None}
    

    在开始创建内容之前在一个单元格中。 (见this answer

【讨论】:

  • 所以问题中的大小不正确是由文本放置在轴外引起的?还是我误会了?
  • @WilliamMiller 正确。不幸的是,他们没有提供minimal reproducible example,所以需要稍微解释一下。重现使用,例如x = y = [-1,2,9] 并使用内联后端在 IPython 或 Jupyter 笔记本中运行代码。
  • 有趣,谢谢 - 另一个问题:你知道为什么文本没有出现在问题的图像中吗?为什么轴的上方和右侧只有空白?
  • @WilliamMiller 这些文本没有被绘制,但它们被考虑到了tightbbox计算。
【解决方案2】:

我无法复制第一个问题(在 2.2.3、3.1.1、3.1.2 版本中尝试过) - 我得到了 this(使用随机数据)。尝试升级您的 matplotlib 版本或使用

plt.savefig('/path/to/output/image.png')

将图形保存到磁盘而不是直接显示,看看问题是否仍然存在。

但是我可以解释错误

AttributeError: 'list' object has no attribute 'annotate'

这是因为plt.axis() 返回[xmin, xmax, ymin, ymax],而不是axes 实例(fig, ax = plt.subplots(figsize=(20,10)axes 实例返回到ax)。

【讨论】:

  • 我有最新版本(3.1.2)。它仍然以奇怪的设计显示图形,但是当我导出它时,它可以工作!谢谢
  • @alexnesov 没问题,如果这有助于解决问题,请不要忘记点击 accept - 这样问题就会被标记为供未来用户使用
  • 对不起,我忘了:)
  • @alexnesov 别担心
猜你喜欢
  • 2012-05-09
  • 2012-02-22
  • 2014-09-18
  • 1970-01-01
  • 2016-08-20
  • 2018-06-19
  • 2013-12-06
相关资源
最近更新 更多