Cartopy에 Contable을 쓰지 않으면 Conter가 지구를 한 바퀴 도는 상황을 반대로 돌릴 수 있습니다

(2010/10/20 보충)
Cartopy 0.18.0 위의 오류가 수정된 것 같습니다.

컨디션


Python 3.7.4
Matplotlib 3.1.1
Cartopy 0.17.0

무슨 일이 있었죠?


나는 어떻게 표현해야 할지 몰라서 먼저 문제도를 소개한다.
데이터는 기상 데이터(JRA-5520hPa 지세 높이 [gpm])입니다.

등치선을 제대로 그리지 않고 경도 0도 근처에서 동시에 역방향?같은 위도에서 회전합니다. 그림과 같이 극점을 포함하는 투영도 (여기는 ccrs. Azimuthal Equidistant) 에서 발생하는 문제로 간주됩니다.
어떤 Stackoverflow뉴스.에 따르면 경도의 배열도 잊지 않고 물건cyclic로 만들었는데, 알고 보니 하고 있었구나.
(add cyclic point는 이쪽뉴스.에서도 시각적으로 설명합니다.)
import numpy as np
from cartopy.util import add_cyclic_point

#色々省略

lon = np.arange(0, 360, 1.25) #ここでは358.75まで
f_cycle, lons = add_cyclic_point(f, cood=lon) #360まで拡張,経度情報はlonsへ格納,fは描くデータ
반대ddcyclic_그림을 그릴 때point가 없으면,

1주일 역전'문제는 피하지만, 경도 0도 부근에서 틈이 생긴다.
라벨을 쓰지 않으면 이 문제가 발생하지 않을 것이다.

내가 직접 조사해 보았지만 아직 이 문제를 회피할 방법을 찾지 못했다.
2018년 Stackoverflow뉴스.에서 이 문제에 대해 Cartopy 개발자도 협조하고 있는데 그 이후는 어떻게 되었을까.

타협안


라벨이 붙은 변환기를dd-cyclic_이것은 일종의 포인트가 없는 방법이다.
필요한 최소한의 라벨을 붙일 수 있지만 라벨이 달린 컨트롤러는 경도 0도 근처에서 끊긴다.
# ラベル用の数列
lev1 = np.arrange(0, 200001, 100) #狭めの間隔
lev1n = lev1 #lev1を残す場合のための複製
lev5 = np.arrange(0, 200001, 400) #広めの間隔
for l in lev5:
    lev1n = lev1n[~(lev1n==l)] #lev1(lev1n)からlev5と同一な要素を取り除く

''' 中身を列挙すると
lev1:  0, 100, 200, 300, 400, 500, 600, ...
lev5:  0,                400,           ...
lev1n:    100, 200, 300,      500, 600, ...
'''

# lev1nを使ったコンター,add_cyclic_pointあり,ラベルなし
c1 = ax.contour(lons, lat, f_cycle, lev1n, linewidth=0.8, transform=ccrs.PlateCarree())
# lev5を使ったコンター,add_cyclic_pointなし,ラベルあり
c5 = ax.contour(lon, lat, f, lev5, linewidth=1.3, transform=ccrs.PlateCarree())
c5.clabel(fmt='%5.0f', fontsize=9)
바로 이렇다. 이른바 타협안이다.

lev1n의 목록 내용은 누군가의 보도를 참고한 것으로 생각나면 덧붙인다.
어쨌든 이 처리를 하지 않으면 라벨 뒤에 좁은 제어점이 있어서 읽기가 어려울 것 같습니다.
만약 참고할 수 있다면 대단히 영광스럽습니다.

좋은 웹페이지 즐겨찾기