Збереження ділянок (AxesSubPlot), згенерованих з панд python за допомогою savefig matplotlib


79

Я використовую панди для створення сюжету з фрейму даних, який я хотів би зберегти у файл:

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

Здається, що останній рядок, використовуючи файл збереження matplotlib, повинен зробити цю справу. Але цей код видає таку помилку:

Traceback (most recent call last):
  File "./testgraph.py", line 76, in <module>
    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

Як варіант, намагаючись викликати savefig безпосередньо на графіку, також виникають помилки:

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


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

Думаю, мені потрібно якось додати підзапис, повернутий plot () до фігури, щоб використовувати savefig. Також мені цікаво, чи, можливо, це пов’язано з магією класу AxesSubPlot.

РЕДАГУВАТИ:

наступні роботи (не викликаючи помилок), але залишаю мені зображення порожньої сторінки ....

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

РЕДАКТУВАТИ 2: Наведений нижче код також чудово працює

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

11
абоax.figure.savefig(...)
tacaswell

@tcaswell Я зіткнувся з тією ж проблемою, що і bhoward, і хоча його власна відповідь спрацювала на нього, вона ніколи не спрацювала на мене. Здається, що виклик savefig()методу безпосередньо на AxesSubplotоб'єкті (наприклад, прямо на ньому, і навіть не на призначену йому змінну) - єдиний спосіб, який він може працювати для мене. Я справді збентежений, чому це так. Ви маєте ідею? Це якась помилка?
АККО

Відповіді:


121

Метод gcf зазначений у V 0.14, Для мене працює наступний код:

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

2
Я спробував використати ваш метод, але це не працює для менеAttributeError Traceback (most recent call last) /home/kohaugustine/INTERNSHIPS/UIUC_ADSC/adsc-hardware/sochls/vast_work/llvm/tools/shang/util/sit/sit/data_analysis.py in <module>() 295 cycles_plot.set_ylabel('Simulation Cycle Count') 296 --> 297 cycles_plot_file = cycles_plot.getfigure() 298 cycles_plot_file.savefig('cycles.pdf') 299 #cycles_series.show() AttributeError: 'AxesSubplot' object has no attribute 'getfigure'
АККО

Чи можете ви сказати мені більше деталей про ваше оточення?
Wael Ben Zid El Guebsi

Це дає порожню цифру. Інша відповідь чудово працює.
JohnnyM

Яку версію ви використовуєте? Як згадувалося у v0.14, метод .gcf () не працює
Ваел Бен Зід Ель Гебсі

@AKKO ти забув _- тобто get_figureні getfigure!
ErichBSchulz

19

Тому я не зовсім впевнений, чому це працює, але це зберігає образ із моїм сюжетом:

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

Я здогадуюсь, що останній фрагмент мого оригінального допису був збережений порожнім, тому що фігура ніколи не отримувала осі, створені пандами. За допомогою наведеного вище коду, об’єкт figure повертається із якогось магічного глобального стану за допомогою виклику gcf () (отримати поточну фігуру), який автоматично випікається по осях, нанесених у наведеному вище рядку.


Що таке "d", а що "h" у цьому випадку? Дякую. @bhoward
makansij

@simple вони з оригінального запитання
danio

12

Ви можете використовувати ax.figure.savefig(), як пропонується в коментарі до питання:

import pandas as pd

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

Це не має практичної переваги порівняно з тим, ax.get_figure().savefig()як пропонується в інших відповідях, тому ви можете обрати варіант, який вам здається найбільш естетичним. Насправді get_figure()просто повертаєself.figure :

# Source from snippet linked above
def get_figure(self):
    """Return the `.Figure` instance the artist belongs to."""
    return self.figure

працює в пандах 0.25.3 та matplotlib 3.1.2, дякую!
Ірен

1
'ax.figure.savefig', це єдиний метод, який працював з пандами 0.25.3 і matplotlib 2.2.3
Gench

10

Мені здається легким, що використання plt.savefig()функції за plot()функцією:

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

3

це може бути простіший підхід:

(DesiredFigure) .get_figure (). Savefig ('figure_name.png')

тобто

dfcorr.hist(bins=50).get_figure().savefig('correlation_histogram.png')

Ви можете додати ще якесь пояснення на прикладі?
Нурснааз,

1
це не працює, якщо ви створюєте кілька фігур в рамках однієї функції (але працюють у клітинках блокнота jupyter).
Джонатан,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.