Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

cartopy逆引き大全

0. 背景

cartopyを使いたいユーザーに向けて、逆引き大全を作成しています。

すべて、サンプルコード付きで紹介しています。

現在、対応しているサンプルコードは以下のとおりです。

  • 基本(basic)
    • cartopyをinstallする
  • 描画(plot)
    • 海岸線を描く
    • 緯度・軽度線を描く
    • 国境線を描く
    • 表示されるエリアを日本域だけにする
    • 複数のグラフを作成する
    • 海や陸地に色をつける
    • パラパラ漫画(.gif)を作成する
    • 図法を変更する
  • データのplot(data)
    • 点をplotする
    • 線をplotする
    • 面データをplotする
    • 文字をplotする
    • カラーバーをplotする
  • 図の体裁(graph-technic)
    • グラフにタイトルを入れる

その他のテーマや質問は、本ブログ・もしくはGithubにてお知らせください。

github.com

1. cartopyをinstallする

pip install cartopy

2-1. 海岸線を描く

import cartopy.crs as ccrs
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

2-2. 緯度・軽度線を描く

import cartopy.crs as ccrs
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=0))
ax.coastlines()

lat_array = np.arange(-90, 90.1, 30)
lon_array = np.arange(-180, 180.1, 30)

gl = ax.gridlines(crs=ccrs.PlateCarree(), linewidth=0.5, linestyle='--')
gl.xlocator = mticker.FixedLocator(lon_array)
gl.ylocator = mticker.FixedLocator(lat_array)
ax.set_xticks(lon_array, crs=ccrs.PlateCarree())
ax.set_yticks(lat_array, crs=ccrs.PlateCarree())
plt.show()

2-3. 国境線を描く

import warnings

import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker


warnings.filterwarnings('ignore')
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

ax.add_feature(cfeature.BORDERS) 

2-4. 表示されるエリアを日本域だけにする

import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

ax.add_feature(cfeature.BORDERS)

ax.set_extent([120, 150, 20, 50], ccrs.PlateCarree())

2-5. 複数のグラフを作成する

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12, 6))

i = 1
for irow in range(1, 4, 1):
    for icol in range(1, 4, 1):
        ax = fig.add_subplot(3, 3, i, projection=ccrs.PlateCarree())
        ax.coastlines()
        i += 1

2-6. 海や陸地に色をつける

import warnings

import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker


warnings.filterwarnings('ignore')
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

ax.add_feature(cfeature.BORDERS)
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.LAKES)

ax.set_extent([90, 150, 20, 50], ccrs.PlateCarree())

2-7. パラパラ漫画(.gif)を作成する

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
from PIL import Image
for i in range(1, 32, 1):
    title = f"2024/01/{str(i).zfill(2)}"

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
    ax.coastlines()

    ax.set_title(title)
    plt.savefig(f"./img/{i}.png")
    plt.close()
pictures=[]


for i in range(1, 32, 1):
    pic_name = f"./img/{str(i)}.png"
    img = Image.open(pic_name)
    pictures.append(img)

pictures[0].save('./gif/anime.gif',save_all=True, append_images=pictures[1:], optimize=True, duration=500, loop=0)

2-8. 図法を変更する

import cartopy.crs as ccrs
import matplotlib.pyplot as plt

# 正距円筒図法
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

#メルカトル図法
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=0))
ax.coastlines()

# ポーラーステレオ図法(極投影図法)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.NorthPolarStereo(central_longitude=0))
ax.coastlines()

# ランベルト図法(ランベルト正角円錐図法)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertConformal(central_longitude=0))
ax.coastlines()

# 正射投影図法(平射図法)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Orthographic(central_longitude=0))
ax.coastlines()

# ロビンソン図法
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Robinson(central_longitude=0))
ax.coastlines()

# モルワイデ図法
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mollweide(central_longitude=0))
ax.coastlines()

# ランベルト正積円筒図法
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertCylindrical(central_longitude=0))
ax.coastlines()

# ミラー図法
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Miller(central_longitude=0))
ax.coastlines()

3-1. 点をplotする

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

ax.scatter(135 + 180, 35, 100, color="red")

ax.set_extent([0, 360, -90, 90], ccrs.PlateCarree())

3-2. 線をplotする

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

ax.plot([100 - 180, 135 - 180, 150 - 180], [30, 40, 50], color="red")

ax.set_extent([0, 360, -90, 90], ccrs.PlateCarree())

3-3. 面データをplotする

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np
lat = np.arange(20, 60, 5)
lon = np.arange(110, 150, 5)
dat = np.zeros((len(lat), len(lon)))

k = 0
for i in range(len(lat)):
    for j in range(len(lon)):
        dat[i, j] = k
        k += 1
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

ax.contourf(lon, lat, dat, transform=ccrs.PlateCarree())
ax.set_extent([0, 360, -90, 90], ccrs.PlateCarree())

3-4. 文字をplotする

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

ax.text(150 - 180, 30, "Hello World!", color="green")

ax.set_extent([0, 360, -90, 90], ccrs.PlateCarree())

3-5. カラーバーをplotする

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np
lat = np.arange(20, 60, 5)
lon = np.arange(110, 150, 5)
dat = np.zeros((len(lat), len(lon)))

k = 0
for i in range(len(lat)):
    for j in range(len(lon)):
        dat[i, j] = k
        k += 1
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()

cs = ax.contourf(lon, lat, dat, transform=ccrs.PlateCarree())
cbar = fig.colorbar(cs)
cbar.set_label('legend text')

ax.set_extent([0, 360, -90, 90], ccrs.PlateCarree())

4-1. グラフにタイトルを入れる

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree(central_longitude=180))
ax.coastlines()
ax.set_extent([0, 360, -90, 90], ccrs.PlateCarree())

ax.set_title("this is title area.")
Text(0.5, 1.0, 'this is title area.')