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 に変換すれば、ポイントマップも同じ文法で描けます。

地図描画 地図描画sfrnaturalearthggplot2空間データ

このページのゴール

  • sf オブジェクトを「geometry 列を持つ表」として説明できるようになる
  • ne_countries(returnclass = "sf") で公開地図を読み込めるようになる
  • 表データを地図へ left_join してコロプレス地図を描けるようになる
  • geom_sf() と geom_sf_text() の最小使い方を理解する
  • tmap や実データの shapefile / GeoJSON へ進む入口をつかむ
···

まず押さえるポイント

R の地図描画で最初に理解したいのは、地図は geometry 列を持つ表だということです。普通の表データの感覚で filter / join / mutate を使いながら、最後に geom_sf() で描けます。

sfsimple features

地理形状を持つデータを、R のネイティブなオブジェクトとして扱います。

join表を結合する

地図ポリゴンと別表の数値を、国名やコードで結合して塗り分けます。

geom_sf描画は 1 レイヤーで開始

最初は geom_sf() だけで十分です。点も面も同じ文法で描けます。

CRS座標系

初心者はまず既定のまま描き、必要になってから CRS を学ぶのが実践的です。

···

分析の前提

このページは、空間統計というより地図として見せる最初の可視化に焦点を当てています。まずは公開地図データを取得し、表データと結合し、塗り分け地図を作るところまでを扱います。

どんなときに向くか

  • 地域別の指標を地図で見せたい
  • 都道府県・国・自治体の空間分布を直感的に示したい
  • まずは shapefile なしで練習したい

このページで扱わないこと

  • 空間自己相関や空間回帰などの空間統計
  • 本格的な投影法の比較
  • Web 地図やインタラクティブ地図の詳細実装
···

前提条件の確認

地図描画では、値の前提というよりjoin key座標系範囲の切り出しが重要です。

join key を確認する

国名・都道府県名・ISO コードなど、地図データ側と表データ側で一致する列を先に確認します。

NA の有無を確認する

join 後に塗れない地域が出たら、名前の不一致や欠測を疑います。

地図の範囲を絞る

全世界のままだと見づらいときは、coord_sf() で xlim / ylim を指定して切り出します。

···

データ構造

このページでは、地図本体は ne_countries() で取得し、別表として country ごとのスコア表を結合します。つまり「geometry を持つ表」と「通常の CSV」をつないでいます。

地図本体の列のイメージ

admincontinentgeometry
JapanAsiaMULTIPOLYGON (...)
South KoreaAsiaMULTIPOLYGON (...)
ChinaAsiaMULTIPOLYGON (...)
···

Rコード

まず国境ポリゴンを取得し、次にスコア表を left_join して、最後に geom_sf() で塗り分けます。追加ファイルは不要です。

Rコード:公開地図データを読み込んで結合するanalysis
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))
Rコード:コロプレス地図とポイントマップを描くvisual
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() を使うと、経度緯度の表をポイントへ変換できます。
···

最初に読むべき出力

地図を描く前に、まず st_drop_geometry() で通常の表として確認するのが近道です。join した列に NA が出ていないか、対象地域だけに絞れているかを見ます。

join 後の確認表

adminparticipation
China73
Japan88
South Korea84
Taiwan81
Mongolia64

ここで確認すること

  • 対象地域だけが残っているか
  • 塗り分けたい指標に欠測がないか
  • 列名や単位が図の凡例にそのまま出ても問題ないか
···

地図をどう読むか

コロプレス地図では、色の濃さが地域ごとの値を表します。最初は「どこが高く、どこが低いか」を見るだけで十分です。位置関係が入ることで、表よりも地域差が直感的に伝わります。

東アジアの5地域を塗り分けたコロプレス地図の例

図1 東アジアの例示的なコロプレス地図

Figure 1. Example choropleth map for East Asia.

まず色の濃淡を見る

凡例に照らして、どの地域の値が高いか・低いかを確認します。

近接地域を比べる

隣接地域で差があると、表よりも空間的なコントラストが伝わりやすくなります。

面積に引っ張られない

大きい国が目立ちますが、値の大小は色で読んでください。面積の大きさと指標値は別です。

ラベルの置き方を工夫する

国数が多いときは全ラベルを出さず、主要地域だけに絞る方が読みやすくなります。

···

レポート文例

地図は傾向を視覚的に伝えるのが得意です。本文では、どの地域が相対的に高い・低いかを簡潔にまとめ、数値表と併用すると読みやすくなります。

日本語の書き方例

東アジア 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.

···

よくあるミス

join key の不一致

地図が塗れない原因の多くは、国名やコードの不一致です。まず表を確認してください。

色の意味を曖昧にする

凡例の単位や指標名を省くと、読者は何を塗っているのか分かりにくくなります。

地図だけで説明を終える

必要に応じて表や簡単な数値要約も併記すると、誤読が減ります。

···

FAQ

都道府県や市区町村の地図も描けますか?

はい。shapefile や GeoJSON を st_read() で読み込めば、同じ geom_sf() の文法で描けます。

tmap と何が違いますか?

ggplot2 + sf は既存の ggplot2 経験を活かしやすく、tmap は地図専用の文法で主題図が作りやすいのが特徴です。

CRS は最初から勉強すべきですか?

最初の1ページでは不要です。既定のまま描いて、必要になったら投影法や変換へ進むのが実践的です。

···

代替手法・次の一歩

同じ地図でも、目的によって向くツールが変わります。最初は ggplot2 + sf で十分ですが、主題図や対話的地図へ広げる道もあります。

主題図をもっと描く

tmap は主題図を地図専用の文法で整理したいときに向いています。

簡単な base plot

まず形を見るだけなら、sf の base plot も手早い選択肢です。

インタラクティブ地図

ズームやホバーを使いたい場合は、leaflet が発展先になります。

空間統計へ進む

地図を描く段階の次に、空間的な自己相関や近接効果を考えたいときの入口です。

···

参考資料

まず sf と geom_sf() の公式解説を読み、次に rnaturalearth と tmap の入口を見ると、地図描画の最初の設計図ができます。

ggplot2 で描く

geom_sf() は sf オブジェクトをそのまま描く最短ルートで、polygon・line・point を同じ文法で扱えます。

···

このページの位置づけ

本サイトのトピックページは、Rによるデータ分析の学習支援とレポート作成の補助を目的としたオリジナル解説です。サンプルデータとコードは再現練習用に作成しているため、実データを扱う際には研究計画・前提条件・欠測・外れ値・尺度水準をあらためて確認してください。

編集方針

ページ本文は、標準的な統計手法、Rの公式ドキュメント、一次資料に近い参考文献を優先して整理しています。更新や訂正の方針は編集方針ページで公開しています。

サイト情報

運営の目的、広告掲載方針、プライバシーポリシー、問い合わせ方法はサイト情報ページ群にまとめています。

···