首页  >  文章  >  后端开发  >  如何使用 Matplotlib 以非阻塞方式绘图:为什么 `show(block=False)` 并不总是有效?

如何使用 Matplotlib 以非阻塞方式绘图:为什么 `show(block=False)` 并不总是有效?

Barbara Streisand
Barbara Streisand原创
2024-11-03 04:02:02392浏览

How to Plot in a Non-Blocking Way with Matplotlib: Why Does `show(block=False)` Not Always Work?

使用 Matplotlib 以非阻塞方式绘图:解决执行问题

当尝试使用 Matplotlib 绘制函数而不停止执行时,您可能会遇到与 GUI 和后端交互相关的困难。一个常见的误解是 show(block=False) 的用法,它可能并不总是有效,具体取决于后端。

您提供的代码演示了 show(block=False) 的用法,但看起来您是在调用 show() 之前不使用 plt.ion()。 plt.ion() 激活交互模式,允许非阻塞绘图,您可以在其中绘制和暂停更新。

启用 plt.ion() 后,您可以调用 plt.show() 显示绘图窗口。该窗口将保持打开且非阻塞状态,允许您继续执行。但是,要查看更新后的绘图,您需要使用 plt.draw() 重新绘制画布,并使用 plt.pause(timeout) 暂停执行一小段时间。 plt.pause() 中的超时参数决定了暂停的长度(以秒为单位)。

在您的具体情况下,还需要注意的是,每次调用 plt.plot() 时,都会生成一个新绘图在同一窗口中创建。如果您想更新现有绘图,则应使用 plt.plot(x, y, color='r')。这将以红色绘制新数据点,同时保留现有绘图。

下面是代码的修订版本,应解决非阻塞问题并更新现有绘图:

<code class="python">import matplotlib.pyplot as plt
import numpy as np

def main():
    plt.ion()  # Activate interactive mode
    plt.show()  # Display the plot window

    plt.axis([-50,50,0,10000])
    x = np.arange(-50, 51)
    for pow in range(1,5):
        y = [Xi**pow for Xi in x]
        plt.plot(x, y, color='r')  # Update the plot in red color
        plt.draw()
        plt.pause(0.001)  # Pause for a brief period
        input("Press [enter] to continue.")

if __name__ == '__main__':
    main()</code>

以上是如何使用 Matplotlib 以非阻塞方式绘图:为什么 `show(block=False)` 并不总是有效?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn