2011-11-09 5 views
3

J'ai quelques points (environ 3000) et les bords (environ 6000) dans ce type de format:Traçage un grand nombre de points et arêtes dans matplotlib

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

où les arêtes sont des indices en points, de sorte que la début et coordonnées fin de chaque bord est donnée par:

points[edges] 

Je cherche un moyen plus rapide/meilleure façon de les tracer. Actuellement, j'ai:

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') 

Je lis à propos de lineCollections, mais je ne sais pas comment les utiliser. Existe-t-il un moyen d'utiliser mes données plus directement? Quel est le goulot d'étranglement ici?

Certaines données de test plus réalistes, le temps de tracer est environ 132 secondes:

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

Peut-être que http://jbdeaton.com/2011/speed-up-plot-rendering-in-pythonmatplotlib/ pourrait être utile. Ajoutez rasterized = True à l'appel de plot(). –

Répondre

3

Eh bien, j'ai trouvé ce qui suit qui est beaucoup plus rapide:

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') 

Est-il encore possible de le faire plus rapide?

2

Vous pouvez également le faire dans un appel à un seul plot, qui est considérablement plus rapide que deux (bien que probablement essentiellement identique à l'ajout d'un 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() 
Questions connexes