Matplotlib (pyplot) savefig выводит пустое изображение
Я пытаюсь сохранить графики, которые я делаю, используя 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)
Ответы
Ответ 1
Во-первых, что происходит, когда T0 is not None
? Я бы это испытал, тогда я бы настроил значения, которые я передаю, на plt.subplot()
; возможно, попробуйте значения 131, 132 и 133 или значения, зависящие от того, существует или нет T0
.
Во-вторых, после вызова plt.show()
создается новая фигура. Чтобы справиться с этим, вы можете
-
Вызовите plt.savefig('tessstttyyy.png', dpi=100)
, прежде чем вы вызовете plt.show()
-
Сохраните фигуру перед show()
, вызвав plt.gcf()
для "получения текущей цифры", тогда вы можете вызвать savefig()
на этом объекте Figure
в любое время.
Например:
fig1 = plt.gcf()
plt.show()
plt.draw()
fig1.savefig('tessstttyyy.png', dpi=100)
В вашем коде "tesssttyyy.png" пуст, потому что он сохраняет новую фигуру, на которую ничего не было построено.
Ответ 2
plt.show()
должен появиться после plt.savefig()
Ответ 3
позвольте мне привести более подробный пример:
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()
![enter image description here]()