1D X, Y 및 Z 변수를 사용하는 Python의 2D 등고선 플롯
제가 Python을 처음 접했음을 인정하면서이 쿼리를 시작하겠습니다. 프로세스를 자동화하기 위해 Python에서 데이터의 등고선 플롯을 만들고 싶습니다. 그렇지 않으면 Surfer를 사용하여 쉽게 수행 할 수 있습니다. 나는 그러한 데이터 파일이 1000 개 있고 수동으로 생성하는 것은 매우 지루할 수 있습니다. 내가 사용하는 데이터는 다음과 같이 0, 1 및 2 헤더와 1,2, .. 279가 인덱스로있는 데이터 프레임입니다.
0 1 2
0 3 -1 -0.010700
1 4 -1 0.040100
2 5 -1 0.061000
3 6 -1 0.052000
4 7 -1 0.013100
.. .. .. ...
275 30 -9 -1.530100
276 31 -9 -1.362300
277 32 -9 -1.190200
278 33 -9 -1.083600
279 30 -10 -1.864600
[280 rows x 3 columns]
여기,
x=data[0]
y=data[1]
z=data[2]
contour 함수 pf matplotlib는 z가 2D 배열이어야하므로; 이것이 혼란이 시작되는 곳입니다. stackoverflow 쿼리의 여러 솔루션에 따라 다음을 수행했습니다.
import numpy as np
x=np.array(x)
y=np.array(y)
z=np.array(z)
X, Y = np.meshgrid(x, y)
import scipy.interpolate
rbf = scipy.interpolate.Rbf(x, y, z, function='cubic')
Z=rbf(X,Y)
lmin=data[2].min()
lmax=data[2].max()
progn=(lmax-lmin)/20
limit=np.arange(lmin,lmax,progn)
fig, ax = plt.subplots(figsize=(6,2)) #x ranges between 3 to 57, y -1 to -10
ax.contour(X,Y,Z,limit)
ax.set_title('Contour Plot')
plt.show()
위의 코드를 사용하면이 플롯이 파생됩니다.
그러나 이는 바람직하지 않으며 표면 노이즈 선을 통해 한 번 볼 수있는 경우 아래에 정렬 된 등고선이 있으며, 이는 여기 서퍼에 의해 생성 된 등고선 플롯에서 볼 때 실제로 원하는 것입니다.
동일한 데이터가 서퍼 플롯을 생성하는 데 사용되었다는 사실을 반복하고 싶습니다.
원하는 플롯을 만드는 데 도움을 주시면 감사하겠습니다.
답변
답변에 대한 @JohanC에게 감사드립니다. 나는 그의 제안을 내 질문과 함께 관점에 넣고 싶습니다.
ax.contour
대체 ax.tricontour
내 상황 을 해결합니다. 그리고 ax.tricontourf
윤곽 채우기가 완료됩니다. 따라서 내 코드의 마지막 부분은 다음과 같습니다.
fig, ax = plt.subplots(figsize=(6,2)) #x ranges between 3 to 57, y -1 to -10
ax.tricontour(X,Y,Z,limit)
ax.tricontourf(X,Y,Z,limit)
ax.set_title('Contour Plot')
plt.show()