如何保存一个Seaborn情节到一个文件

我尝试了以下代码(test_seaborn.py):

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
import seaborn as sns
sns.set()
df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
fig = sns_plot.get_figure()
fig.savefig("output.png")
#sns.plt.show()

但是我得到了这个错误:

  Traceback (most recent call last):
File "test_searborn.py", line 11, in <module>
fig = sns_plot.get_figure()
AttributeError: 'PairGrid' object has no attribute 'get_figure'

我期望最终的output.png将存在,看起来像这样:

enter image description here

我该如何解决这个问题?

418663 次浏览

你应该可以直接使用sns_plotsavefig方法。

sns_plot.savefig("output.png")

为了代码的清晰性,如果你想访问sns_plot所在的matplotlib图,那么你可以直接使用

fig = sns_plot.fig

在这种情况下,没有你的代码假设的get_figure方法。

下面的调用允许您访问图(兼容Seaborn 0.8.1):

swarm_plot = sns.swarmplot(...)
fig = swarm_plot.get_figure()
fig.savefig("out.png")

如前面在这个答案中所见。

建议的解决方案与Seaborn 0.8.1不兼容。它们给出以下错误,因为Seaborn接口已经更改:

AttributeError: 'AxesSubplot' object has no attribute 'fig'
When trying to access the figure


AttributeError: 'AxesSubplot' object has no attribute 'savefig'
when trying to use the savefig directly as a function

< >强更新: 我最近使用了来自seaborn的PairGrid对象来生成一个类似于这个例子中的图形。 在这种情况下,由于GridPlot不是一个绘图对象,例如,sns.swarmplot,它没有get_figure()函数。 可以通过

直接访问matplotlib图
fig = myGridPlotObject.fig

上面的一些解决方案对我不起作用。当我尝试时,没有找到.fig属性,我无法直接使用.savefig()。然而,真正起作用的是:

sns_plot.figure.savefig("output.png")

我是一个新的Python用户,所以我不知道这是否是由于更新。我想提一下,以防其他人遇到和我一样的问题。

我使用distplotget_figure成功保存图片。

sns_hist = sns.distplot(df_train['SalePrice'])
fig = sns_hist.get_figure()
fig.savefig('hist.png')

在seaborn 0.8.1中使用sns.figure.savefig("output.png")会得到一个错误。

而不是使用:

import seaborn as sns


df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
sns_plot.savefig("output.png")

仅供参考,以下命令在seaborn 0.8.1中工作,所以我猜最初的答案仍然有效。

sns_plot = sns.pairplot(data, hue='species', size=3)
sns_plot.savefig("output.png")

也可以只创建matplotlib figure对象,然后使用plt.savefig(...):

from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd


df = sns.load_dataset('iris')
plt.figure() # Push new figure on stack
sns_plot = sns.pairplot(df, hue='species', size=2.5)
plt.savefig('output.png') # Save that figure

这对我很有用

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline


sns.factorplot(x='holiday',data=data,kind='count',size=5,aspect=1)
plt.savefig('holiday-vs-count.png')

2019年的搜索量减少了:

import matplotlib.pyplot as plt
import seaborn as sns


df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', height=2.5)
plt.savefig('output.png')

更新说明:size被更改为height

我不能得到其他答案的工作,最后得到这个工作为我matplotlib==3.2.1。如果你是在for循环或一些迭代方法中这样做,尤其如此。

sns.scatterplot(
data=df_hourly, x="date_week", y="value",hue='variable'
)
plt.savefig('./f1.png')
plt.show()

注意,savefig必须在show调用之前。否则将保存一个空映像。