105

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

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')
4

6 回答 6

140

gcf 方法在 V 0.14 中被弃用,下面的代码对我有用:

plot = dtf.plot()
fig = plot.get_figure()
fig.savefig("output.png")
于 2014-07-10T10:51:42.867 回答
28

您可以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
于 2020-01-22T12:23:21.453 回答
19

所以我不完全确定为什么会这样,但它用我的情节保存了一个图像:

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

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

于 2013-10-24T02:11:30.370 回答
13

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

import matplotlib.pyplot as plt
dtf = pd.DataFrame.from_records(d,columns=h)
dtf.plot()
plt.savefig('~/Documents/output.png')
于 2016-02-27T11:07:11.730 回答
7
  • 其他答案涉及将情节保存为单个情节,而不是子情节。
  • 在有子图的情况下,绘图 API 返回numpy.ndarray一个matplotlib.axes.Axes
import pandas as pd
import seaborn as sns  # for sample data
import matplotlib.pyplot as plt

# load data
df = sns.load_dataset('iris')

# display(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

情节与pandas.DataFrame.plot()

  • 以下示例使用kind='hist', 但在指定其他内容时是相同的解决方案'hist'
  • 用于从数组[0]中获取其中一个axes,并使用 提取图形.get_figure()
fig = df.plot(kind='hist', subplots=True, figsize=(6, 6))[0].get_figure()
plt.tight_layout()
fig.savefig('test.png')

在此处输入图像描述

情节与pandas.DataFrame.hist()

1:

  • 在这个例子中,我们分配df.histAxescreated withplt.subplots并保存它fig
  • 41分别用于nrowsncols,但也可以使用其他配置,例如22
fig, ax = plt.subplots(nrows=4, ncols=1, figsize=(6, 6))
df.hist(ax=ax)
plt.tight_layout()
fig.savefig('test.png')

在此处输入图像描述

2:

  • 用于.ravel()展平数组Axes
fig = df.hist().ravel()[0].get_figure()
plt.tight_layout()
fig.savefig('test.png')

在此处输入图像描述

于 2021-04-21T19:05:36.667 回答
3

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

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

IE

dfcorr.hist(bins=50).get_figure().savefig('correlation_histogram.png')
于 2019-02-22T18:14:31.440 回答