python - font - pyplot title
Dibuja polígonos más eficientemente con matplotlib (2)
Ajusté mi código y ahora está funcionando a la perfección :)
Aquí está el ejemplo de trabajo:
lons = np.array([data[''lon1''],data[''lon3''],data[''lon4''],data[''lon2'']])
lats = np.array([data[''lat1''],data[''lat3''],data[''lat4''],data[''lat2'']])
x,y = m(lons,lats)
pols = zip(x,y)
pols = np.swapaxes(pols,0,2)
pols = np.swapaxes(pols,1,2)
coll = PolyCollection(pols,facecolor=colorval,cmap=jet,edgecolor=''none'',zorder=2)
plt.gca().add_collection(coll)
Tengo un conjunto de fechas de alrededor de 60000 formas (con las coordenadas lat / lon de cada esquina) que quiero dibujar en un mapa usando matplotlib y mapa base.
Así es como lo estoy haciendo en este momento:
for ii in range(len(data)):
lons = np.array([data[''lon1''][ii],data[''lon3''][ii],data[''lon4''][ii],data[''lon2''][ii]],''f2'')
lats = np.array([data[''lat1''][ii],data[''lat3''][ii],data[''lat4''][ii],data[''lat2''][ii]],''f2'')
x,y = m(lons,lats)
poly = Polygon(zip(x,y),facecolor=colorval[ii],edgecolor=''none'')
plt.gca().add_patch(poly)
Sin embargo, esto toma alrededor de 1,5 minutos en mi máquina y estaba pensando si es posible acelerar un poco las cosas. ¿Hay una forma más eficiente de dibujar polígonos y agregarlos al mapa?
Podría considerar crear colecciones de polígonos en lugar de polígonos individuales.
Los documentos relevantes se pueden encontrar aquí: http://matplotlib.org/api/collections_api.html Con un ejemplo digno de seleccionar una aplicación aquí: http://matplotlib.org/examples/api/collections_demo.html
Como ejemplo:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import PolyCollection
import matplotlib as mpl
# Generate data. In this case, we''ll make a bunch of center-points and generate
# verticies by subtracting random offsets from those center-points
numpoly, numverts = 100, 4
centers = 100 * (np.random.random((numpoly,2)) - 0.5)
offsets = 10 * (np.random.random((numverts,numpoly,2)) - 0.5)
verts = centers + offsets
verts = np.swapaxes(verts, 0, 1)
# In your case, "verts" might be something like:
# verts = zip(zip(lon1, lat1), zip(lon2, lat2), ...)
# If "data" in your case is a numpy array, there are cleaner ways to reorder
# things to suit.
# Color scalar...
# If you have rgb values in your "colorval" array, you could just pass them
# in as "facecolors=colorval" when you create the PolyCollection
z = np.random.random(numpoly) * 500
fig, ax = plt.subplots()
# Make the collection and add it to the plot.
coll = PolyCollection(verts, array=z, cmap=mpl.cm.jet, edgecolors=''none'')
ax.add_collection(coll)
ax.autoscale_view()
# Add a colorbar for the PolyCollection
fig.colorbar(coll, ax=ax)
plt.show()
HTH,