Эффективное построение множества линий в VisPy
Из всех примеров кода / демонстраций, которые я видел в библиотеке VisPy, я вижу только один способ, которым люди рисуют много строк, например:
for i in range(N):
pos = pos.copy()
pos[:, 1] = np.random.normal(scale=5, loc=(i+1)*30, size=N)
line = scene.visuals.Line(pos=pos, color=color, parent=canvas.scene)
lines.append(line)
canvas.show()
Моя проблема в том, что у меня много линий для построения (каждая из нескольких сотен тысяч точек). Matplotlib оказался слишком медленным из-за общего количества нанесенных точек в миллионах, поэтому я переключился на VisPy. Но VisPy работает медленнее, когда вы строите тысячи линий, каждая из которых имеет тысячи точек (ускорение наступает, когда у вас есть миллионы точек).
Основная причина в том, как нарисованы линии. Когда вы создаете виджет графика и затем строите линию, каждая линия отображается на холсте. В matplotlib вы можете явно указать, что холст не будет отображаться до тех пор, пока все линии не будут нарисованы в памяти, но в VisPy такая же функциональность отсутствует, что делает его бесполезным.
Есть ли способ обойти это? Мне нужно построить несколько линий, чтобы я мог изменять свойства в интерактивном режиме, так что объединение всех точек данных в один вызов не будет работать.
(Я использую PyQt4 для встраивания графика в графический интерфейс. Я также рассмотрел pyqtgraph.)
1 ответ
Вы должны передать массив в параметр "connect" функции Line().
xy = np.random.rand(5,2) # 2D positions
# Create an array of point connections :
toconnect = np.array([[0,1], [0,2], [1,4], [2,3], [2,4]])
# Point 0 in your xy will be connected with 1 and 2, point
# 1 with 4 and point 2 with 3 and 4.
line = scene.visuals.Line(pos=xy, connect=toconnect)
Вы добавляете только один объект на свой холст, но контрольная линия более ограничена.