首页 > 解决方案 > 使用 Pyglet 可视化大量数据

问题描述

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

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

由于每次旋转可能有 2048*512 个读数,我制作了一个 2D 列表 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()

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

这在前几次旋转中给了我一个很好的结果:

雷达_pyglet1

这些斑点代表海上周围的岛屿。然而,经过一些旋转后,程序变得更慢,显示如下:

雷达_pyglet2

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

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

标签: pythonpyglet

解决方案


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

我没有使用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

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


推荐阅读