ホーム > 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.メソッドのように作図が可能

cartopyで経度線・緯度線を描く

import matplotlib.ticker as mticker
gl = ax.gridlines(crs=ccrs.PlateCarree()) # 経度線・緯度線を描く
gl.xlocator = mticker.FixedLocator(経度線を引く値のリスト)
gl.ylocator = mticker.FixedLocator(緯度線を引く値のリスト)
正距円筒図法、ランベルト正積円筒図法のみ対応

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の地図

サブプロットを生成するfig.add_subplotで図法を指定する

正距円筒図法

ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
gradsのlatlonやBasemapのprojection='cyl'に相当する図法で、緯度線・経度線が直角かつ等間隔に交差

メルカトル図法

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のデータプロット

経度・緯度データの作成

nlonsが経度方向のデータ数、nlatsが緯度方向のデータ数で、全球の格子点データの場合。緯度方向は北極が先、南極が後の場合。
delta = 360. / (nlons - 1)
lats = (90. - delta * np.indices((nlats, nlons))[0, :, :])
Numpyのnp.indicesを使い、経度(lons)、緯度(lats)データを作成し、図法に対応した(x, y)データに変換する(Basemapの経度・緯度データの作成と同じ)
1次元目が緯度、2次元目が経度データになる

等高線を描く

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と同じオプションを使用可能)

矢羽をプロットする

ax.barbs(経度データ, 緯度データ, 東西風データ, 南北風データ)
矢羽の調整方法については、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=col, linestyle=':')
[geometry]のようにリストにする
[top]