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

Posted

技术标签:

【中文标题】使用 matplotlib 的 savefig 保存从 python pandas 生成的图(AxesSubPlot)【英文标题】:Saving plots (AxesSubPlot) generated from python pandas with matplotlib's savefig 【发布时间】:2013-11-02 13:06:25 【问题描述】:

我正在使用 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 类后面的 magic 有关。

编辑:

以下作品(没有引发错误),但给我留下了空白页图像......

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

编辑 2: 下面的代码也可以正常工作

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

【问题讨论】:

【参考方案1】:

gcf 方法在 V 0.14 中被弃用,以下代码适用于我:

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

【讨论】:

【参考方案2】:

您可以使用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() simply returns self.figure

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】: 其他答案涉及将图保存为单个图,而不是子图。 在有子图的情况下,图 API 返回 numpy.ndarraymatplotlib.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.hist 分配给使用plt.subplots 创建的Axes,并保存fig41分别用于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')

【讨论】:

.get_figure() 是我想要的。谢谢【参考方案6】:

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

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

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

【讨论】:

您能否通过示例添加更多解释? 如果您在同一个函数中创建多个图形,这不起作用(但在 jupyter 笔记本单元格中起作用)。

以上是关于使用 matplotlib 的 savefig 保存从 python pandas 生成的图(AxesSubPlot)的主要内容,如果未能解决你的问题,请参考以下文章

python使用matplotlib的savefig保存时图片保存不清晰以及不完整的问题

为啥 Matplotlib savefig 图像重叠?

使用 matplotlib.pyplot、imshow() 和 savefig() 以全分辨率绘图?

Matplotlib,savefig() 的替代品以提高保存到 CString 对象时的性能?

样式文件中的 matplotlib savefig.directory 不起作用

调用 savefig 后 Python matplotlib 更新图