Python Matplotlib在后台更新绘图

Python Matplotlib在后台更新绘图,python,matplotlib,background,anaconda,Python,Matplotlib,Background,Anaconda,我正在使用Matplotlib在Anaconda提示符中绘制实时事件。 当我通过plt.draw()或plt.show()更新绘图时,我失去了对我正在做的事情的控制。“打印”窗口的行为类似于单击,这会在命令提示下阻止我的其他控件 我试着加上 plt.show(block=False) 但这没用 代码如下所示 fig, ax = plt.subplots() plt.ion() plt.show(block=False) while(True): ax.plot(y_plt_points

我正在使用Matplotlib在Anaconda提示符中绘制实时事件。
当我通过plt.draw()或plt.show()更新绘图时,我失去了对我正在做的事情的控制。“打印”窗口的行为类似于单击,这会在命令提示下阻止我的其他控件

我试着加上

plt.show(block=False)
但这没用

代码如下所示

fig, ax = plt.subplots()
plt.ion()
plt.show(block=False)
while(True):
    ax.plot(y_plt_points,x_plt_points,'ro')
    plt.draw()
    plt.pause(0.01)
这是一个使用matplotlib进行实时打印的示例。我认为主要的收获是,不需要在每次调用plot时都使用plt.show()或plt.draw()。该示例使用set_ydata代替。Simalarly set_扩展数据可用于更新x_轴变量。代码如下

import matplotlib.pyplot as plt
import numpy as np

# use ggplot style for more sophisticated visuals
plt.style.use('ggplot')

def live_plotter(x_vec,y1_data,line1,identifier='',pause_time=0.1):
    if line1==[]:
        # this is the call to matplotlib that allows dynamic plotting
        plt.ion()
        fig = plt.figure(figsize=(13,6))
        ax = fig.add_subplot(111)
        # create a variable for the line so we can later update it
        line1, = ax.plot(x_vec,y1_data,'-o',alpha=0.8)        
        #update plot label/title
        plt.ylabel('Y Label')
        plt.title('Title: {}'.format(identifier))
        plt.show()

    # after the figure, axis, and line are created, we only need to update the y-data
    line1.set_ydata(y1_data)
    # adjust limits if new data goes beyond bounds
    if np.min(y1_data)<=line1.axes.get_ylim()[0] or np.max(y1_data)>=line1.axes.get_ylim()[1]:
    plt.ylim([np.min(y1_data)-np.std(y1_data),np.max(y1_data)+np.std(y1_data)])
# this pauses the data so the figure/axis can catch up - the amount of pause can be altered above
plt.pause(pause_time)

# return line so we can update it again in the next iteration
return line1
导入matplotlib.pyplot作为plt
将numpy作为np导入
#使用ggplot样式获得更复杂的视觉效果
plt.style.use('ggplot'))
def live_绘图仪(x_vec,y1_数据,第1行,标识符='',暂停时间=0.1):
如果line1=[]:
#这是对matplotlib的调用,允许动态打印
plt.ion()
图=plt.图(图尺寸=(13,6))
ax=图添加_子批次(111)
#为该行创建一个变量,以便稍后更新它
第1行=最大曲线图(x_向量,y1_数据,'-o',α=0.8)
#更新打印标签/标题
plt.ylabel('Y标签')
plt.title('title:{}'。格式(标识符))
plt.show()
#创建图形、轴和线之后,我们只需要更新y数据
第1行。设置数据(y1数据)
#如果新数据超出范围,则调整限制
如果np.min(y1_数据)=line1.axes.get_ylim()[1]:
plt.ylim([np.min(y1_数据)-np.std(y1_数据),np.max(y1_数据)+np.std(y1_数据)])
#这会暂停数据,以便图形/轴可以跟上-暂停的数量可以在上面更改
plt.暂停(暂停时间)
#返回行,以便我们可以在下一次迭代中再次更新它
回路线1
当我在下面的示例中运行此函数时,我在使用计算机上的其他应用程序时没有任何问题

size = 100
x_vec = np.linspace(0,1,size+1)[0:-1]
y_vec = np.random.randn(len(x_vec))
line1 = []
i=0
while i<1000:
    i=+1
    rand_val = np.random.randn(1)
    y_vec[-1] = rand_val
    line1 = live_plotter(x_vec,y_vec,line1)
    y_vec = np.append(y_vec[1:],0.0)
size=100
x_vec=np.linspace(0,1,大小+1)[0:-1]
y_vec=np.random.randn(len(x_vec))
第1行=[]
i=0

我想这就是你要找的。 我有一个类似的问题,通过替换:

plt.暂停(0.01)
具有
fig.canvas.flush\u events()

更详细的解释如下:

所谓“我正在做的事情”,您的意思是在更新情节时尝试执行脚本的不同部分吗?或者尝试在命令提示符下运行代码?任何类型的任务。它可以在文本编辑器中编写脚本、浏览网页等。在matplotlib进行更新时,我失去了对文本编辑器的控制。当我在windows中执行其他任务时,我希望它在后台悄悄地更新图形。下面的答案有用吗?您在您的计算机上尝试过该示例吗?此解决方案从matplotlib 3.3.1开始不再有效我有matplotlib 3.3.2版,并且运行没有问题它不再有效,因为在Matplot窗口中始终处于顶部。我有Ubuntu18.04Ok,你的意思是当你点击一个新的应用程序时窗口没有被覆盖?您是否尝试过最小化matplotlib图形?当我点击最小化时,图形被隐藏