使用matplotlib的savefig保存从python熊猫生成的图(AxesSubPlot)


78

我正在使用熊猫从数据框生成图,我想将其保存到文件中:

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的savefig的最后一行应该可以解决问题。但是该代码会产生以下错误:

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对象上调用方法(就像在对象上一样,甚至在分配给它的变量上也是如此)是它对我起作用的唯一方法。我真的很困惑为什么会这样。你有什么主意吗?是某种错误吗?
AKKO 2015年

Answers:


119

在v 0.14中使用了gcf方法,下面的代码对我有用:

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'
AKKO 2015年

您能给我更多有关您的环境的详细信息吗?
Wael Ben Zid El Guebsi 2015年

这给出了一个空的数字。另一个答案很好。
JohnnyM

您使用的是什么版本?如v0.14所述,.gcf()方法不起作用
Wael Ben Zid El Guebsi 2015年

@AKKO,您忘记了_-就是get_figure这样getfigure
ErichBSchulz '18年

19

因此,我不完全确定为什么会这样,但是会保存我的绘图中的图像:

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

我猜我原始帖子的最后一个片段保存为空白,因为该图从未获得熊猫生成的轴。通过上面的代码,通过gcf()调用(获取当前图形)从某个全局状态返回了图形对象(自动获取状态),该状态自动烘焙在上一行中绘制的轴中。


在这种情况下,“ d”是什么,“ h”是什么?谢谢。@bhoward
makansij 2014年

@simple,来自原始问题
danio '17

10

对我来说,使用plt.savefig()函数后plot()函数似乎很容易:

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

10

您可以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

可以在pandas 0.25.3和matplotlib 3.1.2中使用,谢谢!
irene

1
'ax.figure.savefig'是使用pandas 0.25.3和matplotlib 2.2.3的唯一方法
gench

3

这可能是一个更简单的方法:

(DesiredFigure).get_figure()。savefig('figure_name.png')

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

您可以通过示例添加更多说明吗?
Nursnaaz

1
如果您要在同一函数中创建多个图形,则此方法不起作用(但在jupyter笔记本单元中确实适用)。
乔纳森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.