使用 Pyglet 可视化大量数据

Visualizing large amount of data using Pyglet

我有一些较大的 csv 文件,其中包含海上雷达记录的数据。雷达显示 2048 个不同角度的接收回波。每个角度可以显示 512 个不同范围的数据。对于每个范围,回声强度存储为 0 到 255 之间的值。

为了可视化数据,我尝试使用 Pyglet 进行批量渲染。一旦显示了第一个旋转(2048 个角度),程序应继续处理数据,显示最新的记录。因此,每次我显示一个角度时,我都会尝试从顶点列表中删除下一个角度,这样它就不会绘制在前一个旋转的顶部。

由于每次旋转可能有 2048*512 个读数,我制作了一个 0f 2048 x 512 的二维列表来存储顶点列表,这样我就可以删除特定类型。请参阅以下代码片段。

import pyglet

win = pyglet.window.Window(1000, 1000)
batch = pyglet.graphics.Batch()

def update(dt):
    stepSize = 10000 # Save the first 10000 measurements in the batch before drawing it
    for i in range(Counter.cnt, Counter.cnt + stepSize):

        (* Calculate the pixel positions of each measurements from the angle and range *)

        # Add to batch and save in 2D list
        arr[angle][currentRange] = batch.add(2, pyglet.gl.GL_LINES, None,
                  ('v2f', (pts[0][0], pts[0][1], pts[1][0], pts[1][1])))

        # Delete everything from the next angle
        for n in range(0, len(arr[nextAngle])):
            try:
                arr[nextAngle][n].delete()
            except:
                pass

@win.event
def on_draw():
    win.clear()
    batch.draw()

if __name__ == '__main__':
    pyglet.clock.schedule_interval(update, 1/120.0)
    pyglet.app.run()

测量值可能应该绘制为多边形或三角形,但由于角度非常接近,所以我使用了直线。

这给了我前几个轮换的很好的结果:

Radar_pyglet1

斑点代表周围的海岛。然而,经过一些轮换后,程序变慢并且显示如下:

Radar_pyglet2

在这张图片中,船发生了旋转,因此图片中岛屿的位置也发生了变化。然而,从图片上可以看出,旋转后显示屏上绘制了许多小点,这些点本不应该存在。此外,部分测量值几乎是随机删除的。

这里可能是什么问题,显示数据的更好方法是什么?

我仍然不完全确定问题的原因,但我找到了解决方法。

我没有使用 VertexList.delete(),而是将 vertexList 的颜色更改为黑色:

# Change color if vertixList exists, otherwise create new 
if arr[angle][currentRange != 0:
    arr[angle][currentRange].colors = [255, 255, 255, 255, 255, 255]
else:
    arr[angle[currentRange] = batch.add(2, pyglet.gl.GL_LINES, None,
        ('v2f', (pts[0][0], pts[0][1], pts[1][0], pts[1][1])),
        ('c3B', (255, 255, 255, 255, 255, 255)))

# Change color of the next angle
for n in range(0, len(arr[nextAngle])):
    try:
        arr[nextAngle][n].colors = [0, 0, 0, 0, 0, 0]
    except:
        pass

使用这个我没有遇到同样的问题。