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)

tylerthemiler
la source

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é.

Yann
la source
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

JAG2024
la source
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()
Behzad Sezari
la source
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()
Krish
la source
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

Jayhello
la source