Tex, python, illusrator, VPSの学生ノート

latotex-blog

Python

Pythonでcartopyを使い、国・地域をまとめて色づけする

投稿日:2020年3月22日 更新日:





Pythonでcartopyを使い、国・地域をまとめて色づけする

Pythonではよくcartopyを使って地図を作るのですが、

複数(3つ以上)の国・地域をまとめて指定する場合、苦戦したので書き留めておきます。

なお、国・地域の指定はISOコード(以下のwikiではnumeric)を使用しています。

色付けする国・地域が3つ以下の場合

日本を青に色付けしてみます。3つ以下なら、if文を続けて書いてしまった方が手っ取り早いと思います。

#!/usr/bin/env python3

import matplotlib.pyplot as plt
import cartopy
import cartopy.io.shapereader as shpreader
import cartopy.crs as ccrs
import matplotlib.patches as mpatches

#解像度の設定
set_dpi = 300

#ここから作図
plt.figure(figsize=[16,9])

#シェイプファイルの読み込み
shpfilename = shpreader.natural_earth(resolution='110m',
                                      category='cultural',
                                      name='admin_0_countries')
src = shpreader.Reader(shpfilename)


#陸地・海岸線・国境の作図
ax = plt.axes(projection=ccrs.PlateCarree())
ax.add_feature(cartopy.feature.LAND, facecolor='white', zorder=0)
ax.coastlines(resolution='50m', lw=0.5, zorder=0)
ax.add_feature(cartopy.feature.BORDERS, linestyle='-', alpha=.5, zorder=0)

#国・地域の色付け。色付けが3つ以下であれば、if~を同じように続けて書けばよい
for rec in src.records():

        #392は日本のISOコードのこと
        #rec.attributes['ADM0_A3']でも良いが、対応していない国・地域もあるので注意
        if rec.attributes['ISO_N3'] == '392':
           ax.add_geometries(rec.geometry, ccrs.PlateCarree(), facecolor='b')


#pngで保存
fileo1 = 'map_ja'+'.png'
plt.savefig(fileo1, format='png', dpi=set_dpi)
#plt.show()

色付けする国・地域が3つ以上の場合

2020/06にテレビ会議が予定されていることで話題になっている、G7に含まれる国・地域を色付けしてみます。

 

変更した部分はif文とその直後にあるforループです。break else continueがポイントです。

#!/usr/bin/env python3

import matplotlib.pyplot as plt
import cartopy
import cartopy.io.shapereader as shpreader
import cartopy.crs as ccrs
import matplotlib.patches as mpatches


#解像度の設定
set_dpi = 300

#左からフランス, アメリカ, イギリス, ドイツ, イタリア,日本のISOコード
g7_list =[250, 840, 826, 840, 380, 124, 392]
nlist = len(g7_list)


#ここから作図開始
fig = plt.figure(figsize = (16, 9))

#natural_earthのシェイプファイルを読み込む
shpfilename = shpreader.natural_earth(resolution='110m',
                                      category='cultural',
                                      name='admin_0_countries')
src = shpreader.Reader(shpfilename)


#陸地・海岸線・国境の作図
ax = fig.add_axes([0,0,1,1], projection=ccrs.PlateCarree())
ax.add_feature(cartopy.feature.LAND, facecolor='white', zorder=0)
ax.coastlines(resolution='50m', lw=0.5, zorder=0)
ax.add_feature(cartopy.feature.BORDERS, linestyle='-',zorder=1, edgecolor='k')


#国・地域の色付け
for rec in src.records():

	for L in range(nlist):
		cL = str(g7_list[L])

        #南極(ISOコード010)などコード番号が100以下の国を色付けする場合は、listに10と記入しzfillで埋める
        #break else continueをしないと、最初に指定した国だけ色付けすることになってしまう
		if rec.attributes['ISO_N3'] == cL.zfill(3):
		   ax.add_geometries(rec.geometry,ccrs.PlateCarree(),
                                     edgecolor='b', facecolor='none', hatch='//', zorder=0)
	           break
		else:
	           continue

#legendの設定
LegendElement = [mpatches.Patch(label="Group of Seven", edgecolor='b', facecolor='none', hatch='//')]
ax.legend(handles = LegendElement, loc='lower left', fontsize=30)


#pngで保存
fileo1 = 'map_g7'+'.png'
plt.savefig(fileo1, format='png', dpi=set_dpi)
#plt.show()



-Python
-,

Copyright© latotex-blog , 2020 All Rights Reserved Powered by STINGER.