Matplotlib (pyplot) savefig видає порожнє зображення


174

Я намагаюся зберегти сюжети, які я роблю, використовуючи matplotlib; проте зображення зберігаються порожніми.

Ось мій код:

plt.subplot(121)
plt.imshow(dataStack, cmap=mpl.cm.bone)

plt.subplot(122)
y = copy.deepcopy(tumorStack)
y = np.ma.masked_where(y == 0, y)

plt.imshow(dataStack, cmap=mpl.cm.bone)
plt.imshow(y, cmap=mpl.cm.jet_r, interpolation='nearest')

if T0 is not None:
    plt.subplot(123)
    plt.imshow(T0, cmap=mpl.cm.bone)

    #plt.subplot(124)
    #Autozoom

#else:
    #plt.subplot(124)
    #Autozoom

plt.show()
plt.draw()
plt.savefig('tessstttyyy.png', dpi=100)

І tessstttyyy.png порожній (також спробували .jpg)

Відповіді:


286

По-перше, що відбувається, коли T0 is not None? Я би перевірив це, тоді я би скорегував значення, які я передаю plt.subplot(); можливо спробуйте значення 131, 132 і 133, або значення, які залежать від того, T0існує чи ні .

По-друге, після plt.show()виклику створюється нова фігура. Справитися з цим можна

  1. Телефонуйте, plt.savefig('tessstttyyy.png', dpi=100)перш ніж дзвонитиplt.show()

  2. Збережіть фігуру перед собою show(), закликаючи plt.gcf()"отримати поточну фігуру", тоді ви можете зателефонувати savefig()на цей Figureоб'єкт у будь-який час.

Наприклад:

fig1 = plt.gcf()
plt.show()
plt.draw()
fig1.savefig('tessstttyyy.png', dpi=100)

У вашому коді 'tesssttyyy.png' порожній, оскільки він зберігає нову фігуру, до якої нічого не було намічено.


Забули видалити частину T0 ... це було прокоментовано раніше.
tylerthemiler

7
Особливий випадок цього відбувається в jupyterноутбуках з %matplotlib inlineувімкненим: savefigвиклик повинен знаходитися в тій же комірці, що і метод створення сюжету.
ijoseph

3
Цікаве бачення plt.show()генерує новий образ. Дійсно, це вирішило питання.
user989762

Цікаво, що якщо ви введете plt.plot, plt.savefig, plt.show один за одним у терміналі, такому як шпидер, він не відображатиме фіг. Покладіть всі команди в сценарій і запустіть одним ходом. На ньому зображено сюжет.
CKM

Моє рішення plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
EduardoUstarez

110

plt.show() повинні прийти після plt.savefig()

Пояснення: plt.show()все це очищає, тож що-небудь після цього стане на новій порожній фігурі


4
Це єдиний спосіб, який мені допоміг.
Яухен

14
plt.show()все це очищає, тож що-небудь потім станеться на новій порожній фігурі.
luckydonald

2
Це те, що врятувало мою недопалку! : DI насправді не розуміє, чому треба було реалізувати це таким чином, що сюжет стирає все після показу зображення. Шкода ...
Ромео Сьєрра

13

змінити порядок функцій, виправлену для мене проблемою :

  • спочатку Збережіть сюжет
  • потім покажіть сюжет

наступним чином:

plt.savefig('heatmap.png')

plt.show()

2

Виклик savefig перед show () працював на мене.

fig ,ax = plt.subplots(figsize = (4,4))
sns.barplot(x='sex', y='tip', color='g', ax=ax,data=tips)
sns.barplot(x='sex', y='tip', color='b', ax=ax,data=tips)
ax.legend(['Male','Female'], facecolor='w')

plt.savefig('figure.png')
plt.show()

1

дозвольмо навести більш детальний приклад:

import numpy as np
import matplotlib.pyplot as plt


def draw_result(lst_iter, lst_loss, lst_acc, title):
    plt.plot(lst_iter, lst_loss, '-b', label='loss')
    plt.plot(lst_iter, lst_acc, '-r', label='accuracy')

    plt.xlabel("n iteration")
    plt.legend(loc='upper left')
    plt.title(title)
    plt.savefig(title+".png")  # should before plt.show method

    plt.show()


def test_draw():
    lst_iter = range(100)
    lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]
    # lst_loss = np.random.randn(1, 100).reshape((100, ))
    lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]
    # lst_acc = np.random.randn(1, 100).reshape((100, ))
    draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")


if __name__ == '__main__':
    test_draw()

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.