Matplotlib (pyplot) savefig выводит пустое изображение

176

Я пытаюсь сохранить графики, которые я делаю, используя 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)

tylerthemiler
источник

Ответы:

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 пуст, потому что он сохраняет новую фигуру, на которую ничего не было нанесено.

Yann
источник
Забыл удалить часть T0 ... это было прокомментировано ранее.
Tylerthemiler
7
Особый случай этого происходит в jupyterзаписных книжках с %matplotlib inlineвключенным: savefigвызов должен быть в той же ячейке, что и метод создания графика.
Иосиф
3
Интересно увидеть, plt.show()генерирует новое изображение. Действительно, это решило проблему.
user989762
Интересно, что если вы введете plt.plot, plt.savefig, plt.show по одному в терминале, таком как spyder, это не покажет рис. Поместите все команды в скрипт и запустите за один раз. Это показывает сюжет.
CKM
Мое решение plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
EduardoUstarez
110

plt.show() должен прийти после plt.savefig()

Пояснение: plt.show()очищает все, так что все, что потом произойдет на новой пустой фигуре

JAG2024
источник
4
Это единственный способ, который помог мне.
Yauhen
14
plt.show()очищает все это, так что все, что потом произойдет на новой пустой фигуре.
luckydonald
2
Это то, что спасло мою задницу! : D Я действительно не понимаю, почему нужно было реализовать это таким образом, чтобы сюжет стирал все при показе изображения. Жаль ...
Ромео Сьерра
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()

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

Jayhello
источник