python - 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,应该只导致在顶部绘制的当前情节,从而防止一遍又一遍地绘制整个情节。
解决方案
推荐阅读
- python - Pandas Dataframe 逻辑循环
- drupal - 无法在树枝模板中打印 Drupal 分类术语
- r - 决策树错误:替换有 625 行,数据有 266
- python - 我的 Pig 拉丁语翻译器出现问题
- angular - 使用输入绑定将数据从祖父组件传递到子组件
- splunk - 如何从 Splunk 中的 _raw 获取数据
- java - jMeter ServerAgent 在 Windows Server 2016 中崩溃
- ruby-on-rails - 如何更改 kaminari 分页中的参数 - Ruby On Rails
- verilog - Verilog 自检测试台不会运行?构建一个简单的 ALU,这应该不难
- excel - 来自多个列表的计数