使用 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.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.hist
分配给使用plt.subplots
创建的Axes
,并保存fig
。
4
和1
分别用于nrows
和ncols
,但也可以使用其他配置,例如2
和2
。
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.pyplot、imshow() 和 savefig() 以全分辨率绘图?
Matplotlib,savefig() 的替代品以提高保存到 CString 对象时的性能?