使用 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
使用这个我没有遇到同样的问题。
我有一些较大的 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
使用这个我没有遇到同样的问题。