Как согласовать аннотацию точек на диаграмме рассеяния Matplotlib с ручной настройкой лимита? - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь согласовать аннотацию точек на диаграмме рассеяния 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]))

Вот скриншот вывода (я получил окончательный график рассеяния в виде маленького прямоугольника, расположенного в левом углу большого белого прямоугольника:

Output

Я пробовал это также:

 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'

Ошибка возникает из-за того, что мой l oop пытается перебрать ax = plt.axis([-2,3,-2.5,5]), что на самом деле не имеет смысла.

Любое решение, чтобы преодолеть эту проблему?

Спасибо

Ответы [ 2 ]

4 голосов
/ 20 января 2020

Проблема возникает из-за особой оболочки текста, когда дело доходит до вырезки. Обычно вы можете захотеть показать текст вне осей. Поэтому аннотации и текст имеют аргумент annotation_clip. Однако это мешает опции bbox_inches="tight" при сохранении аннотаций, поскольку аннотации в этом случае все еще считаются частью макета, и, следовательно, фигура по-прежнему учитывает аннотации вне осей.

Два решения:

  1. Set annotation_clip и clip_on. Т.е. вы можете явно указать аннотацию для отсечения по осям:

    ax.annotate(txt, (x[i], y[i]), annotation_clip=True, clip_on=True)
    
  2. Установите bbox_inches на None. При использовании встроенного бэкэнда I Python вы можете запретить расширять фигуру с помощью

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

    в ячейке перед началом создания контента. (Это видно из этого ответа )

1 голос
/ 19 января 2020

Я не могу повторить первую проблему (пробовал в версиях 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).

...