Matplotlib (pyplot) savefig genera una imagen en blanco


176

Estoy tratando de guardar tramas que hago usando matplotlib; sin embargo, las imágenes se guardan en blanco.

Aquí está mi código:

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)

Y tessstttyyy.png está en blanco (también probado con .jpg)

Respuestas:


286

Primero, ¿qué pasa cuando T0 is not None? Lo probaría, luego ajustaría los valores a los que paso plt.subplot(); quizás pruebe los valores 131, 132 y 133, o valores que dependen de si T0existen o no .

En segundo lugar, después de que plt.show()se llama, se crea una nueva figura. Para lidiar con esto, puedes

  1. Llama plt.savefig('tessstttyyy.png', dpi=100)antes de llamarplt.show()

  2. Guarde la cifra que tiene delante show()llamando plt.gcf()a "obtener la cifra actual", luego puede llamar savefig()a este Figureobjeto en cualquier momento.

Por ejemplo:

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

En su código, 'tesssttyyy.png' está en blanco porque está guardando la nueva figura, a la que no se ha trazado nada.


Olvidé eliminar la parte T0 ... se comentó anteriormente.
— tylerthemiler

77
Un caso especial de esto ocurre en los jupytercuadernos con %matplotlib inlinehabilitado: la savefigllamada debe estar en la misma celda que el método de creación del diagrama.
— ijoseph

3
Interesante ver plt.show()genera una nueva imagen. De hecho, esto resolvió el problema.
— user989762

Curiosamente, si escribe plt.plot, plt.savefig, plt.show uno por uno en un terminal como spyder, no mostrará fig. Ponga todos los comandos en un script y ejecútelos de una vez. Muestra la trama.
— CKM

Mi solución plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
— EduardoUstarez

110

plt.show() debería venir después plt.savefig()

Explicación: plt.show()borra todo el asunto, por lo que cualquier cosa posterior sucederá en una nueva figura vacía


44
Esa es la única forma que me ayudó.
— Yauhen

14
plt.show()borra todo, por lo que cualquier cosa posterior sucederá en una nueva figura vacía.
— luckydonald

2
¡Esto es lo que me salvó el trasero! : DI realmente no entiendo por qué uno tuvo que implementarlo de manera que la trama borre todo al mostrar la imagen. Lástima ...
— Romeo Sierra

13

cambiar el orden de las funciones me solucionó el problema :

  • primero guardar la trama
  • luego muestra la trama

de la siguiente manera:

plt.savefig('heatmap.png')

plt.show()

2

Llamar a savefig antes de show () funcionó para mí.

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

déjenme dar un ejemplo más detallado:

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()

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.