首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用VisPy库进行实时绘图?

如何使用VisPy库进行实时绘图?
EN

Stack Overflow用户
提问于 2020-04-14 16:48:34
回答 1查看 2.2K关注 0票数 3

我写了一个脚本来模拟大流行的演变(用图表和散点图)。我尝试了几个库来实时显示结果(8个国家x500个粒子):

  • Matplotlib (不够快)
  • PyQtGraph (更好,但仍然不够快)
  • OpenGL (很好,但我没有找到如何在2D中有效地使用它,使用子情节、标题、传说……)
  • 波克(很好,但散点图“眨眼”每一次他们的粒子变颜色。)如果您感兴趣,代码是这里 )

这就是我现在转向VisPy的原因。

我使用一个类Visualizer来显示结果,使用app.Timer().connect方法来管理实时方面。Pandemic代码是这里

代码语言:javascript
复制
from Pandemic import *
from vispy.plot import Fig
from vispy import app

class Visualizer:
    def __init__(self, world):
        self.fig = Fig()
        self.world = world
        self.traces = {}

        #Scatter plots
        for idx, c in world.countries.items():
            pos_x = idx % self.world.nb_cols
            pos_y = idx // self.world.nb_cols
            subplot = self.fig[pos_y, pos_x]
            data = np.array([c.x_coord, c.y_coord]).reshape(-1,2)
            self.traces[idx] = subplot.plot(data, symbol='o', width=0, face_color=c.p_colors, title='Country {}'.format(idx+1))

    def display(self): 
        for idx, c in self.world.countries.items():
            data = np.array([c.x_coord, c.y_coord]).reshape(-1,2)
            self.traces[idx].set_data(data, face_color=c.p_colors)

    def update(self, event):
        self.world.update(quarantine=False)
        self.display()

    def animation(self):
        self.timer = app.Timer()
        self.timer.connect(self.update)
        self.timer.start(0)
        self.start()

    def start(self):
        if (sys.flags.interactive != 1):
            self.status = app.run()


if __name__ == '__main__':
    w = World(move=0.001)
    for i in range(8):
        w.add_country(nb_S=500)
    v = Visualizer(w)
    v.animation()

散点图“眨眼”,每次他们的粒子变成颜色,就像博克。我做错了什么吗?

是否有一种更有效的实时显示方式,比如使用vispy.gloo或vispy.scene?(目前它比pyqtgraph.opengl慢)

EN

回答 1

Stack Overflow用户

发布于 2020-04-16 19:15:24

利用vispy.gloo模块可以有效地利用GPU的功耗,实现图形的实时绘制。这里有一种方法:

1)构建继承vispy.app.Canvas类的类。

2)创建一个输入为着色器的OpenGL程序。该对象允许我们将数据链接到着色器变量。画布上的每个点取决于这些变量值(描述其坐标、颜色等)。例如,与Matplotlib库相比,显示文本(标题、标签等)要困难得多。这里是对这个过程的更深入的解释。

3)设置一个与我们要重复调用的函数相连的定时器(实时侧)。

专门为科学家提供高级可视化接口的vispy.scene模块仍处于实验阶段.也许这就是为什么我的第一段代码出现了一些bug的原因。

这里是我的新代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61212937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档