2011-10-26 3 views
5

파이썬에서 모양 파일에 대한 히트 맵을 만들려고합니다. 나는 이들 중 상당수를 만들 필요가 있으므로 매번 .shp를 읽지 않으려 고합니다.matplotlib의 플롯에 lineCollection을 오버레이하는 방법 - 두 줄을 정렬하는 방법.

대신지도 경계의 lineCollection 인스턴스를 만들고 두 이미지를 오버레이 할 수 있다고 생각했습니다. 문제는 - 나는 두 사람이 정확하게 일렬로 정렬되는 것처럼 보이지 않습니다.

다음은 코드입니다. 여기서 linecol은 lineCollection 객체입니다.

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

linecol의 한계를 다른 플롯의 한계와 쉽게 일치시키는 방법은 있습니까? 나는 set_xlim과 transforms.Bbox를 가지고 놀았지만 그것을 관리하는 것처럼 보일 수 없다.

도움 주셔서 감사합니다.

답변

1

변형은 다양한 좌표계가 관련되어있어 까다로운 작업입니다. http://matplotlib.sourceforge.net/users/transforms_tutorial.html을 참조하십시오.

LineCollection을 이와 같이 적절한 크기로 조절할 수있었습니다. 핵심은 LineCollection에 설정된 새 변환에 + ax.transData을 추가해야한다는 것을 깨닫는 것이 었습니다. (당신이 어떤 예술가 객체 변환 설정하지 않는 경우, ax.transData가 기본값입니다 그것은 데이터가 표시 좌표로 좌표 변환합니다..)

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

(여기 출력 :. 인라인을 게시 할 수 http://i.stack.imgur.com/hDNN8.png 충분하지 않은 평판) enter image description here

x와 y에 동일하지 않게 변환되거나 크기가 조정 된 모양이 필요한 경우이 값을 쉽게 수정해야합니다.

관련 문제