Python 在慢循环中更新实时绘图,而不使绘图变灰

Python 在慢循环中更新实时绘图,而不使绘图变灰,python,matplotlib,plot,Python,Matplotlib,Plot,有时,我会对循环中的绘图进行实时更新。正常情况下,这可以正常工作,但当循环内的处理需要很长时间时,绘图“灰显”或休眠,但在这段时间的前10秒除外。这可能非常烦人,因为它通常无法区分曲线(当然我可以使用虚线,但是…)。我正在使用Ubuntu,大约10秒是我开始使用Ubuntu的临界时间 下面是一些再现问题的玩具代码,以及一些演示发生了什么的图片 有没有一种简单的方法可以防止这种“变灰”的行为 import numpy as np import pylab as p import time def

有时,我会对循环中的绘图进行实时更新。正常情况下,这可以正常工作,但当循环内的处理需要很长时间时,绘图“灰显”或休眠,但在这段时间的前10秒除外。这可能非常烦人,因为它通常无法区分曲线(当然我可以使用虚线,但是…)。我正在使用Ubuntu,大约10秒是我开始使用Ubuntu的临界时间

下面是一些再现问题的玩具代码,以及一些演示发生了什么的图片

有没有一种简单的方法可以防止这种“变灰”的行为

import numpy as np
import pylab as p
import time

def create_data(i):
    time.sleep(10)  # INCREASE THIS VALUE TO MAKE THE PLOT GREY OUT WHILE IT WAITS
    return np.sin(np.arange(i) * 0.1)

def live_plot(y):
    p.cla()
    p.plot(y)
    p.plot(y**2)
    p.draw()
    p.pause(0.01)

for i in xrange(1000):
    y = create_data(i)
    live_plot(y)

问题是GUI窗口从窗口管理器的PoV变为非响应性窗口,因此它“有益地”将其变灰以告诉您这一点。gnome/unity中可能有一个设置(不确定您正在使用哪个)来禁用此功能。(取决于系统,可能不可能:()

一种解决方案是将计算推送到另一个线程/进程,这将允许您使用阻塞
show
使GUI主循环保持响应。(复杂:()

另一个解决方案是在慢速循环中定期戳GUI循环。我认为调用
fig.canvas.flush\u events()
就足够了


简而言之,GUI(以及通常的异步内容)很难正确使用。

问题是GUI窗口从窗口管理器的PoV变为无响应,因此它“有益地”将其变灰以告诉您这一点。gnome/unity中可能有一个设置(不确定您使用的是哪一个)来禁用此功能。(取决于系统,可能不可能:()

一种解决方案是将计算推送到另一个线程/进程,这将允许您使用阻塞
show
使GUI主循环保持响应。(复杂:()

另一个解决方案是在慢速循环中定期戳GUI循环。我认为调用
fig.canvas.flush\u events()
就足够了


简而言之,GUI(以及一般的异步功能)很难正确使用。

在Ubuntu 18.04中,转到“搜索程序”并在搜索框中键入“compiz”。当ccsm窗口出现时,查找并取消选中“淡入淡出窗口”框。

在Ubuntu 18.04中,转到“搜索程序”并键入“compiz”在搜索框中。当ccsm窗口出现时,查找并取消选中“淡入淡出窗口”框。

在新线程中运行对matplotlib的第一次调用可能值得一试…在新线程中运行对matplotlib的第一次调用可能值得一试。。。