Почему Pyplot от Matplotlib не позволяет сохранить изображение после его показа? - PullRequest
0 голосов
/ 04 июля 2018

Если я поставлю pyplot.show() перед тем, как попытаться сохранить изображение, файл на самом деле не будет содержать изображение.

Сначала я думал, что это ошибка, но затем я переключил pyplot.show() и pyplot.savefig('foo5.png'), и это сработало.

Вот пример кода.

def plot(embeddings, labels):
  assert embeddings.shape[0] >= len(labels), 'More labels than embeddings'
  pyplot.figure(figsize=(20, 20))  # in inches
  for i, label in enumerate(labels):
    x, y = embeddings[i,:]
    pyplot.scatter(x, y)
    pyplot.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points',
                   ha='right', va='bottom')
  pyplot.savefig('foo4.png')
  pyplot.show()
  pyplot.savefig('foo5.png')

books = [bookDictionary[i] for i in range(1, num_points2+1)]
plot(two_d_embeddings, books)
print( os.listdir() )

foo4.png просто отлично, но foo5.png пусто.

1 Ответ

0 голосов
/ 04 июля 2018

Как вы сами узнали, используя pyplot, вам нужно сохранить цифру до того, как она станет show n.

Это действительно только для неинтерактивного режима (ioff), но это вариант по умолчанию и, вероятно, наиболее распространенный вариант использования.

Что происходит, когда вызывается pyplot.show(), показывается фигура и запускается цикл обработки событий, который принимает цикл четности Python. Следовательно, любая команда после pyplot.show() задерживается до закрытия фигуры. Это означает, что pyplot.savefig(), который следует после show, не выполняется, пока фигура не будет закрыта. Как только фигура закрыта, внутри конечного автомата pyplot больше нет фигуры для сохранения.

Вы можете, однако, сохранить конкретную фигуру, на случай, если это необходимо. Э.Г.

import matplotlib.pyplot as plt

plt.plot([1,2,3])
fig = plt.gcf()
plt.show()
fig.savefig("foo5.png")

Здесь мы вызываем метод savefig конкретной фигуры (в данном случае единственный присутствующий), для которого нам нужно получить дескриптор (fig) этой фигуры.

Обратите внимание, что в таких случаях, когда вам нужен точный контроль над тем, как работает matplotlib, всегда полезно не использовать pyplot, а полагаться в основном на объектно-ориентированный интерфейс. Следовательно,

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1,2,3])
plt.show()
fig.savefig("foo5.png")

будет более естественным способом сохранить фигуру после ее показа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...