Matplotlib (pyplot) savefig renvoie une image vide


176

J'essaye de sauvegarder les parcelles que je crée en utilisant matplotlib; cependant, les images restent 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)

Réponses:


286

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

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

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

  2. Enregistrez la figure avant vous show()en appelant plt.gcf()"obtenir la figure actuelle", vous pouvez alors appeler savefig()cet Figureobjet à tout moment.

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 la nouvelle figure, sur laquelle rien n'a été tracé.


Oublié de supprimer la partie T0 ... il a été commenté précédemment.
— tylerthemiler

7
Un cas particulier de ceci se produit dans les jupyternotebooks avec %matplotlib inlineenabled: l' savefigappel doit être dans la même cellule que la méthode de création de tracé.
— ijoseph

3
Intéressant à voir plt.show()génère une nouvelle image. En effet, cela a résolu le problème.
— user989762

Fait intéressant, si vous tapez plt.plot, plt.savefig, plt.show un par un dans un terminal tel que spyder, la fig. Mettez toutes les commandes dans un script et exécutez-les en une seule fois. Il montre l'intrigue.
— CKM

Ma solution plt.show () plt.draw () fig.set_dpi (200) fig.savefig ('/ image.png')
— EduardoUstarez

110

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

Explication: plt.show()efface le tout, donc tout se passera ensuite sur une nouvelle figure vide


4
C'est le seul moyen qui m'a aidé.
— Yauhen

14
plt.show()efface le tout, donc tout se passera ensuite sur une nouvelle figure vide.
— luckydonald

2
C'est ce qui a sauvé mes fesses! : DI ne comprend vraiment pas pourquoi il fallait l'implémenter de manière à ce que l'intrigue efface tout en montrant l'image. Dommage ...
— Romeo Sierra

13

changer l'ordre des fonctions a résolu le problème pour moi:

  • Enregistrez d' abord le tracé
  • puis Montrez l'intrigue

comme suit:

plt.savefig('heatmap.png')

plt.show()

2

L'appel de savefig avant show () a fonctionné pour moi.

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

laissez-moi vous donner 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 __name__ == '__main__':
    test_draw()

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.