Topic 27
Rを用いた地図描画の入門:sf × rnaturalearth × ggplot2
Beginner map drawing in R with sf, rnaturalearth, and ggplot2
R で地図を描く最短ルートとして、まずは <code>sf</code>・<code>rnaturalearth</code>・<code>ggplot2</code> の組み合わせを覚えるのがおすすめです。このページでは、公開地図データを読み込み、表データを結合し、最初のコロプレス地図とポイントマップを描くところまでを一気通貫で整理します。
地図は「普通の表 + geometry 列」と考えると理解しやすくなります。sf オブジェクトは data.frame のように列を持ちながら、座標やポリゴン形状を geometry として持っています。
このページでは、rnaturalearth から world map を取得し、東アジアの数か国に仮のスコアを結合してコロプレス地図を描きます。シェープファイルを別途ダウンロードしなくても、学習の最初の一歩を体験できます。
さらに、地点データを <code>st_as_sf()</code> で point に変換すれば、ポイントマップも同じ文法で描けます。
このページのゴール
- sf オブジェクトを「geometry 列を持つ表」として説明できるようになる
- ne_countries(returnclass = "sf") で公開地図を読み込めるようになる
- 表データを地図へ left_join してコロプレス地図を描けるようになる
- geom_sf() と geom_sf_text() の最小使い方を理解する
- tmap や実データの shapefile / GeoJSON へ進む入口をつかむ
Learn the idea
まず押さえるポイント
R の地図描画で最初に理解したいのは、地図は geometry 列を持つ表だということです。普通の表データの感覚で filter / join / mutate を使いながら、最後に geom_sf() で描けます。
地理形状を持つデータを、R のネイティブなオブジェクトとして扱います。
地図ポリゴンと別表の数値を、国名やコードで結合して塗り分けます。
最初は geom_sf() だけで十分です。点も面も同じ文法で描けます。
初心者はまず既定のまま描き、必要になってから CRS を学ぶのが実践的です。
Basics
分析の前提
このページは、空間統計というより地図として見せる最初の可視化に焦点を当てています。まずは公開地図データを取得し、表データと結合し、塗り分け地図を作るところまでを扱います。
どんなときに向くか
- 地域別の指標を地図で見せたい
- 都道府県・国・自治体の空間分布を直感的に示したい
- まずは shapefile なしで練習したい
このページで扱わないこと
- 空間自己相関や空間回帰などの空間統計
- 本格的な投影法の比較
- Web 地図やインタラクティブ地図の詳細実装
Checks
前提条件の確認
地図描画では、値の前提というよりjoin keyと座標系、範囲の切り出しが重要です。
join key を確認する
国名・都道府県名・ISO コードなど、地図データ側と表データ側で一致する列を先に確認します。
NA の有無を確認する
join 後に塗れない地域が出たら、名前の不一致や欠測を疑います。
地図の範囲を絞る
全世界のままだと見づらいときは、coord_sf() で xlim / ylim を指定して切り出します。
Data structure
データ構造
このページでは、地図本体は ne_countries() で取得し、別表として country ごとのスコア表を結合します。つまり「geometry を持つ表」と「通常の CSV」をつないでいます。
地図本体の列のイメージ
| admin | continent | geometry |
|---|---|---|
| Japan | Asia | MULTIPOLYGON (...) |
| South Korea | Asia | MULTIPOLYGON (...) |
| China | Asia | MULTIPOLYGON (...) |
結合する別表の例
| country | participation |
|---|---|
| Japan | 88 |
| South Korea | 84 |
| China | 73 |
Code
Rコード
まず国境ポリゴンを取得し、次にスコア表を left_join して、最後に geom_sf() で塗り分けます。追加ファイルは不要です。
install.packages(c("tidyverse", "sf", "rnaturalearth", "rnaturalearthdata", "ggplot2", "viridis"))
library(tidyverse)
library(sf)
library(rnaturalearth)
library(rnaturalearthdata)
library(ggplot2)
library(viridis)
world <- ne_countries(scale = "medium", returnclass = "sf")
scores <- read_csv("sample-data/sample_map_country_scores.csv", show_col_types = FALSE)
east_asia <- world %>%
filter(admin %in% c("China", "Japan", "South Korea", "Taiwan", "Mongolia")) %>%
left_join(scores, by = c("admin" = "country"))
print(east_asia %>% st_drop_geometry() %>% select(admin, participation))choropleth_plot <- ggplot(east_asia) +
geom_sf(aes(fill = participation), color = "white", linewidth = 0.3) +
geom_sf_text(aes(label = admin), size = 3) +
coord_sf(xlim = c(95, 150), ylim = c(20, 52), expand = FALSE) +
scale_fill_viridis_c(option = "C", na.value = "#f3f4f6") +
labs(title = "Example choropleth map", fill = "score") +
theme_minimal(base_size = 12)
print(choropleth_plot)
ggsave("east_asia_choropleth.png", plot = choropleth_plot, width = 7, height = 5)
capitals <- tibble(
city = c("Tokyo", "Seoul", "Taipei"),
lon = c(139.76, 126.98, 121.56),
lat = c(35.68, 37.57, 25.04)
) %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326)
point_map <- ggplot() +
geom_sf(data = east_asia, fill = "#edf2ff", color = "white") +
geom_sf(data = capitals, color = "#2f67d8", size = 2.8) +
geom_sf_text(data = capitals, aes(label = city), nudge_y = 1.5, size = 3) +
coord_sf(xlim = c(120, 146), ylim = c(22, 46), expand = FALSE) +
theme_minimal(base_size = 12)コードの最小ポイント
ne_countries(returnclass = "sf")でそのまま sf オブジェクトを取得できます。geom_sf()は polygon も point も同じ枠組みで描けます。st_as_sf()を使うと、経度緯度の表をポイントへ変換できます。
Output reading
最初に読むべき出力
地図を描く前に、まず st_drop_geometry() で通常の表として確認するのが近道です。join した列に NA が出ていないか、対象地域だけに絞れているかを見ます。
join 後の確認表
| admin | participation |
|---|---|
| China | 73 |
| Japan | 88 |
| South Korea | 84 |
| Taiwan | 81 |
| Mongolia | 64 |
ここで確認すること
- 対象地域だけが残っているか
- 塗り分けたい指標に欠測がないか
- 列名や単位が図の凡例にそのまま出ても問題ないか
Figure reading
地図をどう読むか
コロプレス地図では、色の濃さが地域ごとの値を表します。最初は「どこが高く、どこが低いか」を見るだけで十分です。位置関係が入ることで、表よりも地域差が直感的に伝わります。

