在Matplotlib中,我可以通过调用Figure
对象(比如fig
)和方法show
(fig.show()
)来更新图中绘图的视觉效果。但我也可以通过调用图中的canvas
对象,然后调用方法draw
(fig.canvas.draw()
)来完成此操作。
示例:
import matplotlib.pyplot as plt
fig, axes = plt.subplots()
axes.plot([1,2,3],[2,3,4])
fig.show()
axes.plot([1,2,3],[-2,23,14])
fig.show()
和
import matplotlib.pyplot as plt
fig, axes = plt.subplots()
axes.plot([1,2,3],[2,3,4])
fig.show()
axes.plot([1,2,3],[-2,23,14])
fig.canvas.draw()
我怀疑fig.show
还会执行self.canvas.draw()
和其他一些功能。但是当我检查代码时,我只看到它可能调用self.canvas.draw_idle()
。
fig.show
,fig.canvas.draw
,fig.canvas.draw_idle
有什么区别??
发布于 2021-10-28 05:00:49
当我在从命令行运行的python脚本中调用fig.show()
时(在Windows上的Anaconda中),它短暂地出现并从我的屏幕上消失。这不同于plt.show()
,它显示所有打开的图形,Python脚本挂起,直到我关闭它们才能继续运行。(我知道您在上面没有讨论plt.show()
,但为了清晰和完整,我想提到它。)
fig.show()
调用plt.canvas.draw_idle()
,后者"schedules a rendering the next time the GUI window is going to re-paint the screen“,因此在某些条件下调用fig.canvas.draw()
。事实上,同一链接继续指出,“即使在控制器返回到图形用户界面事件循环之前发生了对draw_idle多个调用,该图形也将只被呈现一次”。为了确保尽快更新屏幕,文档建议在fig.canvas.draw_idle
之后添加fig.canvas.flush_events()
。
相比之下,即使没有生成任何输出,fig.canvas.draw()
也会呈现图形。查看documentation,此函数呈现图形并“遍历艺术家树,即使没有生成输出,因为这将触发延迟工作(如计算限制自动限制和滴答值)”。因此,您可以在内存中生成图形,而不实际显示或打印它。我见过的唯一一个有用的实例是,在最终渲染和打印/保存之前,需要有关图形格式的详细信息。
基于这些信息,我做了一个计时实验:
import matplotlib.pyplot as plt
import datetime
N = 10**4
fig, axes = plt.subplots()
axes.plot([1,2,3],[2,3,4])
a = datetime.datetime.now()
for i in range(N):
fig.show()
b = datetime.datetime.now()
print("fig.show: ", b-a)
a = datetime.datetime.now()
for i in range(N):
fig.canvas.draw_idle()
b = datetime.datetime.now()
print("fig.canvas.draw_idle: ", b-a)
a = datetime.datetime.now()
for i in range(N):
fig.canvas.draw()
b = datetime.datetime.now()
print("fig.canvas.draw: ", b-a)
for i in range(N):
fig.canvas.draw_idle()
fig.canvas.flush_events()
b = datetime.datetime.now()
print("draw_idle, flush_events:", b-a)
# fig.show: 0:00:00.280800
# fig.canvas.draw_idle: 0:00:00.015600
# fig.canvas.draw: 0:03:43.450512
# draw_idle, flush_events: 0:08:29.103440
根据这些计时,您可以理解为什么文档建议在大多数情况下使用fig.canvas.draw_idle()
而不是fig.canvas.draw()
。
https://stackoverflow.com/questions/64789437
复制相似问题