首页 > 解决方案 > Python 中的快速流线图

问题描述

我想在本地流式传输绘图数据。我的第一种方法是编写一个附加 csv 文件的生产者,并定期调用消费者来读取临时 csv 文件并更新绘图。

我想要一个更轻量级的解决方案,所以改变了一些事情,见下面的代码。但是它仍然对cpu很重,我怎样才能减少负载并使其更快,它不需要使用matplotlib。任何建议都会有所帮助。

我的想法是,由于数据和绘图仅在本地计算机上,因此删除整个生产者并将 csv 加载到数据框中。我以秒为单位将时间戳数据转换为时间增量,并使用所有这些数据的迭代器(time_iterator)创建一个可迭代对象,以便稍后调用函数。为了绘制我的数据,我将我的 x,y 数据放入另一个带有 zip 的可迭代对象中。在绘制了大约 1000 个数据点之后,我注意到 cpu 的速度变慢并且举重很大,是否有更好/更优雅的方法来解决这个问题?

代码部分来自这里这里

更新:在搜索快速流绘图时,我从 Matplotlib 更改为 pyQt 5,性能更好,满足我的需要。因为我不需要所有的 GUI 上限。我正在研究 QCustomplot/pyQtGraph

# load data into dataframe
df = sw.import_csv_data_v2(id)


# hold all delay values, when plot function should be called
factor = 86400 #sec / day
_ = ((df['timedelta'] / factor)*100).astype('int') #  1 day = 0.1 sec in ms
time_iterator = iter(_) 


# iterator for values to pass to plotter 
y = df['data1']
x = df['timestamp']
message = zip(x,y)


xdata, ydata = [], []
fig, ax = plt.subplots()
fig.autofmt_xdate()
#ax.format_xdata = dates.DateFormatter('%Y-%m-%d')
scatter, = plt.plot([], [], color='orange', marker='o', linestyle='', markersize=2 )   


# gets called once
def initfu():
    ax.set_xlim((0, 1))
    ax.set_ylim((0, 1))
    return scatter,


#plotter function
def plotter(frames):
    xdata.append(frames[0])        
    ydata.append(frames[1])        
    
    scatter.set_data((xdata, ydata))                            
    
    xlim_low, xlim_high = ax.get_xlim()
    ylim_low, ylim_high = ax.get_ylim()         
    ax.set_xlim(min(xdata),max(xdata) + pd.Timedelta(10, unit='D'))     
    y1max = max(ydata)
    y1min = min(ydata)
    current_ymax = y1max
    current_ymin = y1min
    ax.set_ylim((current_ymin - 2), (current_ymax + 2))
    
    return scatter,


# call function to plott
anima = FuncAnimation(fig, plotter, frames=message,  init_func=initfu, blit=True, interval=next(time_iterator))  
plt.show()


所以基本上应该发生的是函数'plotter'被调用从next(time_iterator)传递的每个整数值并发送一条附加到xdata / ydata列表然后绘制的消息,blit = True,应该只导致在顶部绘制的当前情节,从而防止一遍又一遍地绘制整个情节。

标签: pythonmatplotlibstream-processing

解决方案


推荐阅读