Savefig genera una imagen en blanco

3 minutos de lectura

avatar de usuario de tylerthemiler
tylerthemiler

Estoy tratando de guardar parcelas 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 tesstttyyy.png está en blanco (también probado con .jpg)

En primer lugar, ¿qué sucede cuando T0 is not None? Probaría eso, luego ajustaría los valores que paso a plt.subplot(); tal vez pruebe los valores 131, 132 y 133, o valores que dependen de si o no T0 existe

En segundo lugar, después plt.show() se llama, se crea una nueva figura. Para hacer frente a esto, puede

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

  2. Guarde la figura antes que usted show() llamando plt.gcf() para “obtener la cifra actual”, entonces puede llamar savefig() en este Figure objeto 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, en la que no se ha trazado nada.

  • Olvidé quitar la parte T0… se comentó anteriormente.

    – tylerthemiler

    26 de enero de 2012 a las 1:18

  • Un caso especial de esto ocurre en jupyter cuadernos con %matplotlib inline habilitado: el savefig la llamada debe estar en la misma celda que el método de creación de gráficos.

    – José

    6 de enero de 2018 a las 1:31


  • interesante de ver plt.show() genera una nueva imagen. De hecho, esto resolvió el problema.

    – usuario989762

    15 de agosto de 2018 a las 8:21

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

    – CKM

    9 de octubre de 2018 a las 6:57

  • @CKM Hola. ¿Sabes por qué sucede esto? Estaba pensando que en realidad es un problema que causa funciones como plt.ylabel() cree una nueva figura en lugar de aplicarla a la actual (publicada aquí), y también guarde las figuras en blanco. Tracé una figura y la guardé en la misma línea (separada por ;) Y funcionó. ¿Es esto solo un problema con Spyder?

    – La velocista

    10 de julio de 2020 a las 14:20


Avatar de usuario de JAG2024
JAG2024

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

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

cambiar el orden de las funciones arregló el problema para mí:

  • primero Ahorrar la trama
  • entonces Espectáculo la trama

de la siguiente manera:

plt.savefig('heatmap.png')

plt.show()

Avatar de usuario de Krish
Krish

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

déjame darte 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í

¿Ha sido útil esta solución?