ホーム > matplotlibの使い方 > cartopyのTIPS

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以前では、正距円筒図法、ランベルト正積円筒図法のみ対応

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以降では、経度線・緯度線ラベルに対応する図法が増えた

経度線・緯度線と目盛り線ラベルを別々の間隔で設定する

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())  # 緯度線ラベル

cartopyで海岸線を描く

cartopyで陸と海、湖を塗り分けて描く

cartopy.featureを使う
import cartopy.feature as cfeature
ax.add_feature(cfeature.LAND) # 陸に色を付ける
ax.add_feature(cfeature.OCEAN) # 海に色を付ける
ax.add_feature(cfeature.LAKES) # 湖を描く

cartopyで国境線を描く

cartopy.featureを使い、陸上に国境線を描く
import cartopy.feature as cfeature
ax.add_feature(cfeature.BORDERS) # 国境線を描く

cartopyで河川を描く

cartopy.featureを使う
import cartopy.feature as cfeature
ax.add_feature(cfeature.RIVERS) # 川を描く

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の経度線・緯度線に目盛り線ラベルを付ける参照

メルカトル図法

ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mercator(central_longitude=中心の経度, min_latitude=緯度下限, max_latitude=緯度上限))

ポーラーステレオ図法(極投影図法)

ランベルト図法(ランベルト正角円錐図法)

ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertConformal(central_longitude=中心の経度, central_latitude=中心の緯度))
ax.set_extent([西端の経度, 東端の経度, 南端の緯度, 北端の緯度])

正射投影図法(平射図法)

ax = fig.add_subplot(1, 1, 1, projection=ccrs.Orthographic(central_longitude=中心の経度, central_latitude=中心の緯度))

ロビンソン図法

ax = fig.add_subplot(1, 1, 1, projection=ccrs.Robinson(central_longitude=中心の経度))

モルワイデ図法

ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mollweide(central_longitude=中心の経度))

ランベルト正積円筒図法

ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertCylindrical(central_longitude=中心の経度))

ミラー図法

ax = fig.add_subplot(1, 1, 1, projection=ccrs.Miller(central_longitude=中心の経度))

cartopyのデータプロット

経度・緯度データの作成


等高線を描く

ax.contour(経度データ, 緯度データ, 等高線のデータ)
オプションや調整方法は、matplotlibの等高線参照

等高線ラベルを付ける

cs = ax.contour(経度データ, 緯度データ, 等高線のデータ)
clevels = cs.levels # ラベルを付ける値
cs.clabel(clevels) # 等高線ラベル

陰影を描く

ax.contourf(経度データ, 緯度データ, 陰影のデータ)
オプションや調整方法は、matplotlibの陰影参照

陰影にカラーバーを付ける

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の矢羽参照

矢印をプロットする

ax.quiver(経度データ, 緯度データ, 東西風データ, 南北風データ)
矢印の調整方法については、matplotlibの矢印参照

文字をプロットする

ax.textを使う テキストの調整方法については、matplotlibのテキスト参照
ax.text(x座標, y座標, "表示するテキスト")

マーカーをプロットする

ax.plot(x座標, y座標, オプション)

図の体裁

タイトルを付ける

matplotlibのax.set_titleを使う(plt.titleでも同じ)
ax.set_title("タイトル")
サブプロットにタイトルを付ける参照
タイトルの文字サイズや色を変更する参照

極投影図法で図枠を円形にする

図枠をmatplotlibのPathで設定する
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度を滑らかにつなげる

都道府県の境界線を描く

cartopy.io.shapereaderを使う
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以降)
ax.coastlines(オプション, zorder=10)
*zorderを大きくして、上に描かれるようにする
[top]