R パッケージ一覧library(rmapshaper)
library(rnaturalearth) # CRAN未登録
library(sf)
library(geofacet)
library(tidyverse)
library(geofacet)
library(zipangu)ggplot2} で地図をプロットする方法は様々| パッケージ名 | 詳細 |
|---|---|
{rnaturalearth} |
:Natural Earthのデータ(国や海域の地理空間データを提供) |
{rnaturalearthdata} |
:Natural Earthのデータ(高解像度) |
{rgeos} |
|
{pacman}パッケージの p_load()関数を使って
3 つのパッケージを同時にダウンロードするpackman
パッケージ
・パッケージ管理ツール (packman パッケージ)を使うと
install.packges()
コマンドを使わなくてもパッケージをインストールしロードできる
・CRAN や GitHub
上に存在するパッケージを必要に応じてインストールしつつ読み込める
・packman
パッケージを最初に使うときには初回だけ次のコマンドをコンソールに打ちこむこと
install.packages("pacman")pacman::p_load(rnaturalearth, rnaturalearthdata, rgeos){naturalearth}
が無償で提供する ne_countries() 関数scale と retunrclassscale の設定:scale = "small" と指定scale = "medium" と指定scale = "large" と指定retunrclass の設定:reutrnclass = "sf" と指定sf クラスで読み込んでみるreturnclass = "sf" では、地理座標系の
sf オブジェクトを指定sf オブジェクトをマッピングすることができるworld_map <- ne_countries(scale = "small",
returnclass = "sf")world_map)
の中の変数と型をチェックclass(world_map)[1] "sf" "data.frame"
data.frame と
sf の 2 つworld_map のクラスがdata.frame
あることworld_map が含む変数名とその数をチェックnames(world_map) [1] "scalerank" "featurecla" "labelrank" "sovereignt" "sov_a3"
[6] "adm0_dif" "level" "type" "admin" "adm0_a3"
[11] "geou_dif" "geounit" "gu_a3" "su_dif" "subunit"
[16] "su_a3" "brk_diff" "name" "name_long" "brk_a3"
[21] "brk_name" "brk_group" "abbrev" "postal" "formal_en"
[26] "formal_fr" "note_adm0" "note_brk" "name_sort" "name_alt"
[31] "mapcolor7" "mapcolor8" "mapcolor9" "mapcolor13" "pop_est"
[36] "gdp_md_est" "pop_year" "lastcensus" "gdp_year" "economy"
[41] "income_grp" "wikipedia" "fips_10" "iso_a2" "iso_a3"
[46] "iso_n3" "un_a3" "wb_a2" "wb_a3" "woe_id"
[51] "adm0_a3_is" "adm0_a3_us" "adm0_a3_un" "adm0_a3_wb" "continent"
[56] "region_un" "subregion" "region_wb" "name_len" "long_len"
[61] "abbrev_len" "tiny" "homepart" "geometry"
pop_est」があるのでこれを使う geom_sf()
幾何オブジェクトを使って世界地図を出力してみるworld_map |>
ggplot() +
geom_sf() +
theme_void() # テーマは「何もない (void)」を選んでみる world_map のデータ型式が「データフレーム形式」pop_est(各国の人口データ)に応じて
geom_sf() 内に fill = pop_est
でマッピングできるworld_map %>%
ggplot() +
geom_sf(aes(fill = pop_est)) +
# 人口が少ない国は yellow に、多い国は brown3 色とする
scale_fill_gradient(low = "yellow", high = "green") +
labs(fill = "人口") +
theme_void(base_family = "HiraKakuProN-W3")ne_countries() 内に continent
引数を指定asia_map
という名のオブジェクトとして格納してみるasia_map <- ne_countries(scale = "medium",
continent = "Asia",
returnclass = "sf")
asia_map |>
ggplot() +
geom_sf() +
theme_void()asia_map |>
ggplot() +
geom_sf(aes(fill = pop_est)) +
scale_fill_gradient(low = "yellow", high = "green") +
labs(fill = "人口") +
theme_minimal() +
theme_void(base_family = "HiraKakuProN-W3")ここでは「アジア大陸」から表示規模を「東アジア」に絞って所得規模別地図を描いてみる
まず、東アジアにおける各国の所得規模別地図を描いてみる
asia_map <- ne_countries(scale = "medium",
continent = "Asia",
returnclass = "sf")
asia_map %>%
ggplot() + # 所得グループで色塗り
geom_sf(aes(fill = income_grp)) +
theme_void() +
labs(fill = "Income Group")filter()関数を使って
subregion 列を基準に抽出するasia_map %>%
filter(subregion == "Eastern Asia") %>% # 「東アジア」に絞る
ggplot() +
geom_sf(aes(fill = income_grp)) +
theme_void() +
labs(fill = "Income Group")europe_map <- ne_countries(scale = "medium",
continent = "Europe",
returnclass = "sf")
europe_map |>
ggplot() +
geom_sf() +
theme_void()coord_sf()
関数で座標系を調整し、ヨーロッパの表示範囲を絞ってみるxlim で、緯度は ylim で指定world_map %>%
ggplot() +
geom_sf(aes(fill = pop_est)) +
scale_fill_gradient(low = "yellow", high = "green") +
labs(fill = "人口") +
coord_sf(xlim = c(-10, 45), ylim = c(35, 60)) +
theme_minimal(base_family = "HiraKakuProN-W3") +
theme(legend.position = "bottom")ロシアとドイツの人口が多いことは分かるが、このマップからはあまり顕著な違いが分からない
人口を分割している単位をもう少し細分化してみる
world_map2 <- ne_countries(scale = "medium", returnclass = "sf") %>%
mutate(Population = case_when(pop_est < 30000000 ~ "3千万未満",
pop_est < 40000000 ~ "4千万未満",
pop_est < 50000000 ~ "5千万未満",
pop_est < 60000000 ~ "6千万未満",
pop_est < 70000000 ~ "7千万未満",
pop_est < 80000000 ~ "8千万未満",
TRUE ~ "8千万以上"),
Population = factor(Population,
levels = c("3千万未満", "4千万未満", "5千万未満",
"6千万未満", "7千万未満", "8千万未満",
"8千万以上")))world_map2 %>%
ggplot() +
geom_sf(aes(fill = Population)) +
scale_fill_brewer(palette = "green", drop = FALSE) +
labs(fill = "人口") +
coord_sf(xlim = c(-10, 45), ylim = c(35, 60)) +
geom_label_repel(
data = st_crop(world_map2,
c(xmin = -10, xmax = 45, ymin = 35, ymax = 60)),
aes(label = name, geometry = geometry),
size = 11,
stat = "sf_coordinates",
min.segment.length = 0
) +
theme_minimal(base_family = "HiraKakuProN-W3") +
theme(legend.position = "bottom",
axis.text = element_text(size = 30),
legend.title = element_text(size = 32),
legend.text = element_text(size = 32),
legend.key.size = unit(1, "cm"),
legend.key.width = unit(3,"cm"))world_map %>%
select(sovereignt, pop_est) %>%
DT::datatable()ne_countries に country
引数を指定するne_countries(scale = "small",
country = "Japan",
returnclass = "sf") %>%
ggplot() +
geom_sf() +
theme_void() scale = "medium" と指定してみるne_countries(scale = "medium",
country = "Japan",
returnclass = "sf") %>%
ggplot() +
geom_sf() +
theme_void() rnaturalearthhires}パッケージをインストールし、読み込むpacman::p_load_gh("ropensci/rnaturalearthhires")p_load() でなく
p_load_gh() を使う理由
・{rnaturalearthhires}は CRAN
に登録されていない(2022年9月2日時点)
・GitHub の ropensciレポジトリーのみで公開
→ {pacman}パッケージの p_load()
関数でなく、p_load_gh()関数を使う
ne_states() 関数を使うsfdf_jpn_map <- ne_states("Japan",
returnclass = "sf")
df_jpn_map %>%
ggplot() +
geom_sf() +
theme_void()ne_states() 関数を使って読み込んだ日本地図データ
df_jpn_map に都道府県別の人口データは含まれていないここでは2022年の「都道府県人口・面積・人口密度ランキングを加工したもの
(jpn_pop.csv)
を使う
csvファイルを読み込むために必要な readr
パッケージをロードする
→ tidyverse パッケージをロードすると、自動的に
readr パッケージもロードされる
都道府県別人口データ (jpn_pop.csv)
をダウンロード
→ R プロジェクトフォルダ内に data
フォルダを作り、その中に入れる
・RStudio 上で人口データ (jpn_pop.csv)
を読み込み、df_jpn_pop と名前をつける
df_jpn_pop <- read_csv("data/jpn_pop.csv",
locale = locale(encoding = "cp932"))DT::datatable(df_jpn_pop)pop_2016 は2016年10月1日時点での人口pop_2021 は2021年10月1日時点での人口diff は2011年から2021年の間の人口増減率diff の計算式は次のとおり\[人口増減率= \frac{人口増減(2021年10月−2016年10月)}{2016年10月現在人口}×100\]
df_jpn_map
と「日本人口データ」 df_jpn_pop を
紐付けるためマージする必要があるdf_jpn_pop の中を確認DT::datatable(df_jpn_pop)name, pref,
pop_2016,pop_2021, diff の 5
つdf_jpn_map の中を確認names(df_jpn_map) [1] "featurecla" "scalerank" "adm1_code" "diss_me" "iso_3166_2"
[6] "wikipedia" "iso_a2" "adm0_sr" "name" "name_alt"
[11] "name_local" "type" "type_en" "code_local" "code_hasc"
[16] "note" "hasc_maybe" "region" "region_cod" "provnum_ne"
[21] "gadm_level" "check_me" "datarank" "abbrev" "postal"
[26] "area_sqkm" "sameascity" "labelrank" "name_len" "mapcolor9"
[31] "mapcolor13" "fips" "fips_alt" "woe_id" "woe_label"
[36] "woe_name" "latitude" "longitude" "sov_a3" "adm0_a3"
[41] "adm0_label" "admin" "geonunit" "gu_a3" "gn_id"
[46] "gn_name" "gns_id" "gns_name" "gn_level" "gn_region"
[51] "gn_a1_code" "region_sub" "sub_code" "gns_level" "gns_lang"
[56] "gns_adm1" "gns_region" "min_label" "max_label" "min_zoom"
[61] "wikidataid" "name_ar" "name_bn" "name_de" "name_en"
[66] "name_es" "name_fr" "name_el" "name_hi" "name_hu"
[71] "name_id" "name_it" "name_ja" "name_ko" "name_nl"
[76] "name_pl" "name_pt" "name_ru" "name_sv" "name_tr"
[81] "name_vi" "name_zh" "ne_id" "geometry"
df_jpn_map <- df_jpn_map |>
select(name, geometry)DT::datatable(df_jpn_map)unique()関数をつかって df_jpn_map の
name の 9 番目の値を確認してみるunique(df_jpn_map$name) [1] "Kagoshima" "Oita" "Fukuoka" "Saga" "Nagasaki" "Kumamoto"
[7] "Miyazaki" "Tokushima" "Kagawa" "Ehime" "Kochi" "Shimane"
[13] "Yamaguchi" "Tottori" "Hyogo" "Kyoto" "Fukui" "Ishikawa"
[19] "Toyama" "Niigata" "Yamagata" "Akita" "Aomori" "Iwate"
[25] "Miyagi" "Fukushima" "Ibaraki" "Chiba" "Tokyo" "Kanagawa"
[31] "Shizuoka" "Aichi" "Mie" "Wakayama" "Osaka" "Okayama"
[37] "Hiroshima" "Hokkaido" "Okinawa" "Gunma" "Nagano" "Tochigi"
[43] "Gifu" "Shiga" "Saitama" "Yamanashi" "Nara"
unique()関数を使って df_jpn_pop の
name 値を確認してみるunique(df_jpn_pop$name) [1] "Aichi" "Akita" "Aomori" "Chiba" "Ehime" "Fukui"
[7] "Fukuoka" "Fukushima" "Gifu" "Gunma" "Hiroshima" "Hokkaido"
[13] "Hyogo" "Ibaraki" "Ishikawa" "Iwate" "Kagawa" "Kagoshima"
[19] "Kanagawa" "Kochi" "Kumamoto" "Kyoto" "Mie" "Miyagi"
[25] "Miyazaki" "Nagano" "Nagasaki" "Nara" "Niigata" "Oita"
[31] "Okayama" "Okinawa" "Osaka" "Saga" "Saitama" "Shiga"
[37] "Shimane" "Shizuoka" "Tochigi" "Tokushima" "Tokyo" "Tottori"
[43] "Toyama" "Wakayama" "Yamagata" "Yamaguchi" "Yamanashi"
df_map_pop と
df_jpn_pop) に共通する変数 name
は「変数名」(name) と「値」(Aichi, Akita...)
が同じ・df_jpn_map と df_jpn_pop を
name を手がかりにデータをマージして、df_jpn
と名前を付ける
df_jpn <- left_join(df_jpn_pop, df_jpn_map,
by = "name") %>%
st_as_sf()・データフレームを確認する
DT::datatable(df_jpn) | 変数名 | 説明 |
1.name |
都道府県名(英語) |
2.pref |
都道府県名(日本語) |
3.pop_2016 |
2016年10月1日時点での人口 |
4.pop_2021 |
2021年10月1日時点での人口 |
5.diff |
2011〜2021の人口増減率(%) |
6.geometry |
地図情報 |
df_jpn
を使って人口の多い都道府県を濃い緑で表示するマップを描いてみるdf_jpn %>%
ggplot() +
geom_sf(aes(fill = pop_2021)) +
scale_fill_distiller(name = "人口",
palette = "Greens", # 任意の色を指定
direction = 1) +
labs(fill = "人口") +
theme_void(base_family = "HiraginoSans-W3", base_size = 9) +
ggtitle("都道府県別の人口規模(2021年10月1日)") +
theme(plot.title = element_text(size = 15)) factor
化してから、そのカテゴリーに応じて色塗りをするsummary(df_jpn$pop_2021) Min. 1st Qu. Median Mean 3rd Qu. Max.
548562 1057844 1576074 2670279 2670336 14011487
stem() 関数を使って、pop_2021
の分布を確認するstem(df_jpn$pop_2021, scale = 2)
The decimal point is 6 digit(s) to the right of the |
0 | 5777888999
1 | 01111223333456788999
2 | 0023689
3 | 6
4 |
5 | 124
6 | 3
7 | 35
8 | 8
9 | 2
10 |
11 |
12 |
13 |
14 | 0
DT::datatable(df_jpn)# 人口規模・都道府県別日本地図 (2021)
df_jpn %>%
mutate(pop_2021a = case_when(pop_2021 >= 8000000 ~ "800万人以上",
pop_2021 >= 5000000 ~ "500万人以上",
pop_2021 >= 2000000 ~ "200万人以上",
pop_2021 >= 1000000 ~ "100万人以上",
TRUE ~ "100万人未満"),
pop_2021a = factor(pop_2021a, ordered = TRUE,
levels = c(
"800万人以上",
"500万人以上",
"200万人以上",
"100万人以上",
"100万人未満"))) %>%
ggplot() +
geom_sf(aes(fill = pop_2021a)) +
labs(fill = "人口") +
theme_void(base_family = "HiraginoSans-W3", base_size = 9) +
ggtitle("都道府県別 人口規模(2021年10月1日)") +
theme(plot.title = element_text(size = 15)) # 人口増減・都道府県別日本地図 (2016-2021)
df_jpn %>%
ggplot() +
geom_sf(aes(fill = diff)) +
scale_fill_distiller(name = "人口増減(%)",
palette = "RdBu", # 任意の色を指定
direction = 1) +
labs(fill = "人口") +
theme_void(base_family = "HiraginoSans-W3", base_size = 9) +
ggtitle("都道府県別 人口の増減(2016年〜2021年)") +
theme(plot.title = element_text(size = 15)) library(tidyverse)
library(geofacet)
library(zipangu)df_pop)board <- pins::board_url(
c(df_pop = "https://raw.githubusercontent.com/uribo/220828ism_ws/main/df-ssdse-b/data.rds"))
df_pop <-
board |>
pins::pin_download("df_pop") |>
readr::read_rds() df_pop <- df_pop |>
mutate(population = population / 1000000)DT::datatable(df_pop)jp_prefs_grid1)zipangu}パッケージを使って都道府県情報をダウンロードするjp_prefs_grid1 <-
jp_prefs_grid1 |>
left_join(
zipangu::jpnprefs |>
select(jis_code, prefecture = prefecture_kanji),
by = c("code_pref_jis" = "jis_code"))DT::datatable(jp_prefs_grid1)plt_1 <- df_pop |>
ggplot() +
aes(year, population) +
geom_line() +
theme_gray(base_size = 6,
base_family = "HiraKakuProN-W3",
) +
facet_geo(~ prefecture,
grid = "jp_prefs_grid1",
scales = "free_y") +
theme(axis.text.x = element_text(angle = 80, # 40度回転
vjust = 1,
hjust = 1)) +
ggtitle("都道府県別人口の増減(2008-2019)") +
theme(plot.title = element_text(size = 15))
plt_1
・縦軸の最大値が都道府県ごとに異なるので、解釈する際には注意が必要
例えば東京の人口の最大値は約1392万人、鳥取の最大値は約56万人
マップの保存
fig フォルダを R プロジェクトフォルダ内に作る
作成したマップを fig フォルダに保存する
ggsave("fig/plt_1.png", # 保存したい画像の名前を指定
plt_1, # 作成した画像名(オブジェクト名)
width = 45, # 画像の横サイズ
height = 45, # 画像の縦サイズ
units = "cm") # 画像サイズの単位を指定
# インチなら "in"
# ミリメートルなら "mm"df_ldp_vs)hr <- read_csv("data/hr96-21_ken.csv")head(hr)# A tibble: 6 × 23
year pref prefect…¹ ku kun wl rank nocand seito j_name gender name
<dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <chr> <chr>
1 1996 愛知 愛知県 aichi 1 1 1 7 新進 河村… male KAWA…
2 1996 愛知 愛知県 aichi 1 0 2 7 自民 今枝… male IMAE…
3 1996 愛知 愛知県 aichi 1 0 3 7 民主 佐藤… male SATO…
4 1996 愛知 愛知県 aichi 1 0 4 7 共産 岩中… female IWAN…
5 1996 愛知 愛知県 aichi 1 0 5 7 文化… 伊東… female ITO,…
6 1996 愛知 愛知県 aichi 1 0 6 7 国民… 山田浩 male YAMA…
# … with 11 more variables: previous <dbl>, age <dbl>, exp <chr>, status <dbl>,
# vote <dbl>, voteshare <dbl>, eligible <chr>, turnout <chr>,
# seshu_dummy <chr>, jiban_seshu <chr>, nojiban_seshu <chr>, and abbreviated
# variable name ¹prefecture
hr96_21.csv
は1996年に衆院選挙に小選挙区が導入されて以来実施された 9
回の衆議院選挙(1996, 2000, 2003, 2005, 2009, 2012, 2014, 2017,
2021)の結果のデータhr に含まれる変数名を表示させるnames(hr) [1] "year" "pref" "prefecture" "ku"
[5] "kun" "wl" "rank" "nocand"
[9] "seito" "j_name" "gender" "name"
[13] "previous" "age" "exp" "status"
[17] "vote" "voteshare" "eligible" "turnout"
[21] "seshu_dummy" "jiban_seshu" "nojiban_seshu"
hr には 23 個の変数が入っている| 変数名 | 詳細 |
|---|---|
year |
選挙年 (1996-2017) |
pref |
都道府県名(例:宮城) |
prefecture |
都道府県名(例:宮城県) |
ku |
小選挙区名 |
kun |
小選挙区 |
rank |
当選順位 |
wl |
選挙の当落: 1 = 小選挙区当選、2 = 復活当選、0 = 落選 |
nocand |
立候補者数 |
seito |
候補者の所属政党 |
j_name |
候補者の氏名(日本語) |
name |
候補者の氏名(ローマ字) |
previous |
これまでの当選回数(当該総選挙結果は含まない) |
gender |
立候補者の性別: “male”, “female” |
age |
立候補者の年齢 |
exp |
立候補者が使った選挙費用(総務省届け出) |
status |
候補者のステータス: 0 = 非現職、1 現職、2 = 元職 |
vote |
得票数 |
voteshare |
得票率 (%) |
eligible |
小選挙区の有権者数 |
turnout |
小選挙区の投票率 (%) |
seshu_dummy |
世襲候補者ダミー: 1 = 世襲、0 = 非世襲(地盤世襲 or 非世襲) |
jiban_seshu |
地盤の受け継ぎ元の政治家の氏名と関係 |
nojiban_seshu |
世襲元の政治家の氏名と関係 |
voteshare) を都道府県
(prefecture) ごとに平均するdf_ldp_vs <- hr |>
filter(seito == "自民") |>
group_by(year, prefecture) |>
summarize(ldp_vs = mean(voteshare))DT::datatable(df_ldp_vs)jp_prefs_grid1)zipangu}パッケージを使って、都道府県情報をダウンロードするjp_prefs_grid1 <-
jp_prefs_grid1 |>
left_join(
zipangu::jpnprefs |>
select(jis_code, prefecture = prefecture_kanji),
by = c("code_pref_jis" = "jis_code"))DT::datatable(jp_prefs_grid1)plt_2 <- df_ldp_vs |>
ggplot() +
aes(year, ldp_vs) +
geom_line() +
theme_gray(base_size = 6, base_family = "HiraKakuProN-W3") +
facet_geo(~ prefecture,
grid = "jp_prefs_grid1",
scales = "free_y") +
theme(axis.text.x = element_text(angle = 40, # 40度回転
vjust = 1,
hjust = 1)) +
ggtitle("総選挙での自民党候補者の得票率平均 (1996-2021)") +
theme(plot.title = element_text(size = 15))
plt_2
・縦軸の最大値が都道府県ごとに異なるので、解釈する際には注意が必要
例えば山口県の最大値は約73%、沖縄の最大値は約21%
マップの保存
fig フォルダを R プロジェクトフォルダ内に作る
作成したマップを fig フォルダに保存する
ggsave("fig/plt_2.png", # 保存したい画像の名前を指定
plt_2, # 作成した画像名(オブジェクト名)
width = 45, # 画像の横サイズ
height = 45, # 画像の縦サイズ
units = "cm") # 画像サイズの単位を指定
# インチなら "in"
# ミリメートルなら "mm"Q6.1:
「2.1.4 都道府県人口別に日本地図を描く(2021年)」を参考にして、2016年における
都道府県別の人口規模を色分けした日本地図を描きなさい。
Q6.2:
「3.2 総選挙での自民党得票率を時系列で表示」を参考にして、1996年から2021年までの総選挙における、当選者(小選挙区当選者と復活当選者)の平均年齢を都道府県ごとに計算しなさい。
F@N Communications, Inc.)
からご助言いただいた