K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

日本地図

中級

06.1.1

日本地図

最終更新 2020-01-29 読了時間 4 分
まとめ
japanmap パッケージを使うと、都道府県別の売上や人口のような値を、47 都道府県を塗り分けた日本地図(コロプレス図)として見せられます。picture() を引数なしで呼べば白地図の画像配列が返り、{"北海道": "#a9e5bb", "青森": "#fcf6b1"} のように県名をキー、色をバリューにした辞書を渡せばその色で各県が塗られます。地図は plt.imshow で表示するただの画像なので、plt.xticks([]) で目盛りを消す以外に特別な描画処理は要りません。関東や近畿だけを見せたいときは pref_map(groups["近畿"], cols=…) で地域を拡大できます。Python 3.9 以上で動きます。

パッケージの情報は japanmap(PyPI)、ソースコードは SaitoTsutomu/japanmap(GitHub)、作者本人による使い方の説明は 県別データの可視化(Qiita) にあります。pip install japanmap で入り、Python 3.9 以上が必要です。開発者に感謝!

直感 #

47 都道府県の値を棒グラフにすると 47 本の棒が並び、「北の県ほど高い」「太平洋側に集まっている」という地理的な偏りは読めません。地図の上で 47 県を値に応じた色で塗ると、その偏りが形として見えます。japanmap がやっていることは、県名と色の対応表を受け取り、県の形に沿って色を塗った 1 枚の画像を返すことだけです。あとは plt.imshow で表示します。

地図を表示する #

次のコードは picture() を引数なしで呼び、塗り分けのない白地図を表示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import matplotlib.pyplot as plt
import numpy as np
from japanmap import picture

np.random.seed(77)

plt.figure(figsize=(10, 10))
plt.xticks([])
plt.yticks([])
plt.imshow(picture())

plt.show()

地図を表示するの図

着色する #

県名をキー、色名をバリューにした次のような辞書を picture() に渡すと、その県がその色で塗られます。辞書に含めなかった県は白のまま残ります。

{'北海道': '#a9e5bb', '青森': '#fcf6b1', '沖縄': '#fcf6b1'}

次のコードは 5 色のパレットから各県にランダムに 1 色を選んで辞書を作り、47 都道府県を塗り分けます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
colors = [
    "#e3170a",
    "#a9e5bb",
    "#fcf6b1",
    "#f7b32b",
    "#2d1e2f",
]

prefectures = [
    "北海道",
    "青森",
    "岩手",
    "宮城",
    "秋田",
    "山形",
    "福島",
    "茨城",
    "栃木",
    "群馬",
    "埼玉",
    "千葉",
    "東京",
    "神奈川",
    "新潟",
    "富山",
    "石川",
    "福井",
    "山梨",
    "長野",
    "岐阜",
    "静岡",
    "愛知",
    "三重",
    "滋賀",
    "京都",
    "大阪",
    "兵庫",
    "奈良",
    "和歌山",
    "鳥取",
    "島根",
    "岡山",
    "広島",
    "山口",
    "徳島",
    "香川",
    "愛媛",
    "高知",
    "福岡",
    "佐賀",
    "長崎",
    "熊本",
    "大分",
    "宮崎",
    "鹿児島",
    "沖縄",
]

pref_color_dict = {prefecture: np.random.choice(colors) for prefecture in prefectures}

plt.figure(figsize=(10, 10))
plt.xticks([])
plt.yticks([])
plt.imshow(picture(pref_color_dict))

print(f"入力:{pref_color_dict}")

