首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Figure.show、Figure.canvas.draw和Figure.canvas.draw_idle之间的区别是什么

Figure.show、Figure.canvas.draw和Figure.canvas.draw_idle之间的区别是什么
EN

Stack Overflow用户
提问于 2020-11-11 23:34:11
回答 1查看 395关注 0票数 3

在Matplotlib中,我可以通过调用Figure对象(比如fig )和方法show (fig.show())来更新图中绘图的视觉效果。但我也可以通过调用图中的canvas对象,然后调用方法draw (fig.canvas.draw())来完成此操作。

示例:

代码语言:javascript
运行
复制
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()

代码语言:javascript
运行
复制
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.showfig.canvas.drawfig.canvas.draw_idle有什么区别??

EN

回答 1

Stack Overflow用户

发布于 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,此函数呈现图形并“遍历艺术家树,即使没有生成输出,因为这将触发延迟工作(如计算限制自动限制和滴答值)”。因此,您可以在内存中生成图形,而不实际显示或打印它。我见过的唯一一个有用的实例是,在最终渲染和打印/保存之前,需要有关图形格式的详细信息。

基于这些信息,我做了一个计时实验:

代码语言:javascript
运行
复制
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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64789437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档