- 0. 背景
- 1. cartopyをinstallする
- 2-1. 海岸線を描く
- 2-2. 緯度・軽度線を描く
- 2-3. 国境線を描く
- 2-4. 表示されるエリアを日本域だけにする
- 2-5. 複数のグラフを作成する
- 2-6. 海や陸地に色をつける
- 2-7. パラパラ漫画(.gif)を作成する
- 2-8. 図法を変更する
- 3-1. 点をplotする
- 3-2. 線をplotする
- 3-3. 面データをplotする
- 3-4. 文字をplotする
- 3-5. カラーバーをplotする
- 4-1. グラフにタイトルを入れる
0. 背景
cartopyを使いたいユーザーに向けて、逆引き大全を作成しています。
すべて、サンプルコード付きで紹介しています。
現在、対応しているサンプルコードは以下のとおりです。
- 基本(basic)
- cartopyをinstallする
- 描画(plot)
- 海岸線を描く
- 緯度・軽度線を描く
- 国境線を描く
- 表示されるエリアを日本域だけにする
- 複数のグラフを作成する
- 海や陸地に色をつける
- パラパラ漫画(.gif)を作成する
- 図法を変更する
- データのplot(data)
- 点をplotする
- 線をplotする
- 面データをplotする
- 文字をplotする
- カラーバーをplotする
- 図の体裁(graph-technic)
- グラフにタイトルを入れる
その他のテーマや質問は、本ブログ・もしくはGithubにてお知らせください。
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.')