web-dev-qa-db-fra.com

Matplotlib (pyplot) savefig génère une image vierge

J'essaie de sauvegarder des parcelles que je construis en utilisant matplotlib; Cependant, les images sont vierges.

Voici mon code:

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)

Et tessstttyyy.png est vide (également essayé avec .jpg)

91
tylerthemiler

Tout d’abord, que se passe-t-il quand T0 is not None? Je testerais cela, puis j'ajusterais les valeurs que je transmets à plt.subplot(); essayez peut-être les valeurs 131, 132 et 133, ou des valeurs qui dépendent de l'existence ou non de T0.

Deuxièmement, après l'appel de plt.show(), une nouvelle figure est créée. Pour faire face à cela, vous pouvez

  1. Appelez plt.savefig('tessstttyyy.png', dpi=100) avant d'appeler plt.show()

  2. Enregistrez la figure devant vous _show() en appelant plt.gcf() pour obtenir la valeur actuelle, vous pourrez appeler savefig() à tout moment sur cet objet Figure.

Par exemple: 

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

Dans votre code, "tesssttyyy.png" est vide car il enregistre le nouveau chiffre auquel rien n'a été tracé. 

164
Yann

plt.show() devrait venir après plt.savefig()

46
JAG2024

changer l'ordre des fonctions corrigé le problème pour moi:

  • premierEnregistrer l'intrigue
  • alorsAfficher l'intrigue

comme suit:

plt.savefig('heatmap.png')

plt.show()
0
Behzad Sezar

donnons un exemple plus détaillé:

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 __== '__main__':
    test_draw()

 enter image description here

0
Jayhello