305

I tried the following code (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()

But I get this error:

  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'

I expect the final output.png will exist and look like this:

enter image description here

How can I resolve the problem?

2
  • 1
    @Terry Wang's answer down below worked for me - Python 2.7.12 and seaborn 0.7.1 Commented Sep 20, 2018 at 19:04
  • 3
    A one-liner for seaborn 0.9: sns.regplot(x='age', y='income', data=pd.read_csv('income_data.csv')).get_figure().savefig('income_f_age.png') Commented Nov 18, 2018 at 14:17

12 Answers 12

411

The following calls allow you to access the figure (Seaborn 0.8.1 compatible):

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

as seen previously in this answer.

The suggested solutions are incompatible with Seaborn 0.8.1. They give the following errors because the Seaborn interface has changed:

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

UPDATE: I have recently used PairGrid object from seaborn to generate a plot similar to the one in this example. In this case, since GridPlot is not a plot object like, for example, sns.swarmplot, it has no get_figure() function. It is possible to directly access the matplotlib figure by:

fig = myGridPlotObject.fig
Sign up to request clarification or add additional context in comments.

2 Comments

This is the only answer that works for PairGrid and JointGrid as well, I think it should be accepted.
The requirement of get_figure to save the figure is very annoying. It should be possible using on line to save a plot to a file.
89

Some of the above solutions did not work for me. The .fig attribute was not found when I tried that and I was unable to use .savefig() directly. However, what did work was:

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

I am a newer Python user, so I do not know if this is due to an update. I wanted to mention it in case anybody else runs into the same issues as I did.

2 Comments

This worked for me with a seaborn.swarmplot, but for seaborn.lmplot that won't work. With seaborn.lmplot, I found sns_plot.savefig("output.png") worked like in Salvatore's answer, but without need for get_figure() call.
This worked for displot with seaborn 0.11.2. The only answer I could get to work!
38

Fewer lines for 2019 searchers:

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

UPDATE NOTE: size was changed to height.

4 Comments

it produces white image!
@user_007 not sure why you're getting white image. I just tested the code today and it's fine to both Jupyter Notebook and the output file. You might want to update your console/Python and check your computer View settings.
I had a white figure as well. I corrected it with: sns_plot.savefig('output.png')
Works for pdf output too.
18

You should just be able to use the savefig method of sns_plot directly.

sns_plot.savefig("output.png")

For clarity with your code if you did want to access the matplotlib figure that sns_plot resides in then you can get it directly with

fig = sns_plot.fig

In this case there is no get_figure method as your code assumes.

Comments

13

I couldnt get the other answers to work and finally got this to work for me for matplotlib==3.2.1 . Its especially true if you are doing this within a for loop or some iterative approach.

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

Note that the savefig must be before the show call. Otherwise an empty image is saved.

3 Comments

This actually helped! Thank you. This is the only way it worked for me in Jupyter Notebook
@Anscandance good to hear ! Yeah, i couldnt get the other solutions to work properly as well in the notebook.
Can confirm this works with Matplotlib version 3.7.1 as well. All of the other answers in this thread did not work.
12

I use distplot and get_figure to save picture successfully.

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

1 Comment

Worked for my environment: function sns.distplot() in python 3.5.6 with seaborn 0.9.0 . Besides, function sns.pairplot() doesn't need the line of get_figure()
5

This works for me

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

Comments

4

Its also possible to just create a matplotlib figure object and then use 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

1 Comment

Doesn't work at least with displot
2

You would get an error for using sns.figure.savefig("output.png") in seaborn 0.8.1.

Instead use:

import seaborn as sns

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

Comments

1

With python 3.13 "fig" is deprecated use "figure".

df = sns.load_dataset('iris')
sns_plot = sns.pairplot(df, hue='species', size=2.5)
fig = sns_plot.figure
fig.savefig('file.jpg')

Comments

0

Some of the confusion is with what type of object sns_plot is. I believe that it will be an Axes. For this case, I have a small little wrapper function that works for me.

from matplotlib.axes import Axes
...
def save_axes(ax: Axes, fname: str, **kwargs):
    fig = ax.get_figure(root = True)
    if fig is None:
        raise Exception("Couldn't get figure")
    fig.savefig(fname, **kwargs)

So with that defined, I think that

...
sns_plot = ...
save_axes(sns_plot, "output.png")

should work for you.

Comments

-4

Just FYI, the below command worked in seaborn 0.8.1 so I guess the initial answer is still valid.

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

1 Comment

Although that code is working, it is not complete. The title says, 'How to save a Seaborn plot into a file' which is more general. Unluckily the proposed solution works with pairplot, but it raises an exception with other 'kinds' of plots. Hopefully in future releases there will a more unified way to obtain the 'figure' object from a seaborn plot.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.