Эффективное построение множества линий в 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)

Вы добавляете только один объект на свой холст, но контрольная линия более ограничена.

Другие вопросы по тегам