本記事では、下図のように地図を描く雛形コードを載せました。
日本地図のデータは下記リンク先にある「全国」より取得できます。都道府県の地図データは「全国」から抽出することができますし、個別に「都道府県名」より取得することもできます。
nlftp.mlit.go.jp
上記よりダウンロードしたファイル形式は、geojson と shp(dbf, prj, shx, xml)の2種類が同梱されていて、どちらもライブラリ「geopandas」で使用可能です。
■「geopandas」のインストール方法
conda install geopandas
本雛形コードの途中でマップデータと連結することで、市町村別の数値データを地図上に描くことができます。例えば、冒頭の右図には東海3県の市町村別の米の収穫量を色分けで図示しました。さらに、そのトップ10の市町村名を地図上に記載しています。(使用したデータはネットから探してきた「出典:令和2年生産農業所得統計」を元に事前に成形したものを使いました。
■本プログラム
import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
geojson_path = 'N03-20210101_GML/N03-21_210101.geojson'
gdf_japan = gpd.read_file(geojson_path)
gdf_japan
gdf_japan.plot(column='N03_001', legend=False, figsize=(10, 10))
my_group = gdf_japan.groupby("N03_001").groups.keys()
my_group
target_list = ['愛知県', '岐阜県', '三重県']
gdf = gdf_japan.query('N03_001 in @target_list')
gdf
gdf.plot(column='N03_001', cmap='viridis', legend=True, figsize=(10, 10))
gdf.to_file('tokai3ken.shp')
gdf.to_file('tokai3ken.geojson', driver='GeoJSON')
file_path = '出典_令和2年生産農業所得統計.xlsx'
sheet_list = ['愛知県','岐阜県','三重県']
df_list = []
for sheet in sheet_list:
_df = pd.read_excel(file_path,
sheet_name = sheet,
engine = "openpyxl"
)
df_list.append(_df)
df = pd.concat(df_list)
df
new_gdf = gpd.GeoDataFrame(pd.merge(gdf, df, left_on='N03_004', right_on='市区町村名', how='left'))
new_gdf.isna().sum()
new_gdf2 = new_gdf.drop_duplicates(subset="市区町村名", keep='last')
new_gdf2
target_col_name = '米 の収穫量(t/年)'
top10 = new_gdf2.nlargest(10, target_col_name)
top10
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
new_gdf.plot(column=target_col_name, cmap='cool', linewidth=0.8, ax=ax, edgecolor='0.8', legend=True)
plotted_cities = set()
for index, row in top10.iterrows():
label = row['N03_004']
if label not in plotted_cities:
geometry = row['geometry']
x, y = geometry.centroid.x, geometry.centroid.y
ax.text(x, y, label, fontsize=8, ha='center', va='center', color='black', bbox=dict(facecolor='white', alpha=0.7))
plotted_cities.add(label)
plt.title(target_col_name)
plt.show()
以上
<広告>
リンク
リンク
リンク