広告 特殊なグラフ

R言語で地図を描いてみよう!

2024年2月24日

title

はじめに

R言語は統計分析やデータ可視化に優れたプログラミング言語です。地図も簡単に描画することができ、データ分析結果を視覚的に分かりやすく表現することができます。

本記事では、R言語で地図を描画する方法を解説します。ggplot2、maps、mapdataパッケージを使って、日本地図全体または特定の範囲の地図を描画するサンプルコードを紹介します。

必要なパッケージ

以下のパッケージをインストールする必要があります。

install.packages("ggplot2")
install.packages("maps")
install.packages("mapdata")

日本地図全体を描画する場合

library(ggplot2)
library(maps)
library(mapdata)

# 日本地図を描画
map("japan", interior = TRUE, lty=1)
box() # 囲みを追加
  • map("japan")というコードを実行すると、日本地図全体が描画されます。
  • interior = TRUEオプションは、国境線を塗りつぶします。
  • lty=1オプションは、国境線の線の太さを設定します。

描かれる地図は次のようになります。

特定範囲の地図を描画する方法

例として、京都府周辺の地図を描いてみましょう。スクリプトは次のとおり。

# 特定の範囲の地図を描写する方法
map("japan", xlim = c(134.6, 136.5), ylim = c(34.5, 36)) # 京都府近隣の緯度経度の範囲に修正
map("japan", add = TRUE, col = "black", lty = 2) 
box() # 囲みを追加
  • xlimオプションとylimオプションを使って、地図の描画範囲を指定することができます。
  • add = TRUEオプションは、複数の地図を重ねて描画します。
  • colオプションは、地図の色を設定します。
  • ltyオプションは、地図の線の太さを設定します。
  • box()関数を使って、地図に囲みを追加することができます。

地図は次のようになります。

xlimオプションとylimオプションの詳しい説明

xlimオプションとylimオプションは、地図の描画範囲を指定するために使用します。

これらのオプションは、それぞれx軸y軸の範囲を最小値最大値2つの数値で指定します。

map("japan", xlim = c(134, 137), ylim = c(33, 36))

上記のコードは、日本の地図をx軸134度から137度y軸33度から36度の範囲で描画します。

各オプションの詳細

  • xlim:
    • x軸の最小値と最大値を指定します。
    • 日本の緯度経度の範囲は、以下のとおりです。
      • 緯度:20度~46度
      • 経度:128度~146度
    • 範囲を指定する際は、東経負の数西経正の数で指定します。
  • ylim:
    • y軸の最小値と最大値を指定します。
    • 日本の緯度経度の範囲は、以下のとおりです。
      • 緯度:20度~46度
      • 経度:128度~146度
    • 範囲を指定する際は、北緯正の数南緯負の数で指定します。

注意事項:

  • 範囲を指定する際は、正しい数値を使用する必要があります。
  • 範囲が正しく指定されていない場合、地図が正しく描画されない可能性があります。

京都御所の位置を地図にプロットしてみよう!

スクリプトは次のとおりです。

map("japan", xlim = c(134.6, 136.5), ylim = c(34.5, 36)) # 京都近隣の緯度経度の範囲に修正
map("japan", add = TRUE, col = "black", lty = 2) # 赤い点線で境界を追加
box() # 囲みを追加

# 京都御所の緯度経度
longitude <- 135.755323
latitude <- 35.011639

# ポイントを追加
points(longitude, latitude, col = "red", cex = 2, pch = 20)

# テキストを追加
# pos = 3 はテキストをポイントの上に配置します。
# adj = 0 はテキストを左揃えにします(テキストの左端が指定した座標に来るようにします)。
# ここでは、テキストを少し右にずらしたい場合は、adj を 0 より大きい値に設定します。
text(longitude, latitude + 0.05, labels = "京都御所", col = "red", cex = 1,adj = 1)

地図は次のようになります。

