如何通过手动限制设置协调 Matplotlib 散点图中的点注释?

How to conciliate dots annotation in Matplotlib scatter plot with manual limit setting?

我正在尝试通过手动限制设置协调 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]),这确实没有意义。

有解决这个问题的方法吗?

谢谢

我无法复制第一个问题(在版本 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() returns [xmin, xmax, ymin, ymax],而不是 axes 实例(fig, ax = plt.subplots(figsize=(20,10) returns axes 实例至 ax).

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

两种解决方案:

  1. annotation_clipclip_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}
    

    在开始创建内容之前的单元格中。 (这见于