140 votes

Enregistrer des tracés (AxesSubPlot) générés à partir de Python pandas avec la fonction savefig de matplotlib

Je suis en train d'utiliser pandas pour générer un graphique à partir d'une dataframe, que je voudrais enregistrer dans un fichier :

dtf = pd.DataFrame.from_records(d,columns=h)
fig = plt.figure()
ax = dtf2.plot()
ax = fig.add_subplot(ax)
fig.savefig('~/Documents/output.png')

Il semble que la dernière ligne, en utilisant savefig de matplotlib, devrait faire l'affaire. Mais ce code produit l'erreur suivante :

Traceback (most recent call last):
  File "./testgraph.py", line 76, in 
    ax = fig.add_subplot(ax)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/figure.py", line 890, in add_subplot
    assert(a.get_figure() is self)
AssertionError

Alternativement, essayer d'appeler savefig directement sur le plot produit également une erreur :

dtf2.plot().savefig('~/Documents/output.png')

  File "./testgraph.py", line 79, in 
    dtf2.plot().savefig('~/Documents/output.png')
AttributeError: 'AxesSubplot' object has no attribute 'savefig'

Je pense que je dois d'une manière ou d'une autre ajouter le subplot retourné par plot() à une figure afin d'utiliser savefig. Je me demande également si cela a peut-être à voir avec le magic derrière la classe AxesSubPlot.

EDIT:

le code suivant fonctionne (sans erreur), mais me laisse avec une image de page blanche....

fig = plt.figure()
dtf2.plot()
fig.savefig('output.png')

EDIT 2: Le code ci-dessous fonctionne également très bien

dtf2.plot().get_figure().savefig('output.png')

169voto

Wael BEN ZID Points 149

La méthode gcf est obsolète dans V 0.14, Le code ci-dessous fonctionne pour moi:

plot = dtf.plot()
fig = plot.get_figure()
fig.savefig("output.png")

44voto

joelostblom Points 7189

Vous pouvez utiliser ax.figure.savefig(), comme suggéré dans un commentaire sur la question :

import pandas as pd

df = pd.DataFrame([0, 1])
ax = df.plot.line()
ax.figure.savefig('demo-file.pdf')

Cela n'a aucun avantage pratique par rapport à ax.get_figure().savefig() comme suggéré dans d'autres réponses, donc vous pouvez choisir l'option qui vous semble la plus esthétique. En fait, get_figure() retourne simplement self.figure :

# Source du snippet lié ci-dessus
def get_figure(self):
    """Renvoie l'instance de `.Figure` à laquelle l'artiste appartient."""
    return self.figure

20voto

bhoward Points 2060

Je ne suis pas entièrement certain pourquoi cela fonctionne, mais cela enregistre une image avec mon graphique:

dtf = pd.DataFrame.from_records(d,columns=h)
dtf2.plot()
fig = plt.gcf()
fig.savefig('output.png')

Je suppose que le dernier extrait de mon message d'origine est vide car la figure n'a jamais obtenu les axes générés par pandas. Avec le code ci-dessus, l'objet de la figure est retourné à partir d'un certain état global magique par l'appel de gcf() (obtenir la figure actuelle), ce qui intègre automatiquement les axes tracés dans la ligne précédente.

16voto

Ibelin Points 137

Il me semble facile d'utiliser la fonction plt.savefig() après la fonction plot():

import matplotlib.pyplot as plt
dtf = pd.DataFrame.from_records(d,columns=h)
dtf.plot()
plt.savefig('~/Documents/output.png')

15voto

Trenton_M Points 734
  • Les autres réponses traitent de l'enregistrement du tracé pour un seul tracé, pas pour les sous-tracés.
  • Dans le cas des sous-tracés, l'API de tracé renvoie un numpy.ndarray de matplotlib.axes.Axes

    import pandas as pd import seaborn as sns # pour les données d'exemple import matplotlib.pyplot as plt

    charger les données

    df = sns.load_dataset('iris')

    afficher(df.head())

    sepal_length sepal_width petal_length petal_width species 0 5.1 3.5 1.4 0.2 setosa 1 4.9 3.0 1.4 0.2 setosa 2 4.7 3.2 1.3 0.2 setosa 3 4.6 3.1 1.5 0.2 setosa 4 5.0 3.6 1.4 0.2 setosa

Tracer avec pandas.DataFrame.plot()

  • L'exemple suivant utilise kind='hist', mais c'est la même solution lorsqu'on spécifie autre chose que 'hist'
  • Utilisez [0] pour obtenir un des axes du tableau, et extrayez la figure avec .get_figure().

    fig = df.plot(kind='hist', subplots=True, figsize=(6, 6))[0].get_figure() plt.tight_layout() fig.savefig('test.png')

entrer la description de l'image ici

Tracer avec pandas.DataFrame.hist()

1:

  • Dans cet exemple, nous attribuons df.hist aux Axes créés avec plt.subplots, et enregistrons cette fig.
  • 4 et 1 sont utilisés pour nrows et ncols, respectivement, mais d'autres configurations peuvent être utilisées, telles que 2 et 2.

    fig, ax = plt.subplots(nrows=4, ncols=1, figsize=(6, 6)) df.hist(ax=ax) plt.tight_layout() fig.savefig('test.png')

entrer la description de l'image ici

2:

  • Utilisez .ravel() pour aplatir le tableau de Axes

    fig = df.hist().ravel()[0].get_figure() plt.tight_layout() fig.savefig('test.png')

entrer la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X