Barplot savefig() returning an AttributeError

Question:

I’m converting an iPython notebook to a python script, just trying to output the results of a couple Seaborn plots as png files. Code:

import seaborn as sns

...

sns.set_style("whitegrid")
ax = sns.barplot(x=range(1,11), y=[ (x/nrows)*100 for x in addr_pop ], palette="Blues_d")
ax.savefig("html/addr_depth.png")

Don’t worry about the variables, they’re populated as expected, and I get a great-looking chart in iPyNB. Running the code within a script, however, yields RuntimeError: Invalid DISPLAY variable.

Following another thread, I modified the code, putting this at the top of the script:

import matplotlib
matplotlib.use('Agg')

And tried again. This time, it doesn’t seem like the savefig() method is available for the plot at all:

AttributeError: 'AxesSubplot' object has no attribute 'savefig'

All the results searching out this error are related to pandas and a plot that is already being displayed. I’m just trying to get Seaborn to output the fig to a file, ideally without displaying it at all.

Any help is appreciated.

Asked By: economy

||

Answers:

I guess you should import pyplot.

import matplotlib.pyplot as plt
plt.savefig()
Answered By: WoodChopper

I solved the issue by changing

ax.savefig('file.png')

to

ax.figure.savefig('file.png')

I guess accessing the figure directly is one way to get to the savefig() method for the barplot.

@WoodChopper also has a working solution, but it requires another import statement, and utilizing pyplot’s savefig() directly.

Either solution does require setting matplotlib.use('Agg') to get around the DISPLAY variable error. As the referenced post noted, this has to be set before importing other matplotlib libraries.

Answered By: economy
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.