条形图的savefig()返回AttributeError错误

32

我正在将一个iPython笔记本转换为Python脚本,只是尝试将一些Seaborn绘图的结果输出为png文件。 代码:

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

不用担心变量,它们会按预期填充,在iPyNB中我能得到一个漂亮的图表。然而,在运行脚本时,会出现RuntimeError: Invalid DISPLAY variable

根据另一个线程的建议,我修改了代码,在脚本顶部添加了以下内容:

import matplotlib
matplotlib.use('Agg')

并再次尝试。这次,似乎对于该图,savefig()方法根本不可用:

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

所有搜索此错误的结果都与pandas和已经显示的图形有关。 我只是想让Seaborn将fig输出到文件中,最好根本不显示它。

感谢任何帮助。


请参考以下链接:https://dev59.com/HGEh5IYBdhLWcg3w321G - riyansh.legend
2个回答

116
我通过改变解决了这个问题。
ax.savefig('file.png')

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

我猜直接访问图形是获取条形图的savefig()方法的一种方式。

@WoodChopper也有一个可行的解决方案,但它需要另一个导入语句,并直接使用pyplot的savefig()

任何一种解决方案都需要设置matplotlib.use('Agg')以避免DISPLAY变量错误。正如参考文章所述,在导入其他matplotlib库之前必须设置此项。


13

我猜你应该导入pyplot。

import matplotlib.pyplot as plt
plt.savefig()

1
好的,这确实有效。我有点困惑为什么会这样,但这解决了问题。我还找到了一种方法,无需单独导入pyplot即可完成。将ax.savefig()更改为ax.figure.savefig()具有相同的效果,并且看起来更加简洁。也许有人可以发表评论并阐明其中的区别。 - economy
2
你可以阅读有关面向对象接口的资料,例如这个教程非常清晰易懂。它应该能帮助你理解这些东西是如何相互配合的。 - mwaskom
2
对我没用,我必须使用.figure. - FiReTiTi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接