Python Matplotlib 如何在后台更新图表

3

我正在使用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)

你所说的“我正在做的事情”,是指在绘图更新时尝试执行脚本的不同部分?还是尝试在命令提示符上运行代码? - Novice
任何类型的任务。它可以是在文本编辑器中编写脚本,浏览网页等。当Matplotlib进行更新时,我失去了对文本编辑器的控制。我希望在Windows执行其他任务时,它能在后台静默更新图形。 - Melih Dal
下面的回答有帮到你吗?你在电脑上尝试过示例了吗? - Novice
2个回答

1

这个链接展示了使用matplotlib进行实时绘图的例子。我认为主要的收获是你不需要在每次绘制时都使用plt.show()或plt.draw()。该例子使用set_ydata代替。类似地,可以使用set_xdata来更新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

当我在下面的示例上运行此函数时,我没有任何问题使用计算机上的其他应用程序。
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)

此解决方案在 matplotlib 3.3.1 中已不再适用。 - Astra Uvarova - Saturn's star
我有matplotlib版本3.3.2,并且它没有任何问题地运行。 - Novice
它不再像以前那样工作了,Matplot窗口始终保持在顶部。我使用的是Ubuntu 18.04。 - Astra Uvarova - Saturn's star
好的,你的意思是当你点击一个新应用程序时,窗口没有被覆盖吗?你尝试过将 matplotlib 图形最小化吗?当我点击最小化时,图形就会隐藏。 - Novice

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接