2011-10-26 17 views
5

Estoy tratando de hacer un mapa de calor sobre un archivo de forma en Python. Necesito hacer bastantes de estos, así que no quiero leer en .shp todo el tiempo.Superposición de un lineCollection en un diagrama en matplotlib - cómo hacer que los dos se alineen.

En su lugar, pensé que podría crear una instancia de lineCollection de los límites del mapa y superponer las dos imágenes. El problema es que parece que no puedo hacer que los dos se alineen correctamente.

Aquí está el código, donde linecol es el objeto lineCollection.

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.contourf(xi,yi,zi) 
ax.add_collection(linecol, autolim = False) 
plt.show() 

¿Hay alguna manera fácil de fijar los límites de linecol para que coincidan con los de la otra gráfica? He jugado con set_xlim y transform.B.Box, pero parece que no puedo gestionarlo.

¡Muchas gracias por su ayuda!

Respuesta

1

Las transformaciones son complicadas debido a los diversos sistemas de coordenadas involucrados. Ver http://matplotlib.sourceforge.net/users/transforms_tutorial.html.

Logré escalar un LineCollection al tamaño apropiado como este. La clave fue darme cuenta de que necesitaba agregar + ax.transData a la nueva transformación que configuré en el LineCollection. (Cuando no se establece ninguna transformación en un objeto artista, ax.transData es el valor predeterminado Convierte los datos en coordenadas de pantalla..)

from matplotlib import cm 
import matplotlib.pyplot as plt 
import matplotlib.collections as mc 
import matplotlib.transforms as tx 
import numpy as np 

fig = plt.figure() 

# Heat map spans 1 x 1. 
ax = fig.add_subplot(111) 
xs = ys = np.arange(0, 1.01, 0.01) 
zs = np.random.random((101,101)) 
ax.contourf(xs, ys, zs, cmap=cm.autumn) 

lines = mc.LineCollection([[(5,1), (9,5), (5,9), (1,5), (5,1)]]) 
# Shape spans 10 x 10. Resize it to 1 x 1 before applying the transform from 
# data coords to display coords. 
trans = tx.Affine2D().scale(0.1) + ax.transData 
lines.set_transform(trans) 
ax.add_collection(lines) 

plt.show() 

(salida aquí:. http://i.stack.imgur.com/hDNN8.png reputación insuficiente para publicar en línea) enter image description here

Debe ser fácil modificar esto si necesita la forma traducida o escalar desigualmente en x e y.

Cuestiones relacionadas