matplotlib:cartopyのTIPS
作成者:山下陽介(国立環境研究所)
目次
[top]cartopyの基本
cartopyのモジュール
cartopy.crsをインポート
import cartopy.crs as ccrs import matplotlib.pyplot as plt以降はccrsとして参照できる。同時にmatplotlibもインポートしておく
cartopyを呼び出す
fig = plt.figure() # プロット領域の作成(matplotlib) ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) # サブプロット作成時にcartopy呼び出し以降は戻り値axを使い、ax.メソッドのように作図が可能
特に説明がない限り、本ページのaxはこのように作成されたものを表す。
cartopyで経度線・緯度線を描く
import matplotlib.ticker as mticker gl = ax.gridlines(crs=ccrs.PlateCarree()) # 経度線・緯度線を描く gl.xlocator = mticker.FixedLocator(経度線を引く値のリスト) # 経度線の設定 gl.ylocator = mticker.FixedLocator(緯度線を引く値のリスト) # 緯度線の設定バージョン0.17以前では、正距円筒図法、ランベルト正積円筒図法のみ対応
- 例:60度毎に経度線を引く(バージョン0.18)
gl.xlocator = mticker.FixedLocator(np.arange(-180, 180, 30))
バージョン0.17までは有効であった0〜360°の範囲では、西半球で経度線が描かれない - 例:30度毎に緯度線を引く(バージョン0.18)
gl.ylocator = mticker.FixedLocator(np.arange(-90, 90, 30))
- 例:60度毎に経度線を引く(バージョン0.17)
gl.xlocator = mticker.FixedLocator(np.arange(0, 360.1, 60))
360では300°Eまでしか経度線が引かれないため、360.1としている - 例:30度毎に緯度線を引く(バージョン0.17)
gl.ylocator = mticker.FixedLocator(np.arange(-90, 90.1, 30))
90では60°Nまでしか経度線が引かれないため、90.1としている - 例:経度線・緯度線を細い赤破線で描く
gl = ax.gridlines(crs=ccrs.PlateCarree(), linewidth=0.5, linestyle='--', color='r')
線の幅はlinewidth、線種はlinestyle、色はcolorで設定
船種は線種一覧、色の名前は色の名前一覧参照 - 例:経度線・緯度線を不透明度0.8、幅1の黒点線で描く
gl = ax.gridlines(crs=ccrs.PlateCarree(), linewidth=1, linestyle=':', color='k', alpha=0.8)
不透明度は、透明0.0〜不透明1.0までの範囲で指定する
cartopyの経度線・緯度線に目盛り線ラベルを付ける
import matplotlib.ticker as mticker gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True) # 経度線・緯度線ラベルを有効に gl.xlocator = mticker.FixedLocator(経度線を引く値のリスト) # 経度線の設定 gl.ylocator = mticker.FixedLocator(緯度線を引く値のリスト) # 緯度線の設定バージョン0.18以降では、経度線・緯度線ラベルに対応する図法が増えた
- 例:30度毎に経度線・緯度線を不透明度0.8幅1の黒点線で描き、ラベルを付ける
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=1, linestyle=':', color='k', alpha=0.8) gl.xlocator = mticker.FixedLocator(np.arange(-180, 180, 30)) # 経度線の設定 gl.ylocator = mticker.FixedLocator(np.arange(-90, 90, 30)) # 緯度線の設定
- 図の横軸ラベルが省略されてしまう場合
fig = plt.figure(figsize=(8, 6)) # 図の横幅を大きくする
- 例:上と右のラベルを消す
gl.top_labels = False gl.right_labels = False
- 例:下と左のラベルを消す
gl.bottom_labels = False gl.left_labels = False gl.top_labels = True gl.right_labels = True
- 例:0°を中心にすると180°にE/Wが付かないので、150°W〜150°Eにする
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) # 0°を中心 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True) # ラベルを付ける gl.xlocator = mticker.FixedLocator(np.arange(-150, 180, 30)) # 経度線(150°W〜150°E) gl.ylocator = mticker.FixedLocator(np.arange(-90, 90, 30)) # 緯度線
経度線・緯度線と目盛り線ラベルを別々の間隔で設定する
ax.set_xticks、ax.set_yticksを使う
import matplotlib.ticker as mticker gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=False) # 経度線・緯度線ラベルを無効 gl.xlocator = mticker.FixedLocator(経度線を引く値のリスト) # 経度線 gl.ylocator = mticker.FixedLocator(緯度線を引く値のリスト) # 緯度線 ax.set_xticks(経度線ラベルのリスト, crs=ccrs.PlateCarree()) # 経度線ラベル ax.set_yticks(緯度線ラベルのリスト, crs=ccrs.PlateCarree()) # 緯度線ラベル
- 例:30度毎に経度線・緯度線を、60度毎に経度線、30度毎に経度線ラベルを付ける
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=False) # 経度線・緯度線ラベルを無効 gl.xlocator = mticker.FixedLocator(np.arange(-180, 180, 30)) # 経度線 gl.ylocator = mticker.FixedLocator(np.arange(-90, 90.1, 30)) # 緯度線 ax.set_xticks(np.arange(0, 360.1, 60), crs=ccrs.PlateCarree()) # 経度線ラベル ax.set_yticks(np.arange(-90, 90.1, 30), crs=ccrs.PlateCarree()) # 緯度線ラベル
- 例:目盛り線ラベルの表示形式を度数表記にする
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=True)) ax.yaxis.set_major_formatter(LatitudeFormatter())
- 例:目盛り線ラベルのサイズを12ポイントに指定
ax.axes.tick_params(labelsize=12)
- 例:目盛り線とラベルを上と右に付ける
ax.axes.tick_params(top=True, right=True, labeltop=True, labelright=True)
デフォルトでは下と左に付くので上下左右に目盛り線とラベルが付く
ax.axes.tick_paramsで変更される箇所参照
cartopyで海岸線を描く
- ax.coastlinesを使った方法
ax.coastlines()
- cartopy.featureを使った方法
import cartopy.feature as cfeature ax.add_feature(cfeature.COASTLINE)
- 例:海岸線を細くする
ax.add_feature(cfeature.COASTLINE, linewidth=0.8)
- 例:海岸線を細い破線にする
ax.add_feature(cfeature.COASTLINE, linewidth=0.8, linestyle='--')
- 例:海岸線を細くする
cartopyで陸と海、湖を塗り分けて描く
cartopy.featureを使う
import cartopy.feature as cfeature ax.add_feature(cfeature.LAND) # 陸に色を付ける ax.add_feature(cfeature.OCEAN) # 海に色を付ける ax.add_feature(cfeature.LAKES) # 湖を描く
- 例:陸を緑色、海と湖を水色にする
ax.add_feature(cfeature.LAND, color='g') # 陸を緑色で塗り潰す ax.add_feature(cfeature.OCEAN, color='aqua') # 海を水色で塗り潰す ax.add_feature(cfeature.LAKES, color='aqua') # 湖を水色で塗り潰す
色の名前は色の名前一覧参照 - 例:経度線・緯度線を海上だけに描く(zorderで描く順序を指定)
gl = ax.gridlines(crs=ccrs.PlateCarree(), zorder=2) # 経度線・緯度線を描く gl.xlocator = mticker.FixedLocator(経度線を引く値のリスト) gl.ylocator = mticker.FixedLocator(緯度線を引く値のリスト) ax.add_feature(cfeature.LAND, zorder=3) # 陸に色を付ける ax.add_feature(cfeature.OCEAN, zorder=1) # 海に色を付ける
経度線・緯度線については、cartopyで経度線・緯度線を描く参照 - 例:陸と海、湖の解像度を指定する(50mの地図を使う)
ax.add_feature(cfeature.LAND.with_scale('50m'), edgecolor='k', lw=0.5) ax.add_feature(cfeature.OCEAN.with_scale('50m'), edgecolor='k', lw=0.5) ax.add_feature(cfeature.LAKES.with_scale('50m'), edgecolor='k', lw=0.5)
黒色の幅0.5の枠を描く 110m、50m、10mを指定可能
元の地図データはNatural Earth地図データ参照
cartopyで国境線を描く
cartopy.featureを使い、陸上に国境線を描く
import cartopy.feature as cfeature ax.add_feature(cfeature.BORDERS) # 国境線を描く
- 例:国境線を細い破線にする
ax.add_feature(cfeature.BORDERS, linestyle='--', linewidth=0.8)
色を変更するオプションもあるが、意図しない場所が塗り潰されてしまうので使わない方が良い
cartopyで河川を描く
cartopy.featureを使う
import cartopy.feature as cfeature ax.add_feature(cfeature.RIVERS) # 川を描く
- 例:河川の幅を太くする
ax.add_feature(cfeature.RIVERS, linewidth=1.2)
cartopyで海岸線を描く際のWarningを消す
ShapelyDeprecationWarningが出る場合
import warnings warnings.filterwarnings('ignore')
cartopyの描画速度を速くする
cartopy v0.20で、スレッドセーフが保証されている場合には、次のように環境変数を設定することで描画速度が速くなることがある
% export PYPROJ_GLOBAL_CONTEXT=ON
cartopyの地図
サブプロットを生成するfig.add_subplotで図法を指定する
正距円筒図法
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())gradsのlatlonやBasemapのprojection='cyl'に相当する図法で、緯度線・経度線が直角かつ等間隔に交差
正距円筒図法で目盛り線ラベルを付ける際は、cartopyの経度線・緯度線に目盛り線ラベルを付ける参照
- 東経180度を中心にする場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
メルカトル図法
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mercator(central_longitude=中心の経度, min_latitude=緯度下限, max_latitude=緯度上限))
- 例:南緯60度〜北緯60度まで、全ての経度帯で描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mercator(min_latitude=-60.0, max_latitude=60.0))
- 例:南緯60度〜北緯60度まで、東経180度を中心として全ての緯度帯で描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mercator(central_longitude=180.0, min_latitude=-60.0, max_latitude=60.0))
- 例:経度線・緯度線ラベルを付ける
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True)
cartopyバージョン0.18以降で対応
調整方法はcartopyで経度線・緯度線を描く参照
ポーラーステレオ図法(極投影図法)
- 北極を中心に描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.NorthPolarStereo()) ax.set_extent([西端の経度, 東端の経度, 南端の緯度, 北端の緯度], ccrs.PlateCarree())
gradsのnpsに相当する図法 - 南極を中心に描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.SouthPolarStereo()) ax.set_extent([西端の経度, 東端の経度, 南端の緯度, 北端の緯度], ccrs.PlateCarree())
gradsのspsに相当する図法
- 例:南緯90度〜20度まで、全ての経度帯で描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.SouthPolarStereo()) ax.set_extent([-180, 180, -90, -20], ccrs.PlateCarree())
*極投影図法で図枠を円形にすることも可能
ランベルト図法(ランベルト正角円錐図法)
ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertConformal(central_longitude=中心の経度, central_latitude=中心の緯度)) ax.set_extent([西端の経度, 東端の経度, 南端の緯度, 北端の緯度])
- 例:東経135度、北緯35度を中心に日本周辺だけを描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertConformal(central_longitude=135.0, central_latitude=35.0)) ax.set_extent([100, 170, 10, 70]) # 領域の限定
- 例:経度線・緯度線ラベルを付ける
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True)
cartopyバージョン0.18以降で対応
調整方法はcartopyで経度線・緯度線を描く参照
正射投影図法(平射図法)
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Orthographic(central_longitude=中心の経度, central_latitude=中心の緯度))
- 例:東経180度、北緯45度を中心に描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Orthographic(central_longitude=180.0, central_latitude=45.0))
ロビンソン図法
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Robinson(central_longitude=中心の経度))
- 例:東経180度を中心に描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Robinson(central_longitude=180.0))
- 例:経度線・緯度線ラベルを付ける
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True)
cartopyバージョン0.18以降で対応
調整方法はcartopyで経度線・緯度線を描く参照
モルワイデ図法
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mollweide(central_longitude=中心の経度))
- 例:東経180度を中心に描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mollweide(central_longitude=180.0))
- 例:経度線・緯度線ラベルを付ける
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True)
cartopyバージョン0.18以降で対応
調整方法はcartopyで経度線・緯度線を描く参照
ランベルト正積円筒図法
ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertCylindrical(central_longitude=中心の経度))
- 例:東経180度を中心に描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertCylindrical(central_longitude=180.0))
- 例:経度線・緯度線ラベルを付ける
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True)
調整方法はcartopyで経度線・緯度線を描く参照
ミラー図法
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Miller(central_longitude=中心の経度))
- 例:東経180度を中心に描く場合
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Miller(central_longitude=180.0))
- 例:経度線・緯度線ラベルを付ける
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True)
調整方法はcartopyで経度線・緯度線を描く参照
cartopyのデータプロット
経度・緯度データの作成
- np.meshgridを使い2次元配列を作成
nlonsが経度方向のデータ数、nlatsが緯度方向のデータ数で、全球の格子点データの場合。緯度方向は北極が先、南極が後の場合。delta = 360. / (nlons - 1) lon = delta * np.arange(nlons) # 1次元の経度データ lat = 90. - delta * np.arange(nlons) # 2次元の緯度データ x, y = np.meshgrid(lon - 180.0, lat) # 2次元の経度・緯度座標の準備
Numpyのnp.meshgridを使い、経度(lons)、緯度(lats)データを作成する。
1次元目が緯度、2次元目が−180度を開始点とする経度の2次元データになる。
central_longitude=180の場合、データの経度も変更する - NetCDFファイルから読み込んだ経度、緯度の1次元データから作成
lonが経度の1次元データ、latが緯度の1次元データの場合。
import netCDF4 nc = netCDF4.Dataset('ファイル名', 'r') # NetCDFファイルを開く lon = nc.variables['lon'][:] # 経度データ読み込み lat = nc.variables['lat'][:] # 緯度データ読み込み x, y = np.meshgrid(lon - 180.0, lat) # 2次元の経度・緯度座標の準備
1次元目が緯度、2次元目が経度の2次元データになる。
NetCDFファイルについてはNetCDFファイル参照
等高線を描く
ax.contour(経度データ, 緯度データ, 等高線のデータ)オプションや調整方法は、matplotlibの等高線参照
- 例:作成した経度・緯度データと2次元の等高線データ(d)で作図
ax.contour(x, y, d)
- 例:正距円筒図法以外で作図する場合
ax.contour(x, y, d, transform=ccrs.PlateCarree())
- 例:等高線の幅を細くする
ax.contour(x, y, d, linewidths=0.8)
デフォルト値:1
linewidthではなくlinewidthsなので注意 - 例:等高線を描く値を指定する
ax.contour(x, y, slp_jul, clevs, levels=[0, 1, 2, 3, 4, 5])
等高線は0から5まで1毎に描く(levelsで指定) - 例:等高線を2から20まで2毎等間隔に描く
clevs = np.arange(2, 20, 2) # 値のリスト作成 cs = ax.contour(x, y, d, levels=clevs)
またはclevs = np.arange(2, 20, 2) # 値のリスト作成 ax.contour(x, y, d, clevs)
- 例:データの最小値から最大値の範囲内で2毎等間隔に描く
clevs = np.arange(np.floor(d.min()), np.ceil(d.max()), 2) # 値のリスト作成 cs = ax.contour(x, y, d, levels=clevs) # 等高線を描く
dがNumpyのndarrayの場合。最小値よりも小さい最大の整数をnp.floor(d.min())、最大値よりも大きい最小の整数をnp.ceil(d.max())で取得、Numpyの数学関数、Numpyの統計処理参照
等高線ラベルを付ける
cs = ax.contour(経度データ, 緯度データ, 等高線のデータ) clevels = cs.levels # ラベルを付ける値 cs.clabel(clevels) # 等高線ラベル
- 例:文字サイズを指定して等高線ラベルを付ける
cs = ax.contour(x, y, d, levels=[0, 1, 2, 3, 4, 5]) clevels = cs.levels # ラベルを付ける値 cs.clabel(clevels, fontsize=12) # 等高線ラベル
ax.contourの戻り値を使い、等高線のラベルを付ける - 例:ラベルのフォーマット、文字サイズを指定する
cs = ax.contour(x, y, d, levels=[0, 1, 2, 3, 4, 5]) clevels = cs.levels # ラベルを付ける値 cs.clabel(clevels, fontsize=12, fmt="%d") # 等高線ラベル
文字の大きさはfontsize、ラベルの数値のフォーマットはfmtで指定する(ここでは整数値にするためfmt="%d")。 - 例:等高線のラベルを1つ飛ばしに付ける
cs = ax.contour(x, y, d, levels=clevs) clevels = cs.levels # ラベルを付ける値 cs.clabel(clevels[::2]) # 等高線ラベル
cs.clabelにラベルを付ける値をclevels[::2]で与えることで、等高線のラベルを1つ飛ばしに付ける - 例:データの最小値から最大値の範囲内で1.5毎等間隔に描きラベルを付ける
levels = np.arange(np.floor(d.min()), np.ceil(d.max()), 1.5) # 値のリスト作成 cs = ax.contour(x, y, d, levels=clevs) clevels = cs.levels # ラベルを付ける値 cs.clabel(clevels, fontsize=12, fmt="%.1f") # 等高線ラベル
ラベルは1.5毎に付け、小数点以下第一位まで表示(fmt="%.1f")
- 例:等高線を4hPa毎の細線、等高線ラベルを20hPa毎の太線に付ける
levels = np.arange(960, 1061, 4) # 値のリスト作成 cs = ax.contour(x, y, d, levels=levels, colors='k', linewidths=[1.2, 0.8, 0.8, 0.8, 0.8]) # 4hPaの等高線を描く cs.clabel(cs.levels[::5], fmt="%d", fontsize=12) # 5飛ばし(20 hPa毎)にラベルを付ける
陰影を描く
ax.contourf(経度データ, 緯度データ, 陰影のデータ)オプションや調整方法は、matplotlibの陰影参照
- 例:作成した経度・緯度データと2次元の等高線データ(d)で作図
ax.contourf(x, y, d)
- 例:正距円筒図法以外で作図する場合
ax.contourf(x, y, d, transform=ccrs.PlateCarree())
- 例:陰影を描く値を指定する
ax.contourf(x, y, d, clevs, levels=[0, 1, 2, 3, 4, 5, 6])
等高線は0から5まで1毎に描く(levelsで指定、描く値より1大きく設定する) - 例:陰影の色テーブルを指定する(青〜白〜赤と変化)
ax.contourf(x, y, d, clevs, cmap='bwr')
色テーブルは色テーブルの一覧参照
陰影にカラーバーを付ける
cs = ax.contourf(経度データ, 緯度データ, 陰影のデータ) cbar = ax.colorbar(cs) cbar.set_label('カラーバーのラベルに表示する文字列')カラーバーの調整方法については、カラーバー参照
(plt.colorbarと同じオプションを使用可能)
カラーバーの両端に下限を下回った値、上限を上回った値の色を表示する
cs = ax.contourf(経度データ, 緯度データ, 陰影のデータ, extend='both') cbar = ax.colorbar(cs) cbar.set_label('カラーバーのラベルに表示する文字列')
矢羽をプロットする
ax.barbs(経度データ, 緯度データ, 東西風データ, 南北風データ)矢羽の調整方法については、matplotlibの矢羽参照
- 例:2次元データlons, lats, u, vから矢羽をプロット
ax.barbs(x, y, u, v)
- 例:正距円筒図法以外で作図する場合
ax.barbs(x, y, u, v, transform=ccrs.PlateCarree())
- 例:矢羽を6おきにプロット
ax.barbs(lons[::6, ::6], lats[::6, ::6], uwnd[::6, ::6], vwnd[::6, ::6])
- 例:矢羽の色を青色にする
ax.barbs(x, y, u, v, color='b')
色の名前は色の名前一覧参照 - 例:矢羽の長さを4にする
ax.barbs(x, y, u, v, length=4)
- 例:風速の小さい矢羽を描かない
ax.barbs(x, y, u, v, sizes=dict(emptybarb=0.0))
矢印をプロットする
ax.quiver(経度データ, 緯度データ, 東西風データ, 南北風データ)矢印の調整方法については、matplotlibの矢印参照
- 例:2次元データlons, lats, u, vから矢印をプロット
ax.quiver(x, y, u, v)
- 例:正距円筒図法以外で作図する場合
ax.quiver(x, y, u, v, transform=ccrs.PlateCarree())
- 例:矢印を6おきにプロット
ax.quiver(lons[::6, ::6], lats[::6, ::6], uwnd[::6, ::6], vwnd[::6, ::6])
- 例:矢印の色を青色にする
ax.quiver(x, y, u, v, color='b')
色の名前は色の名前一覧参照 - 例:矢印の幅と長さを変える
ax.quiver(x, y, u, v, width=.003, scale=300.)
- 例:矢印の頭の幅を大きくする
ax.quiver(x, y, u, v, headwidth=3.75)
- 例:矢印の凡例を付ける (図枠の中)
Q = ax.quiver(x, y, u, v, color='k', width=.003, scale=300., headwidth=3.75) ax.quiverkey(Q, 0.97, 0.93, 10, '10', color='k', labelsep=0.01)
ax.quiverの戻り値Qを使い、ax.quiverkeyで凡例を描く
図の横軸範囲を0〜1までとした場合の0.97、縦軸の0.93の位置に描く
整数の10は凡例に用いる矢印のサイズ、文字列の'10'は表示する文字
labelsepは凡例と文字の隙間(デフォルト値:0.1) - 例:矢印の凡例を図枠の下に付ける
Q = ax.quiver(x, y, u, v, color='k', width=.003, scale=300., headwidth=3.75) ax.quiverkey(Q, 0.97, -0.04, 10, '10', color='k', labelpos='S', labelsep=0.03)
縦軸範囲の-0.04の位置に描くと図枠の下に表示される
凡例の文字を凡例の矢印の下に付けるため、labelpos='S'とした
labelpos='S'の場合、labelsepの値は大きめに取る
*plt.savefigで保存する場合、bbox_inches='tight'を使用すると凡例が入らないので注意 - 例:矢印の凡例に付ける文字を大きくする
Q = ax.quiver(x, y, u, v, color='k', width=.003, scale=300., headwidth=3.75) ax.quiverkey(Q, 0.97, 0.93, 10, '10', color='k', labelsep=0.01, fontproperties={'size': 14})
fontpropertiesでサイズを変更する(デフォルトは11) - 例:図枠の一部を塗り潰して上に矢印の凡例を付ける
Q = ax.quiver(x, y, u, v, color='k', width=.003, scale=300., headwidth=3.75, zorder=4) # 矢印の凡例を描く領域を作成 rect = plt.Rectangle((155, 70), 25, 20, facecolor='gray', edgecolor=None, zorder=4) ax.add_patch(rect) ax.quiverkey(Q, 0.97, 0.93, 10, '10', color='k', labelsep=0.01)
ax.add_patch(rect)で、灰色に塗り潰した矩形領域を155E、70Nから180E、90Nまで追加する
最初の(155, 70)が始点の座標、2番目は経度幅、3番目は緯度幅を表す
文字をプロットする
ax.textを使う
テキストの調整方法については、matplotlibのテキスト参照
ax.text(x座標, y座標, "表示するテキスト")
- 例:フォントサイズを9に指定する場合
ax.text(x, y, "表示するテキスト", fontsize=9)
- 例:テキストの色を赤にする場合
ax.text(x, y, "表示するテキスト", color='r')
- 例:図枠に対する位置で指定する
ax.text(x, y, "表示するテキスト", color='r', transform=ax.transAxes)
図枠の左下を(0, 0)、右上を(1, 1)とした位置を指定
マーカーをプロットする
ax.plot(x座標, y座標, オプション)
- 例:マーカーを白色の丸にする場合
ax.plot(x, y, marker="o", color="w")
マーカーの名前は指定可能なマーカーの一覧参照
色の名前は色の名前一覧参照 - 例:正距円筒図法以外で作図する場合
ax.plot(x, y, marker="o", color="w", transform=ccrs.PlateCarree())
- 例:マーカーをマゼンタの三角にする場合
ax.plot(x, y, color="m", marker="^")
- 例:マーカーを水色の丸にする場合
ax.plot(x, y, color="aqua", marker="o")
- 例:マーカーサイズを大きくする場合
ax.plot(x, y, color="aqua", marker="o", markersize=12)
デフォルト値:6 - 例:マーカーの縁を黒にする場合
ax.plot(x, y, color="aqua", marker="o", markeredgecolor="k")
*markeredgecolorはmecでもよい - 例:マーカーの縁を描かない場合
ax.plot(x, y, color="aqua", marker="o", markeredgecolor="none")
- 例:マーカーの縁線の太さを2とする
ax.plot(x, y, color="aqua", marker="o", markeredgecolor="k", markeredgewidth=2)
*markeredwidthはmewでもよい
図の体裁
タイトルを付ける
matplotlibのax.set_titleを使う(plt.titleでも同じ)
タイトルの文字サイズや色を変更する参照
ax.set_title("タイトル")サブプロットにタイトルを付ける参照
タイトルの文字サイズや色を変更する参照
極投影図法で図枠を円形にする
図枠をmatplotlibのPathで設定する
cartopyのサンプル参照
import matplotlib.path as mpath center, radius = [0.5, 0.5], 0.5 # 円の中心座標と半径 theta = np.linspace(0, 2 * np.pi, 100) # 0〜2πの位相 verts = np.vstack([np.sin(theta), np.cos(theta)]).T # 円形の座標作成 circle = mpath.Path(verts * radius + center) # 中心座標(0.5, 0.5)、半径0.5の円形 ax.set_boundary(circle, transform=ax.transAxes) # 円形の領域でマスクサブプロットaxが座標(0, 0)、(0, 1)、(1, 1)、(1, 0)を頂点とする四角形なので、それに内接する円形の領域でマスクする
cartopyのサンプル参照
全球が表示されなくなった場合
全球を表示させるために、次の記述を加える
ax.set_global()
0度と360度を滑らかにつなげる
- 経度、緯度が1次元データの場合
cartopy.utilのadd_cyclic_pointを使うfrom cartopy.util import add_cyclic_point d_cyclic, lons_cyclic = add_cyclic_point(d, coord=lons) # 0度の値を360度にコピー ax.contourf(lons_cyclic, lats, d_cyclic)
*2次元データd(緯度方向, 経度方向)、1次元の経度・緯度データlons、lats - 経度、緯度が2次元データの場合
Basemapの極投影図法で0度と360度を滑らかにつなげる参照
都道府県の境界線を描く
cartopy.io.shapereaderを使う
色を塗り分ける場合、colorsリストを作り、facecolor=next(colors)のように与える
import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.io.shapereader as shapereader # 10mの解像度のデータ shpfilename = shapereader.natural_earth(resolution='10m', category='cultural', name='admin_1_states_provinces') # 日本の都道府県のみ取得 provinces = shapereader.Reader(shpfilename).records() prefs = filter(lambda province: province.attributes['admin'] == 'Japan', provinces) # プロット領域の作成 fig = plt.figure(figsize=[6, 8]) # cartopy呼び出し ax = plt.axes(projection=ccrs.PlateCarree()) ax.set_extent([122, 147, 22, 52]) # 図の範囲 ax.coastlines(resolution='10m') # 海岸線を描く(10mの解像度) # 都道府県毎に輪郭を点線で描く for pref in prefs: geometry = pref.geometry ax.add_geometries([geometry], ccrs.PlateCarree(), facecolor='none', linestyle=':')[geometry]のようにリストにする
色を塗り分ける場合、colorsリストを作り、facecolor=next(colors)のように与える
地図の海岸線が消える場合
海岸線と陰影を同時に描く場合、先に海岸線を描くと陰影に隠されてしまう(cartopyバージョン0.19以降)
[top] ax.coastlines(オプション, zorder=10)*zorderを大きくして、上に描かれるようにする