1

一些背景:我正在研究 vispy 模块以实时(或尽可能接近)来自仪器的数据。我的尝试随之而来。

from vispy.plot import Fig
from vispy import app,scene
from vispy.visuals import TextVisual
import numpy as np
import Queue
FONT_SIZE = 14
MIN = 0
MAX = 1.1
w_size = 100
N = 5000
M = 2500
color_map = 'cubehelix'
q_size = 1000
Nb = 5

#generate (empty) initial data to fill the plot
data = np.zeros(N*M)
data = np.reshape(data, (N,M))

#setup the plot
fig = Fig(show = False,size = (16*w_size,9*w_size),bgcolor='black')
fig.title = 'my plot'
main_plot = fig[0,0].image(data = data,fg_color='w',cmap=color_map,clim=(MIN,MAX))
fig[0,0].view.camera.aspect = N/float(M) * 16./9.
title = scene.Label("someoutput", font_size=FONT_SIZE, color = 'w')
fig[0,0].grid.add_widget(title, row=0, col=4)
fig[0,0].grid[2,4].border_color = 'black'
fig[0,0].grid[2,4].bgcolor = 'black'
xlabel_title = scene.Label("x_axis [unit]", font_size=FONT_SIZE, color = 'w')
fig[0,0].grid.add_widget(xlabel_title, row=4, col=4)
ylabel_title = scene.Label("y_axis [unit]", font_size=FONT_SIZE,rotation=-90, color='w')
fig[0,0].grid.add_widget(ylabel_title, row=2, col=2)
scale = scene.ColorBarWidget(orientation='left',
             cmap=color_map,
             label='Some value',
             clim=(MIN,MAX),
             border_color = 'w',
             border_width = 1,
             label_color = 'w'
             )
fig[0,0].grid.add_widget(scale, row=2, col=6)
fig[0,0].cbar_right.width_max = \
    fig[0,0].cbar_right.width_min = 50

#fill a queue so to excude the generation time from the plotting time
q = Queue.Queue()
for i in range(q_size):
    new_data = (np.abs(0.5*np.random.randn(Nb*M)[:])).astype('float32')
    new_data = np.reshape(new_data, (Nb,M))
    q.put(new_data[:])

#update function
def update(ev):
    global main_plot, q, data, Nb,M,fig,index            


   #acquire
    new_data = q.get()

    #roll the plot data
    data[Nb:, :] = data[:-Nb, :]
    data[:Nb,:] = new_data

    #recycle the new data
    q.put(new_data)

    #update the plot
    main_plot.set_data(data)
    main_plot.update()



# setup timer
interv = 0.01
timer = app.Timer(interval = interv)
timer.connect(update)
timer.start(interval = interv)


if __name__ == '__main__':
    fig.show(run=True)
    app.run()

此代码当前有效,但比数据速率慢得多。在 vispy 画廊以及一些示例中,我看到更多的点被绘制和更新。我认为主要问题是我每次都完全设置了绘图的所有数据,而不是移动它们并插入新点。

我也看过这个例子: https ://github.com/vispy/vispy/blob/master/examples/demo/scene/oscilloscope.py

但是我不知道如何概括滚动数据的更新函数(我不了解 OpenGL),并且我不能按原样使用该示例,因为我需要一个定量色标(这似乎在 vispy.plot 中很好地实现)。

问题:有没有办法编写一个函数来滚动使用 vispy.plot 类生成的绘图数据?

谢谢。

4

0 回答 0