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.