2 回答
TA贡献1795条经验 获得超7个赞
也许以下是您正在寻找的内容。由于这个问题真的很广泛,同时要求很多东西,我将把它限制在前两个例子中。这里的关键是使用plt.ion().
import matplotlib
matplotlib.use("Qt5Agg")
import matplotlib.pyplot as plt
X=[0,1]
Y=[0,1]
Y2a=[0,2]
Y2b=[0,2.5]
Y3a=[0,3]
Y3b=[0,3.5]
Y4=[0,4]
plt.ion()
fig, ax = plt.subplots() # Nothing happens
ax.plot(X,Y) # Nothing happens
plt.draw()
plt.pause(.1) # New window (1) appears and shows plot of X,Y; execution continues directly
ax.set_xlabel('X') # Window 1 gets X axis label
ax.set_ylabel('Y') # Window 1 gets Y axis label
figManager = plt.get_current_fig_manager()
figManager.window.showMinimized() # Window 1 disappears
plt.pause(10) # No open windows for 10 seconds
figManager.window.showNormal() # Window 1 reappears and looks the same as before
fig2 = plt.figure() # Nothing happens
fig2.show() # New window (2) appears and is empty
ax2 = fig2.gca() # Window 2 shows axes
ax2.plot(X,Y2a) # Window 2 shows X,Y2a
pass # Nothing happens, could be omitted
for i in range(60*2):
plt.pause(1/2) # Long computation. In the meantime, windows 1 and 2 can still be resized and their controls (zoom etc.) can be used
ax2.plot(X,Y2b) # Window 2 shows X,Y2a as well as X,Y2b
figManager = plt.get_current_fig_manager()
figManager.window.showMinimized() # Window 2 disappears
(1) plt.ion 在这里做什么?
plt.ion()打开交互模式。这意味着可以在 GUI 内绘制图形而无需启动 GUI 事件循环。优点很明显,GUI事件循环不会阻塞后续代码;缺点是您没有事件循环 - 因此 GUI 可能很快变得无响应,您需要自行负责让它管理事件。这就是plt.pause在这种情况下的作用。可能发生的情况是,无论您使用什么来运行脚本,都已经为您打开了交互模式。在这种情况下plt.ioff(),请使用以查看差异。
(2) 可以在不抓住焦点的情况下实现像 plt.pause 这样的东西吗?
可能,但大多数用户希望在绘制时实际看到他们的图。所以它不是以这种方式实现的。
(3)如果plt.draw没有plt.pause(.1)没有任何效果,为什么它以当前的形式存在?
plt.draw()绘制图形。这在各种情况下都很有用,并且完全独立于是否ion使用。
(4) fig.show 在概念上是否与 (a) 如果不存在打开窗口相同 (b) 将焦点放在窗口 (c) plt.draw();plt.pause(0.1) 上?
我对此表示强烈怀疑。然而,它可能在交互模式下具有相同的面向用户的效果。
(5) 在进行实际计算(与 plt.pause 相反)时,真的不可能让数字响应吗?
不可以。您可以在事件循环内运行计算。您也可以在线程中运行它。最后,您可以在计算过程中调用plt.pause()或fig.canvas.flush_events()重复。
(6)figManager.window.showMinimized对我没有任何影响;那是因为这是操作系统相关的吗?
它不应该依赖于操作系统。但它肯定依赖于后端。这就是我将后端设置在代码之上的原因。
添加回答
举报