작성자: admin 작성일시: 2016-05-24 11:20:30 조회수: 621 다운로드: 60
카테고리: Python 태그목록:

matplotlib의 triangular grid 사용법

matplotlib 버전 1.3 삼각 그리드(triangular grid)에 대한 지원이 추가되었다. 삼각 그리드를 사용하연 기존의 사각형 영역 뿐 아니라 임의의 영역에 대해서 컨투어 플롯이나 서피스 플롯을 그릴 수 있으므로 정의역(domain)이 아닌 2차원 함수를 시각화하는데 많이 사용된다.

패키지

삼각 그리드 지원을 위한 코드 중 일부는 tri 서브 패키지 아래에 있으므로 미리 임포트한다.

In [1]:
import matplotlib.tri as mtri

삼각 그리드 클래스

삼각 그리드 생성

삼각 그리드는 Triangulation 클래스로 생성한다. Triangulation 클래스는 x. y, triangles 세 개의 인수를 받는데 x, y는 일련의 점들의 x좌표와 y좌표를 나타내는 1차원 벡터들이고 triangles는 이 점들에 대한 기하학적 위상 정보 즉, 어떤 삼각형이 있으며 각 삼각형이 어떤 점들로 이루어져있는가를 보인다. 만약 triangles가 주어지지 않으면 자동으로 생성한다.

In [2]:
x = np.asarray([0, 1, 2])
y = np.asarray([0, np.sqrt(3), 0])
triangles = [[0, 1, 2]]
triang = mtri.Triangulation(x, y, triangles)
plt.triplot(triang, 'ko-')
plt.xlim(-0.1, 2.1)
plt.ylim(-0.1, 1.8)
plt.show()
In [3]:
x = np.asarray([0, 1, 2, 3, 4, 2])
y = np.asarray([0, np.sqrt(3), 0, np.sqrt(3), 0, 2*np.sqrt(3)])
triangles = [[0, 1, 2], [2, 3, 4], [1, 2, 3], [1, 3, 5]]
triang = mtri.Triangulation(x, y, triangles)
plt.triplot(triang, 'ko-')
plt.xlim(-0.1, 4.1)
plt.ylim(-0.1, 3.7)
plt.show()

그리드 세분화

그리드를 더 세분화하려면 TriRefiner 또는 UniformTriRefiner를 사용한다. 이 클래스들은 다음과 같은 메서드를 가진다.

In [4]:
refiner = mtri.UniformTriRefiner(triang)
triang2 = refiner.refine_triangulation(subdiv=2)
plt.triplot(triang2, 'ko-')
plt.xlim(-0.1, 4.1)
plt.ylim(-0.1, 3.7)
plt.show()

그리드 플롯

In [5]:
triang5 = refiner.refine_triangulation(subdiv=5)
z5 = np.cos(1.5*triang5.x)*np.cos(1.5*triang5.y)
plt.tricontourf(triang5, z5)
plt.show()
In [6]:
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

triang3 = refiner.refine_triangulation(subdiv=3)
z3 = np.cos(1.5*triang3.x)*np.cos(1.5*triang3.y)

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(triang3.x, triang3.y, z3, cmap=cm.jet, linewidth=0.2)
ax.tricontourf(triang3, z3, zdir='z', offset=-1.2, cmap=cm.coolwarm)
ax.set_zlim(-1.2, 1)
plt.show()

질문/덧글

np.asarray moon*** 2016년 10월 11일 1:47 오전

위 예에 np.asarray가 쓰였는데 np.array와 np.asarray의 차이점이 무엇인가요?

구글링을해보니 copy값이 True / False 의 차이라는데 copy가 무슨 의미인지 모르겠습니다.

답변: np.asarray 관리자 2016년 10월 12일 7:03 오후

http://stackoverflow.com/questions/14415741/numpy-array-vs-asarray
위 링크를 보시면 아시겠지만 asarray 함수 내부에서 array 함수를 호출합니다. 따라서 실질적으로 동일합니다.
다만 array 함수는 몇 가지 추가적인 옵션을 줄 수 있고 그 중 하나가 copy 옵션입니다.
copy 옵션을 True로 하면 별도의 객체를 만들고 False이면 동일한 객체의 view를 만듭니다. copy와 view의 차이는 다음 코드를 참조하세요.

x = np.array([1, 2, 3])
y = np.array(x, copy=True)
z = np.array(x, copy=False)

z[0] = 11
print(x)
print(y)
print(z)

y[0] = 22
print(x)
print(y)
print(z)