plt.show()
入力:{'北海道': '#2d1e2f', '青森': '#2d1e2f', '岩手': '#f7b32b', '宮城': '#e3170a', '秋田': '#e3170a', '山形': '#a9e5bb', '福島': '#2d1e2f', '茨城': '#f7b32b', '栃木': '#e3170a', '群馬': '#f7b32b', '埼玉': '#2d1e2f', '千葉': '#2d1e2f', '東京': '#fcf6b1', '神奈川': '#f7b32b', '新潟': '#f7b32b', '富山': '#a9e5bb', '石川': '#f7b32b', '福井': '#a9e5bb', '山梨': '#a9e5bb', '長野': '#2d1e2f', '岐阜': '#e3170a', '静岡': '#2d1e2f', '愛知': '#a9e5bb', '三重': '#e3170a', '滋賀': '#a9e5bb', '京都': '#fcf6b1', '大阪': '#f7b32b', '兵庫': '#2d1e2f', '奈良': '#f7b32b', '和歌山': '#a9e5bb', '鳥取': '#2d1e2f', '島根': '#e3170a', '岡山': '#2d1e2f', '広島': '#e3170a', '山口': '#a9e5bb', '徳島': '#f7b32b', '香川': '#2d1e2f', '愛媛': '#f7b32b', '高知': '#fcf6b1', '福岡': '#2d1e2f', '佐賀': '#2d1e2f', '長崎': '#2d1e2f', '熊本': '#fcf6b1', '大分': '#a9e5bb', '宮崎': '#fcf6b1', '鹿児島': '#a9e5bb', '沖縄': '#2d1e2f'}

入力:{‘北海道’: ‘#2d1e2f’, ‘青森’: ‘#2d1e2f’, ‘岩手’: ‘#f7b32b’, ‘宮城’…の図

実行結果の読み方 #

印字された辞書と地図を見比べると、北海道が #2d1e2f(濃紫)、東京が #fcf6b1(薄黄)と対応しています。この例の色はランダムなので地理的な意味はありませんが、実データで「値が大きいほど濃い」色を割り当てれば、同じ地図がそのまま都道府県別のヒートマップになります。東京や大阪のように面積の小さい県は色が見えにくいので、値の大きい県が小さく見える「面積の錯覚」には注意が必要です。

特定の地域のみを拡大表示する #

関東・近畿などの地域だけを拡大したいときは、pref_map に地域の県番号リストを渡します。次のコードは groups に定義済みの 8 地域を印字し、近畿の 7 府県だけを描きます。

1
2
3
4
5
6
7
8
from japanmap import get_data, groups, pref_map

print(f"groups: {groups}")
pref_map(
    groups["近畿"], cols=[np.random.choice(colors) for _ in groups["近畿"]], qpqo=get_data()
)

plt.show()
groups: {'北海道': [1], '東北': [2, 3, 4, 5, 6, 7], '関東': [8, 9, 10, 11, 12, 13, 14], '中部': [15, 16, 17, 18, 19, 20, 21, 22, 23], '近畿': [24, 25, 26, 27, 28, 29, 30], '中国': [31, 32, 33, 34, 35], '四国': [36, 37, 38, 39], '九州': [40, 41, 42, 43, 44, 45, 46, 47]}

![groups: {‘北海道’: [1], ‘東北’: [2, 3, 4, 5, 6, 7], ‘関東’: 8, 9,…の図

使いどころと落とし穴 #

都道府県別の売上・人口・感染者数のように、47 の値に地理的な偏りがあるかを一望したいときに向いています。picture() に渡す辞書さえ作れば描けるので、値から色への変換(matplotlib.cm.Blues などのカラーマップ)に集中できます。一方、東京や大阪のように面積の小さい県は色が見えにくく、北海道は面積が大きいだけで目立つので、「値が大きい = 面積が大きい」と誤読されやすい。すべての県を同じ大きさの正方形で並べる タイルマップ なら、面積に依存せずに 47 県を比べられます。

色の区切りにも注意が要ります。連続的なグラデーションでは 1,000 と 1,200 のような微妙な差が見えないので、「500 未満」「500〜1,000」「1,000 以上」のように意味のある閾値で 3〜5 段階に区切った離散カラーマップのほうが読みやすいことが多いです。picture() の画像には凡例が付かないため、matplotlib.colorbar や plt.legend で色と値の対応を必ず添えてください。