Как строить графики в реальном времени с помощью библиотеки VisPy? - PullRequest
1 голос
/ 14 апреля 2020

Я написал скрипт для моделирования эволюции пандемии c (с графиками и точечными диаграммами). Я попробовал несколько библиотек для отображения результатов в режиме реального времени (8 стран x 500 частиц):

  • Matplotlib (недостаточно быстро)
  • PyQtGraph (лучше, но все еще недостаточно быстро)
  • OpenGL (хорошо, но я не нашел, как эффективно использовать его в 2D, используя сюжеты, заголовки, легенды ...)
  • Боке (хорошо, но графики разброса "мигают" каждый время, когда их частицы окрашиваются. Код здесь , если вам интересно)

Вот почему я обращаюсь теперь к VisPy.

Я использую класс Visualizer для отображения результатов с помощью метода app.Timer().connect для управления стороной в реальном времени. Pandemic код здесь .

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)

1 Ответ

0 голосов
/ 16 апреля 2020

Мы можем эффективно строить графики в режиме реального времени, используя модуль vispy.gloo, чтобы использовать возможности графического процессора. Вот один из способов сделать это:

1) Создать класс, который наследует класс vispy.app.Canvas.

2) Создать программу OpenGL, входные данные которой являются шейдерами. Этот объект позволяет нам связать наши данные с переменными шейдера. Каждая точка на холсте зависит от этих значений переменных (описывает ее координату, цвет и т. Д. c). Например, отображать текст (заголовки, метки и т. Д. c) гораздо сложнее, чем с библиотекой Matplotlib. Здесь - более глубокое объяснение процесса.

3) Установите таймер, связанный с функцией, которую мы хотим вызывать повторно (сторона реального времени).

The * Модуль 1012 *, посвященный интерфейсам визуализации высокого уровня для ученых, все еще находится в стадии эксперимента. Возможно, именно поэтому мой первый код получил некоторые ошибки.

Здесь - мой новый код.

...