0. 背景
cartopyを使いたいユーザーに向けて、逆引き大全を作成しています。
すべて、サンプルコード付きで紹介しています。
現在、対応しているサンプルコードは以下のとおりです。
- 基本(basic)
- 描画(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.')