考虑(假设代码运行时没有错误):
import matplotlib.figure as matfig
import numpy as np
ind = np.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
是None。子图应该在图形画布上,所以它不应该是“无”。我想我遗漏了一个关于matplot图形画布的关键概念。我如何更新fig.canvas来反映当前的图形,这样我就可以使用fig.savefig(outputPath, dpi=300)
了?谢谢!
3条答案
按热度按时间qlfbtfca1#
plt.figure
为您做的事情之一是为您处理后端问题,这包括设置画布。mpl的架构是Artist
级别的对象知道如何设置自己,确保所有东西都在正确的位置,等等,然后当被要求时,将它们自己画到画布上。因此,即使您已经设置了子情节和线条,您还没有实际使用画布。当你试图保存人物时,你是在要求画布要求所有的艺术家在上面画自己。你没有创建画布(特定于给定后端),所以它会抱怨。按照here的例子,您需要创建一个画布,您可以嵌入到您的tk应用程序中(从上一个问题开始)
canvas
是一个Tk
小部件,可以添加到GUI中。如果你不想把你的图嵌入到
Tk
中,你可以使用这里显示的纯OO
方法(代码直接从链接中获取):bnlyeluc2#
Matplotlib可能非常混乱。
我喜欢使用Figure()方法,而不是Figure()方法。小心大写。在下面的示例代码中,如果你有figure = plt.Figure(),你会得到问题中的错误。通过使用figure = plt.figure(),画布就会为您创建。
这里有一个例子,其中还包括一些关于重新调整图像大小的花絮,因为你也需要帮助。
093gszye3#
你的示例代码不够完整,我无法运行它来验证我的答案,这可能取决于'matfig'是如何定义的,但我猜你想要的是:
不是:
figure是你应该调用的模块方法。
Figure是所有plot元素的顶层容器,尽管它比这个要复杂一些。