본문 바로가기
파이썬으로 배우는 지구과학

파이썬을 이용하여 해수 경도-깊이별 컬러맵(color map) 그리기

by 0대갈장군0 2022. 10. 4.
반응형

지난 포스팅에서는 아래와 같이 그래프를 완성하였습니다.

이 상태 만으로도 보기에 크게 나쁘지는 않습니다. 하지만 그래프 안에 색깔을 넣어주면 좀 더 시각적 효과가 좋을 것 같습니다. 이럴 때 보통 값의 크기에 따라 색깔을 입혀주는 color map이라는 것이 있습니다. 코드를 살펴보겠습니다. 지난 포스팅에서의 전체 코드는

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata
import csv

f=open("c:\\111\\rowdatafile\\1042021ver3.csv")
data=csv.reader(f)

xlon=[]
ydepth=[]
ztemp=[]
next(data)

for row in data:
    if row[3].split('-')[1]=='02':
        xlon.append(row[2])
        ydepth.append(row[4])
        ztemp.append(row[5])
xi = np.linspace(129.5,131.6,200)
yi = np.linspace(0,500,200)
zi = griddata((xlon,ydepth), ztemp, (xi[None,:], yi[:,None]), method='cubic')
CS=plt.contour(xi,yi,zi, linewidths=1, colors='black', linestyles="--", levels=[0.7,2,4,6,8,10,12])
CS.clabel(fmt='%3.2f', fontsize=10)
plt.xlabel('long(deg)')
plt.ylabel('depth(m)')
plt.ylim(500,0)
plt.title('East sea temp. distribution')
plt.savefig('C:\\111\\seatemp.jpg',bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()

이었습니다. 여기에 이 코드만 추가하면 됩니다.

plt.contourf(xi,yi,zi, cmap='bwr', vmin=-15, vmax=35, levels=100)

plt.contourf가 color map을 그려주는 코드인데, 값은 xi,yi,zi이고 cmap은 색상입니다. 색상은 색상차트에서 마음에 드는걸로 골라쓰면 됩니다. 저는 bwr을 사용하였습니다. 색상차트는 아래 홈페이지를 참고해 주세요.

Choosing Colormaps in Matplotlib — Matplotlib 3.6.0 documentation

Note Click here to download the full example code Choosing Colormaps in Matplotlib Matplotlib has a number of built-in colormaps accessible via matplotlib.colormaps. There are also external libraries that have many extra colormaps, which can be viewed in t

matplotlib.org

vmin은 색상의 최소값, vmax는 색상의 최대값입니다. levels는 -15에서 35까지 100개 숫자 간격으로 하겠다는 겁니다. 숫자를 바꿔가며 해 보시면 차이를 금방 알 수 있습니다.

여기서 수온 분포는 대략 0도에서 12도까지인데 -15에서 35까지 한 이유는 간단합니다. 숫자가 0에서 12까지라고 해서, vmin과 vmax도 0에서 12로 해 버리면 색깔이 너무 빨강 파랑이 되어버립니다. 보기좋게 은은한 파스텔 톤으로 하려고 일부러 저리 범위를 크게 잡았습니다. 이 내용을 추가한 전체 코드는

반응형
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata
import csv

f=open("c:\\111\\rowdatafile\\1042021ver3.csv")
data=csv.reader(f)

xlon=[]
ydepth=[]
ztemp=[]
next(data)

for row in data:
    if row[3].split('-')[1]=='02':
        xlon.append(row[2])
        ydepth.append(row[4])
        ztemp.append(row[5])
xi = np.linspace(129.5,131.6,200)
yi = np.linspace(0,500,200)
zi = griddata((xlon,ydepth), ztemp, (xi[None,:], yi[:,None]), method='cubic')
CS=plt.contour(xi,yi,zi, linewidths=1, colors='black', linestyles="--", levels=[0.7,2,4,6,8,10,12])
CS.clabel(fmt='%3.2f', fontsize=10)
levels=np.linspace(-2,12,11)
plt.contourf(xi,yi,zi, cmap='bwr', vmin=-25, vmax=35, levels=1000)
plt.xlabel('longitude(deg)')
plt.ylabel('depth(m)')
plt.ylim(500,0)
plt.title('East sea temp. distribution')
plt.savefig("C:\\111\\seatemp.jpg",dpi=300)
plt.show()

입니다. 실행하면

짠~! 어떤가요? 이제 좀 예쁜 그래프가 튀어나왔는데 몇 군데 손볼곳이 있습니다.
1. 우선 맨 오른쪽에 값이 없어 허연 부분이 있습니다. xlim을 이용하여 필요없는 공간을 지우겠습니다.
2. 가장 중요한건데, color map의 색깔에 해당하는 숫자가 얼마인지를 모릅니다. colorbar를 표시해 주겠습니다. 딱 두줄만 추가하면 끝입니다.

plt.colorbar().set_label(label='temperature(℃)')
plt.xlim(129.5,131.5)

요 두줄입니다. 요걸 추가한 전체 코드는

이 코드를 실행하면

이제 좀 봐줄만한 그래프가 나왔습니다.그런데 x축값이 너무 다닥다닥 붙어있어 보기 안좋습니다. 솎아내겠습니다. 아래 코드를 추가하세요.

plt.xticks(np.arange(129.5,131.6,0.5))

이렇게 까지 한 최종 코드는

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata
import csv

f=open("c:\\111\\rowdatafile\\1042021ver3.csv")
data=csv.reader(f)

xlon=[]
ydepth=[]
ztemp=[]
next(data)

for row in data:
    if row[3].split('-')[1]=='02':
        xlon.append(row[2])
        ydepth.append(row[4])
        ztemp.append(row[5])
xi = np.linspace(129.5,131.6,200)
yi = np.linspace(0,500,200)
zi = griddata((xlon,ydepth), ztemp, (xi[None,:], yi[:,None]), method='cubic')
CS=plt.contour(xi,yi,zi, linewidths=1, colors='black', linestyles="--", levels=[0.7,2,4,6,8,10,12])
CS.clabel(fmt='%3.2f', fontsize=10)
levels=np.linspace(-2,12,11)
plt.contourf(xi,yi,zi, cmap='bwr', vmin=-25, vmax=35, levels=1000)
plt.colorbar().set_label(label='temperature(℃)')
plt.xlabel('longitude(deg)')
plt.ylabel('depth(m)')
plt.xticks(np.arange(129.5,131.6,0.5))
plt.xlim(129.5,131.5)
plt.ylim(500,0)
plt.title('East sea temp. distribution')
plt.savefig("C:\\111\\seatemp.jpg",dpi=300)
plt.show()

이제 코드를 실행하면

짠. 어떤가요 이제 봐줄만한 그래프가 나왔습니다.

여기서 왼쪽이 허연데, 이건 해당 정점에서는 수심이 그만큼 깊지 않아 관측 값이 없기 때문입니다.
이와같은 방법을 이용하면 염분, 용존산소 분포도 어렵지 않게 그릴 수 있습니다. 코드에 들어갈 변수만 살짝살짝 바꾸어 가며 그려보면 아마 어렵지 않게 그려낼 수 있으리라 생각이 드네요.

반응형

댓글