2011-10-26 10 views
5

Próbuję zrobić mapę ciepła nad plikiem kształtu w python. Muszę zrobić kilka z nich, więc nie chcę czytać w .shp za każdym razem.Nakładanie kolekcji liniowej na działce w matplotlib - jak ustawić dwie linie.

Zamiast tego, pomyślałem, że mogę utworzyć instancję lineCollection granic mapy i nałożyć dwa obrazy. Problem polega na tym, że nie mogę sprawić, żeby obaj ustawili się poprawnie.

Oto kod, w którym linecol jest obiektem lineCollection.

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

Czy istnieje prosty sposób na ustalenie granic linecolu, aby dopasować je do pozostałych działek? Grałem z set_xlim i transforms.Bbox, ale nie mogę tego zarządzać.

Dziękuję bardzo za pomoc!

Odpowiedz

1

Transformacje są trudne z powodu różnych systemów współrzędnych. Zobacz http://matplotlib.sourceforge.net/users/transforms_tutorial.html.

Udało mi się przeskalować LineCollection do odpowiedniego rozmiaru w ten sposób. Kluczem było uświadomienie sobie, że muszę dodać + ax.transData do nowej transformacji ustawionej na LineCollection. (Jeśli nie ustawić dowolny przekształcać na obiekcie artysty, ax.transData jest domyślnie konwertuje dane współrzędne do współrzędnych wyświetlania..)

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

(Wyjście tutaj. http://i.stack.imgur.com/hDNN8.png mało reputacji odpowiedzieć inline) enter image description here

Powinien być łatwy do modyfikowania, jeśli potrzebujesz kształtu przetłumaczonego lub skalibrowanego nierównomiernie na X i Y.

Powiązane problemy