スクリプトの解説

  • 最初のスクリプトでは、map 関数を使用して日本の地図を描画しています。xlimylim パラメータによって、地図の表示範囲を経度134.6度から136.5度、緯度34.5度から36度に限定しています。これは、京都が含まれる地域をズームインして表示するためです。二回目の map 関数の呼び出しでは、add = TRUE を設定して、既存の地図に黒い点線の境界線を追加しています。box() 関数は、地図の周りに標準的な枠を追加しています。
  • #ポイントを追加~:ここではpoints 関数を使用して、特定の緯度(latitude)と経度(longitude)にポイントを追加しています。このポイントは京都御所を表し、赤色(col = "red")、サイズは2倍(cex = 2)、形状は円(pch = 20)です。
  • 最後に、text 関数を使用して、先ほど追加したポイントの上に「京都御所」というテキストを追加しています。テキストは赤色(col = "red")、サイズは標準(cex = 1)です。pos = 3(上部に配置)がコメントアウトされているため、テキストの垂直位置はデフォルト(中央)になりますが、実際にはこのオプションはスクリプトには直接含まれていません。adj = 1 はテキストを右揃えに設定していますが、これはテキストの左端が指定した座標点に来るようにするものです。ただし、ここでの意図としては、テキストをポイントの上に配置し、少し右にずらすことを意図しているようですが、実際には adj = 1 はテキストをポイントの左に配置します。また、latitude + 0.05 はテキストをポイントよりも少し上に配置するために使われています。

pchの設定について

こちらの記事が参考になります。

シェープファイルから地図を描こう!

シェープファイルとは?

シェープファイルは、地理情報システム(GIS)で使用するベクターデータのフォーマットです。ベクターデータは、点、線、面などの形状で空間情報を表現します。シェープファイルは、GISソフトウェア間でデータ交換を行うためのオープンな標準フォーマットとして広く利用されています。

シェープファイルは、複数のファイルで構成されています。主なファイルは以下の通りです。

  • .shpファイル: シェープファイルの形状情報
  • .shxファイル: シェープファイルのインデックスファイル
  • .dbfファイル: シェープファイルの属性情報

これらのファイルに加えて、.prjファイルや.sbnファイルなど、その他のファイルが含まれることもあります。

シェープファイルは、GISソフトウェアを使って読み込み、編集、分析することができます。
また、Rでも利用することもできます。

シェープファイルの利点は、以下の通りです。

  • オープンな標準フォーマットであるため、GISソフトウェア間でデータ交換が容易
  • シンプルな構造であるため、理解しやすい
  • 多くのGISソフトウェアでサポートされている

シェープファイルは、GISで最も広く利用されているデータフォーマットの一つです。
GISで空間データを扱う際には、シェープファイルの理解と利用が重要です。

シェープファイルの入手方法は?

シェープファイルは国土地理院のHPでダウンロードできます。

国土地理院のHPにいくと次の写真のように、行政区域というタブがあるのでそこをクリックします。

すると次のようなページが表示されます。

今回は近畿地方の地図を描こうと思うので、画面をしたにスクロールし近畿地方のGMLファイルをダウンロードします。

GMLファイルとは?

GMLファイルは、Geography Markup Languageの略称で、地理空間データを記述するためのXMLフォーマットです。XMLは、構造化されたデータを記述するための汎用的なフォーマットです。GMLは、XMLを利用して、地理空間データの座標、属性、トポロジなどを記述します。

GMLファイルは、GISソフトウェアで読み込み、編集、分析することができます。また、WebGISなどのWebアプリケーションで利用することもできます。

ダウンロードしたら、Zipファイルを解凍しておきます。

シェープファイルをRで読み込んで地図を描くスクリプト

library(dplyr)
library(ggplot2)
library(sf)

# 国土地理院のHPから近畿地方のGMLファイルをダウンロードして地図を描く
#ファイルパスの所は、解凍したGML.zipのフォルダまでのファイルパスを設定してください。
japan_gml <- read_sf("ファイルパス/N03-20240101_56_GML", layer = "N03-20240101_56_prefecture")
ggplot(data = japan_gml) +
  geom_sf() +
  theme_minimal()

# 確認用に列名を表示
str(japan_gml)

# 都道府県名のデータフレームを作成
pref_df <- data.frame(
  N03_001 = c("26", "27", "28", "29", "30"),
  pref_name = c("京都府", "大阪府", "兵庫県", "奈良県", "和歌山県")
)

# 地図と都道府県名のデータフレームを結合
japan_gml <- left_join(japan_gml, pref_df, by = "N03_001")

# 各都道府県の重心を計算
japan_gml <- japan_gml %>% 
  mutate(centroid = st_centroid(geometry, of_largest_polygon = TRUE))

# 地図を描画
ggplot(data = japan_gml) +
  geom_sf(aes(fill = N03_001)) +
  geom_sf_text(aes(label = pref_name, geometry = centroid), color = "red") +  # 重心の座標を直接使用
  labs(fill = "都道府県コード") +  # レジェンドのタイトルを修正
  theme_minimal()

スクリプトの説明

