2011-10-26 5 views
5

Sto provando a fare una mappa di calore su un file di forma in python. Ho bisogno di fare un bel po 'di questi quindi non voglio leggere in .shp ogni volta.Sovrapposizione di una lineaCollection su un grafico in matplotlib - come far allineare i due.

Invece, ho pensato di creare un'istanza lineCollection dei bordi della mappa e sovrapporre le due immagini. Il problema è che non riesco a far allineare i due correttamente.

Ecco il codice, dove linecol è l'oggetto lineCollection.

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

C'è un modo semplice per fissare i limiti di linecol in modo che corrispondano a quelli dell'altro grafico? Ho avuto un gioco con set_xlim e transforms.Bbox, ma non riesco a gestirlo.

Grazie mille per il vostro aiuto!

risposta

1

Le trasformazioni sono complicate a causa dei vari sistemi di coordinate coinvolti. Vedi http://matplotlib.sourceforge.net/users/transforms_tutorial.html.

Sono riuscito a ridimensionare uno LineCollection nella dimensione appropriata come questo. La chiave era capire che avevo bisogno di aggiungere + ax.transData alla nuova trasformazione che ho impostato su LineCollection. (Quando non si imposta alcuna trasformazione su un oggetto artista, ax.transData è il default Converte le coordinate i dati in coordinate di visualizzazione..)

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

(Output qui:. http://i.stack.imgur.com/hDNN8.png Non abbastanza reputazione da inviare in linea) enter image description here

Dovrebbe essere facile modificarlo se è necessario tradurre la forma o ridimensionarla in modo non uniforme su xe y.

Problemi correlati