Я хотел бы предложить использовать pyqtgraph в этом случае. Цитирование из документации:
Ее основные задачи являются 1) для обеспечения быстрой, интерактивной графики для отображения данных (графиков, видео и т.д.) и 2) предоставлять средства для оказания помощи в быстрой разработке приложений (для Например, деревья свойств, такие как , используемые в Qt Designer).
Вы можете проверить некоторые примеры после установки:
import pyqtgraph.examples
pyqtgraph.examples.run()
Этот небольшой фрагмент кода генерирует 1000 случайных точек и отображает их в 3D-диаграммы рассеяния, постоянно обновляя непрозрачность, похожий на 3D разбросом пример участка в pyqtgraph.examples
:
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.opengl as gl
import numpy as np
app = QtGui.QApplication([])
w = gl.GLViewWidget()
w.show()
g = gl.GLGridItem()
w.addItem(g)
#generate random points from -10 to 10, z-axis positive
pos = np.random.randint(-10,10,size=(1000,3))
pos[:,2] = np.abs(pos[:,2])
sp2 = gl.GLScatterPlotItem(pos=pos)
w.addItem(sp2)
#generate a color opacity gradient
color = np.zeros((pos.shape[0],4), dtype=np.float32)
color[:,0] = 1
color[:,1] = 0
color[:,2] = 0.5
color[0:100,3] = np.arange(0,100)/100.
def update():
## update volume colors
global color
color = np.roll(color,1, axis=0)
sp2.setData(color=color)
t = QtCore.QTimer()
t.timeout.connect(update)
t.start(50)
## Start Qt event loop unless running in interactive mode.
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
Малый GIF, чтобы дать вам представление о производительности:
EDIT:
Отображение нескольких точек на каждом шаге по времени немного сложнее, так как gl.GLScatterPlotItem
занимает только (N,3)-arrays
в местах точек, см here. Вы можете попытаться сделать словарь ScatterPlotItems
, где каждый из них включает все временные шаги для определенной точки. Затем нужно будет соответствующим образом адаптировать функцию обновления. Вы можете найти пример ниже, где pos
- это (100,10,3)-array
, представляющий 100 временных шагов для каждой точки. Я сократил время обновления до 1000 ms
для более медленной анимации.
from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.opengl as gl
import numpy as np
app = QtGui.QApplication([])
w = gl.GLViewWidget()
w.show()
g = gl.GLGridItem()
w.addItem(g)
pos = np.random.randint(-10,10,size=(100,10,3))
pos[:,:,2] = np.abs(pos[:,:,2])
ScatterPlotItems = {}
for point in np.arange(10):
ScatterPlotItems[point] = gl.GLScatterPlotItem(pos=pos[:,point,:])
w.addItem(ScatterPlotItems[point])
color = np.zeros((pos.shape[0],10,4), dtype=np.float32)
color[:,:,0] = 1
color[:,:,1] = 0
color[:,:,2] = 0.5
color[0:5,:,3] = np.tile(np.arange(1,6)/5., (10,1)).T
def update():
## update volume colors
global color
for point in np.arange(10):
ScatterPlotItems[point].setData(color=color[:,point,:])
color = np.roll(color,1, axis=0)
t = QtCore.QTimer()
t.timeout.connect(update)
t.start(1000)
## Start Qt event loop unless running in interactive mode.
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
Имейте в виду, что в этом примере, все точки показаны на точечную, однако, цвет Непрозрачность (четвёртое измерение в массиве цвета) обновляется на каждом шаге по времени, чтобы получить анимацию. Вы также можете попытаться обновить точки вместо цвета, чтобы получить лучшую производительность ...
Как я могу продолжить, если мой список 'pos' содержит позиции для 10 точек для 100 временных меток. Где бы я интегрировал это в свой код? Для каждого timestep мне понадобится что-то вроде 'plot (pos [timestep0: timestep1])'. Было бы здорово, если бы вы могли дать мне подсказку! – Samuel
Я включил пример в обновление –