Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Barplot savefig() returning an AttributeError

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.

like image 612
economy Avatar asked Nov 09 '15 19:11

economy


2 Answers

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.

like image 101
economy Avatar answered Nov 19 '22 13:11

economy


I guess you should import pyplot.

import matplotlib.pyplot as plt
plt.savefig()
like image 11
WoodChopper Avatar answered Nov 19 '22 14:11

WoodChopper