考虑(假设代码运行时没有错误):
import matplotlib.figure as matfig
ind = numpy.arange(N)
width = 0.50;
fig = matfig.Figure(figsize=(16.8, 8.0))
fig.subplots_adjust(left=0.06, right = 0.87)
ax1 = fig.add_subplot(111)
prev_val = None
fig.add_axes(ylabel = 'Percentage(%)',xlabel='Wafers',title=title,xticks=(ind+width/2.0,source_data_frame['WF_ID']))
fig.add_axes(ylim=(70,100))
for key,value in bar_data.items():
ax1.bar(ind,value, width,color='#40699C', bottom=prev_val)
if prev_val:
prev_val = [a+b for (a,b) in zip(prev_val,value)]
else:
prev_val=value
names= []
for i in range(0,len(col_data.columns)):
names.append(col_data.columns[i])
ax1.legend(names,bbox_to_anchor=(1.15, 1.02))
我现在想用fig.savefig(outputPath, dpi=300)
保存我的图形,但是我得到了AttributeError: 'NoneType' object has no attribute 'print_figure'
,因为fig.canvas
不是。子图应该在图形画布上,所以它不应该是无的。我想我缺少了一个关于matplot figures画布的关键概念,如何更新fig.canvas以反映当前图形,以便使用fig.savefig(outputPath, dpi=300)
?谢谢!
你的示例代码不够完整,我无法运行它来验证我的答案,这可能取决于“matfig”是如何定义的,但我猜你想要的是:
不是:
图是应该调用/调用的模块方法。
图是所有plot元素的顶级容器,尽管它比这个复杂一些。
plt.figure
为您做的事情之一是为您包装后端,包括设置画布。mpl的体系结构是Artist
级对象知道如何设置自己,确保所有东西都位于彼此相对的正确位置等,然后当被要求时,将它们自己绘制到画布上。因此,即使您已经设置了子块和行,实际上您还没有使用画布。当你试图保存这个图形时,你要求画布要求所有的艺术家把他们自己画在上面。您还没有创建画布(特定于给定的后端),所以它会抱怨。根据示例here,您需要创建一个可以嵌入到tk应用程序中的画布(从上一个问题开始)
canvas
是一个Tk
小部件,可以添加到gui中。如果不想将图形嵌入
Tk
中,可以使用OO
所示的纯方法here(直接从链接中提取的代码):Matplotlib可能非常混乱。
我喜欢做的是使用figure()方法而不是figure()方法。注意大写字母。在下面的示例代码中,如果您有figure=plt.figure(),您将得到问题中的错误。通过使用figure=plt.figure()为您创建画布。
这里有一个例子,其中也包括一些关于重新调整图像大小的小道消息,因为您也希望在这方面得到帮助。
相关问题 更多 >
编程相关推荐