Я написал скрипт для моделирования эволюции пандемии 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)