このRスクリプトは、日本の地理情報を読み込み、特に近畿地方の都道府県を地図上に表示し、それぞれの都道府県の重心に都道府県名をテキストで表示するためのものです。以下に、スクリプトの各部分の詳細な説明を示します。

  • データ操作にdplyr、データの可視化にggplot2、空間データの取り扱いにsf(Simple Features)を使用するため、これらのライブラリを読み込んでいます。
  • read_sf関数を使用して、指定されたファイルパスからGMLファイル形式の空間データを読み込み、japan_gmlというオブジェクトに格納しています。このデータには、日本の都道府県の境界などの地理情報が含まれています。
  • ggplot2を使用して、読み込んだ空間データから基本的な地図を描画しています。geom_sf()関数は、空間データの描画に特化しており、theme_minimal()によって余計な装飾を省いたシンプルな地図を生成しています。
  • str()関数を使用して、japan_gmlオブジェクトの構造を確認しています。これにより、データの列名やデータ型などの詳細情報を確認できます。
  • 近畿地方の都道府県に対応するコードと名前を含む新しいデータフレームpref_dfを作成しています。
  • left_join関数を使って、地理情報を含むjapan_gmlと都道府県名を含むpref_dfを結合しています。これにより、地理情報と都道府県名が1つのデータフレームに統合されます。
    1. mutate()st_centroid()を使用して、各都道府県の重心を計算し、japan_gmlに新しい列として追加しています。その後、改めて地図を描画し、geom_sf()で都道府県の境界を色分けし、geom_sf_text()で計算された重心の位置に都道府県名を赤色のテキストで表示しています。labs()関数で凡例のタイトルを設定し、再度theme_minimal()でシンプルなデザインを適用しています。

    このスクリプト全体を通じて、Rを使用して日本の近畿地方の地図を作成し、各都道府県にラベルを付けるプロセスを実行しています。

生成される地図は次のとおりです。

最後に先ほどのグラフに京都御所のテキストと位置をプロットするスクリプトをご紹介します。

library(dplyr)
library(ggplot2)
library(sf)

# 国土地理院のHPから近畿地方のGMLファイルをダウンロードして地図を描く

#ファイルパスの所は、解凍したGML.zipのフォルダまでのファイルパスを設定してください。
japan_gml <- read_sf("ファイルパス/N03-20240101_56_GML", layer = "N03-20240101_56_prefecture")
ggplot(data = japan_gml) +
  geom_sf() +
  theme_minimal()

# 確認用に列名を表示
str(japan_gml)

# 都道府県名のデータフレームを作成
pref_df <- data.frame(
  N03_001 = c("26", "27", "28", "29", "30"),
  pref_name = c("京都府", "大阪府", "兵庫県", "奈良県", "和歌山県")
)

# 地図と都道府県名のデータフレームを結合
japan_gml <- left_join(japan_gml, pref_df, by = "N03_001")

# 各都道府県の重心を計算
japan_gml <- japan_gml %>% 
  mutate(centroid = st_centroid(geometry, of_largest_polygon = TRUE))

# 京都御所のデータフレームを作成
kyoto_gosho_df <- data.frame(
  name = "京都御所",
  lon = 135.7621,  # 経度
  lat = 35.0254    # 緯度
)

# sfオブジェクトに変換
kyoto_gosho_df <- st_as_sf(kyoto_gosho_df, coords = c("lon", "lat"), crs = st_crs(japan_gml))


# 地図を描画し、京都御所の位置を追加
ggplot(data = japan_gml) +
  geom_sf(aes(fill = N03_001)) +
  geom_sf_text(aes(label = pref_name, geometry = centroid), color = "red") +
  geom_sf(data = kyoto_gosho_df, color = "black", size = 2) +  # 京都御所の位置をポイントで追加
  geom_sf_label(aes(label = "京都御所", geometry = geometry), 
                data = kyoto_gosho_df, 
                color = "blue", 
                nudge_x = -0.1,  # ここを調整: 東西方向の移動 値を小さくすると西
                nudge_y = 0.09,  # ここを調整: 南北方向の移動 値を小さくすると南
                size = 5, 
                bg = "white") +  # テキストの背景色
  labs(fill = "都道府県コード") +
  theme_minimal()

まとめ

R言語を使って、簡単に地図を描画することができます。ggplot2、maps、mapdataパッケージを使って、さまざまな種類の地図を作成することができます。

本記事を参考に、R言語で地図を描画してみてください。

-特殊なグラフ
-