【Python】 Cartopyでプロット -マーカー-

MAP(地図)

 自由に使える白地図・ベースマップを求めてPython Basemapに辿り着き、トラブルでBasemapが使えなくなった後、Leaflet、GISソフト QGIS等をいじって、只今、Python Cartopy。
  ※ Cartopyは要Python 

 Cartopyをインストールしたのは1年ほど前だが、Jupyterを使い始めてから使用頻度増加。
 基本的には以前のBasemapと同じ。

 いくつか異なる点もあるが、一度地図を表示させることができれば、あとはコピー&ペーストで使い回しできる。
  ※ 地形データの読み込みに時間がかかるので、気長に待つか、再度Runボタン(実行ボタン)を押してみる

スポンサーリンク

地図描画&プロット

 以下、使い回し部分(日本地図の場合)。

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure(figsize=(10,10))
ax=plt.axes(projection=ccrs.PlateCarree())
ax.set_extent((121.0,150.0,22.0,48.0),ccrs.PlateCarree())
import cartopy.feature as cfea
ocean_h = cfea.NaturalEarthFeature('physical', 'ocean', '50m')
ax.add_feature(ocean_h,color='#7fffd4')
land_h = cfea.NaturalEarthFeature('physical', 'land', '10m')
ax.add_feature(land_h,color='#9acd32',edgecolor='grey')
lakes_h = cfea.NaturalEarthFeature('physical', 'lakes', '10m')
ax.add_feature(lakes_h,color='aqua',edgecolor='grey')

 緯度、経度の範囲や色などは適当に変更。
  ※ 範囲が大きいと解像度「10m」では読み込みに時間がかかる。
 landとlakesの輪郭の色 edgecolorを黒からグレーに変えてみた。

 日本語フォントを使う場合、以下も追加。

import matplotlib
font={'family':'IPAexMincho'}
matplotlib.rc('font',**font)

 IPAexMinchoの部分は適当に変更。

 一番最後に出力部分。出力ファイル名は適当に変更。

plt.savefig("20210224.png")
plt.show()

 以上、コピ&ペ部分。

 プロットは、
 ax.plot(経度,緯度,…)で、マーカー。
 ax.text(経度,緯度,…)で、テキスト。重ならないよう適当に調整。ちょっと面倒。

ax.plot(139.4497,36.3402,'ro',markersize='12')
ax.text(139.9,36.3402,'足利',color="purple",fontsize='20')
ax.plot(139.2758,35.7880,'ro',markersize='12')
ax.text(137.0,35.7880,'青梅',color="purple",fontsize='20')

 ax.plot([経度1,経度2],[緯度1,緯度2],…)で、線引き。

ax.plot([139.6722,130.9597],[35.2813,33.9411],'b-',linewidth=2)
ax.text(139.6722,34.5,'yokosuka',color="blue",fontsize='15')
ax.text(130.0,33.0,'moji',color="blue",fontsize='15')

 Basemapでは、

map = Basemap(projection='merc',…)
xpt,ypt = map(lon,lat)

で、経度、緯度をメルカトル図法 mercの座標に変換してからplot()に入れていたが、
 Cartopy(の正距円筒図法 PlateCarree)ではそのまま。

スポンサーリンク

いっぱいプロット

 いっぱいプロットしたい場合、一行一行ax.plot()を並べるよりもCSVファイルなどのデータファイルを読み込んで一括処理したほうが楽。

 例えば、気象庁データなどから以下のような表を作って、202102wind.csvというファイルに保存した場合、

kansokujoLatitudeLongitudewind16_1wind16_2
宗谷岬45.52141.93538.8西南西
稚内45.415141.678333327.3西南西
礼文45.305141.04529.7西南西

 CSVファイルを作業ディレクトリ(デフォルトはホーム)に置いてから
 pandasライブラリのread_csv()で、CSVファイルを読み込むと

import pandas as pd
pwind = pd.read_csv('202102wind.csv',index_col=0)

 pwind(変数名は任意)に表データが格納される。
 あとは……。

 とりあえず今回は、16方位あるうち東西南北4方位の風について<、>、^、vのマーカーでプロット。

wind270 = pwind[pwind['wind16_2']=='東']
lat270 = wind270['Latitude'].tolist()
lon270 = wind270['Longitude'].tolist()

wind90 = pwind[pwind['wind16_2']=='西']
lat90 = wind90['Latitude'].tolist()
lon90 = wind90['Longitude'].tolist()

wind180 = pwind[pwind['wind16_2']=='北']
lat180 = wind180['Latitude'].tolist()
lon180 = wind180['Longitude'].tolist()

wind360 = pwind[pwind['wind16_2']=='南']
lat360 = wind360['Latitude'].tolist()
lon360 = wind360['Longitude'].tolist()

ax.plot(lon90,lat90,">",markersize=8)
ax.plot(lon180,lat180,"v",markersize=8)
ax.plot(lon270,lat270,"<",markersize=8)
ax.plot(lon360,lat360,"^",markersize=8)
2021年2月16日の風データ
スポンサーリンク
ふシゼン
タイトルとURLをコピーしました