図1 東アジアの例示的なコロプレス地図
Figure 1. Example choropleth map for East Asia.
まず色の濃淡を見る
凡例に照らして、どの地域の値が高いか・低いかを確認します。
近接地域を比べる
隣接地域で差があると、表よりも空間的なコントラストが伝わりやすくなります。
面積に引っ張られない
大きい国が目立ちますが、値の大小は色で読んでください。面積の大きさと指標値は別です。
ラベルの置き方を工夫する
国数が多いときは全ラベルを出さず、主要地域だけに絞る方が読みやすくなります。
Writing
レポート文例
地図は傾向を視覚的に伝えるのが得意です。本文では、どの地域が相対的に高い・低いかを簡潔にまとめ、数値表と併用すると読みやすくなります。
日本語の書き方例
東アジア 5 地域を対象に、例示的な指標値をコロプレス地図として可視化した(図1)。その結果、日本と韓国では相対的に高い値が示され、モンゴルでは低い値が示された。地図表現を用いることで、地域差と位置関係を同時に把握しやすくなった。
図1 東アジア 5 地域の例示的な指標値を示すコロプレス地図
English example
An illustrative indicator was visualized as a choropleth map for five East Asian regions (Figure 1). The map suggested relatively higher values for Japan and South Korea and a lower value for Mongolia. The geographic display made it easier to grasp both regional differences and spatial proximity at a glance.
Figure 1. Choropleth map of an illustrative indicator across five East Asian regions.
Mistakes
よくあるミス
join key の不一致
地図が塗れない原因の多くは、国名やコードの不一致です。まず表を確認してください。
色の意味を曖昧にする
凡例の単位や指標名を省くと、読者は何を塗っているのか分かりにくくなります。
地図だけで説明を終える
必要に応じて表や簡単な数値要約も併記すると、誤読が減ります。
FAQ
FAQ
都道府県や市区町村の地図も描けますか?
はい。shapefile や GeoJSON を st_read() で読み込めば、同じ geom_sf() の文法で描けます。
tmap と何が違いますか?
ggplot2 + sf は既存の ggplot2 経験を活かしやすく、tmap は地図専用の文法で主題図が作りやすいのが特徴です。
CRS は最初から勉強すべきですか?
最初の1ページでは不要です。既定のまま描いて、必要になったら投影法や変換へ進むのが実践的です。
Alternatives
代替手法・次の一歩
同じ地図でも、目的によって向くツールが変わります。最初は ggplot2 + sf で十分ですが、主題図や対話的地図へ広げる道もあります。
主題図をもっと描く
tmap は主題図を地図専用の文法で整理したいときに向いています。
簡単な base plot
まず形を見るだけなら、sf の base plot も手早い選択肢です。
インタラクティブ地図
ズームやホバーを使いたい場合は、leaflet が発展先になります。
空間統計へ進む
地図を描く段階の次に、空間的な自己相関や近接効果を考えたいときの入口です。
参考資料
参考資料
まず sf と geom_sf() の公式解説を読み、次に rnaturalearth と tmap の入口を見ると、地図描画の最初の設計図ができます。
sf の基本
sf は simple features を R ネイティブのオブジェクトとして扱う基盤パッケージです。
ggplot2 で描く
geom_sf() は sf オブジェクトをそのまま描く最短ルートで、polygon・line・point を同じ文法で扱えます。
公開地図データ
rnaturalearth は Natural Earth の世界地図データを、sf 形式で扱いやすくします。
主題図の発展
主題図をより地図向けの文法で描きたい場合は、tmap が有力な次の選択肢です。
運営と利用上の注意
このページの位置づけ
本サイトのトピックページは、Rによるデータ分析の学習支援とレポート作成の補助を目的としたオリジナル解説です。サンプルデータとコードは再現練習用に作成しているため、実データを扱う際には研究計画・前提条件・欠測・外れ値・尺度水準をあらためて確認してください。
編集方針
ページ本文は、標準的な統計手法、Rの公式ドキュメント、一次資料に近い参考文献を優先して整理しています。更新や訂正の方針は編集方針ページで公開しています。