Trazar grandes cantidades de puntos y bordes en matplotlib

Tengo algunos puntos (aproximadamente 3000) y bordes (aproximadamente 6000) en este tipo de formato:

points = numpy.array([1,2],[4,5],[2,7],[3,9],[9,2]) edges = numpy.array([0,1],[3,4],[3,2],[2,4]) 

donde los bordes son índices en puntos, de modo que las coordenadas de inicio y final de cada borde están dadas por:

 points[edges] 

Estoy buscando una manera más rápida / mejor de trazarlos. Actualmente tengo:

 from matplotlib import pyplot as plt x = points[:,0].flatten() y = points[:,1].flatten() plt.plot(x[edges.T], y[edges.T], 'y-') # Edges plt.plot(x, y, 'ro') # Points plt.savefig('figure.png') 

Leí sobre lineCollections, pero no estoy seguro de cómo usarlos. ¿Hay alguna forma de usar mis datos más directamente? ¿Cuál es el cuello de botella aquí?

Algunos datos de prueba más realistas, el tiempo de trazado es de unos 132 segundos:

 points = numpy.random.randint(0, 100, (3000, 2)) edges = numpy.random.randint(0, 3000, (6000, 2)) 

Bueno, encontré lo siguiente que es mucho más rápido:

 from matplotlib import pyplot as plt from matplotlib.collections import LineCollection lc = LineCollection(points[edges]) fig = plt.figure() plt.gca().add_collection(lc) plt.xlim(points[:,0].min(), points[:,0].max()) plt.ylim(points[:,1].min(), points[:,1].max()) plt.plot(points[:,0], points[:,1], 'ro') fig.savefig('full_figure.png') 

¿Todavía es posible hacerlo más rápido?

También puedes hacerlo en una sola plot, que es considerablemente más rápida que dos (aunque probablemente sea lo mismo que agregar una LineCollection).

 import numpy import matplotlib.pyplot as plt points = numpy.array([[1,2],[4,5],[2,7],[3,9],[9,2]]) edges = numpy.array([[0,1],[3,4],[3,2],[2,4]]) x = points[:,0].flatten() y = points[:,1].flatten() plt.plot(x[edges.T], y[edges.T], linestyle='-', color='y', markerfacecolor='red', marker='o') plt.show()