plotfile не использует правильные оси, проблема аннотации - PullRequest
0 голосов
/ 28 января 2019

Я столкнулся со странным поведением при использовании функции matplotlibs plotfile.

Я хотел аннотировать участок файла, text.txt, который содержит:

x
0
1
1
2
3

, используяследующий код:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
annot = ax.annotate("Test", xy=(1,1))
plt.plotfile('test.txt', newfig = False)
plt.show()

Это дает мне следующий, странный вид графика с метками осей повсюду и аннотацией в неправильном (относительно моих данных) месте:

plt.subplots()

Однако, когда я использую

fig = plt.figure()
ax = fig.add_subplot(111)

вместо

fig, ax = plt.subplots()

, я получаю график, который хочу и предупреждение об износе: plt.figure()

MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.

Так что я думаю, что в одном случае plt.plotfile использует предыдущие оси, которые также использовались для создания аннотации,но я получаю предупреждение, в то время как в другом случае он создает новый экземпляр осей (так что без предупреждения), но также создает странный график с двумя наложенными осями.

Теперь я хотел бы знать две вещи:

  1. Почему имеет значение, как я объявляю свою фигуру и оси, когда, согласно этот ответ они должны быть взаимозаменяемыми?
  2. Как мне указать plotfile, на какие оси наносить график и избежать предупреждения амортизации, а также наложить его на правильные оси?Я предполагаю, что это не просто проблема с графическими файлами, а со всеми типами графиков, которые не вызываются напрямую по осям (в отличие, например, ax.scatter, ax.plot, ... я не могу вызвать ax.plotfile)

1 Ответ

0 голосов
/ 28 января 2019

plotfile - это удобная функция для непосредственного построения файла.Это означает, что предполагается, что никаких предыдущих осей не существует, и создает новую .Это может привести к забавному поведению, если действительно уже есть оси.Вы все равно можете использовать его по назначению, однако,

import matplotlib.pyplot as plt

plt.plotfile('test.txt')
annot = plt.annotate("Test", xy=(1,1))
plt.show()

Однако, как указано в документации ,

Примечание: plotfile предназначен для удобствадля быстрого вывода данных из плоских файлов;он не предназначен в качестве альтернативы общему графику с pyplot или matplotlib.

Поэтому, если вы хотите внести существенные изменения в фигуру или оси, лучше не полагаться на plotfile.Подобная функциональность может быть достигнута с помощью

import numpy as np
import matplotlib.pyplot as plt

plt.plot(np.loadtxt('test.txt', skiprows=1))
annot = plt.annotate("Test", xy=(1,1))
plt.show()

, который полностью совместим с объектно-ориентированным подходом,

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
annot = ax.annotate("Test", xy=(1,1))
ax.plot(np.loadtxt('test.txt', skiprows=1))

plt.show()
...