【问题标题】:Python Matplotlib Update Plot in the BackgroundPython Matplotlib 在后台更新绘图
【发布时间】:2019-05-15 10:28:51
【问题描述】:

我正在使用 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 进行更新时,我失去了对文本编辑器的控制。当我在 Windows 中执行其他任务时,我希望它在后台静默更新图表。
  • 下面的答案有帮助吗?你在你的电脑上试过这个例子吗?

标签: python matplotlib background anaconda


【解决方案1】:

link 有一个使用 matplotlib 进行实时绘图的示例。我认为主要的收获是你不需要在每次调用 plot 时都使用 plt.show() 或 plt.draw() 。该示例改为使用 set_ydata。同样 set_xdata 可用于更新您的 x_axis 变量。代码如下

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 起不再有效
  • 我有matplotlib 3.3.2版,运行没问题
  • 它不再像在 Matplot 窗口中那样一直保持在顶部。我有 Ubuntu 18.04
  • 好的,你的意思是当你点击一个新的应用程序时,窗口没有被覆盖?您是否尝试过最小化 matplotlib 图形?当我点击最小化时,数字被隐藏了
【解决方案2】:

我认为这就是您要寻找的。 我有一个类似的问题,通过替换来解决它:

plt.pause(0.01)fig.canvas.flush_events()

这里有更详细的解释: How to keep matplotlib (python) window in background?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-13
    • 2011-07-06
    • 1970-01-01
    • 2018-04-28
    • 2012-06-12
    • 2020-11-06
    • 2011-05-05
    相关资源
    最近更新 更多