本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

Rで解析:地理空間データをインタラクティブに可視化できる「geovizr」パッケージの紹介

地理空間データを可視化し、地域特性や分布を効果的に伝える作業は、多くの分野で重要な課題です。例えば、疫学研究では疾患のリスク分布をわかりやすく示すことが求められます。

本パッケージ「geovizr」はJavaScriptの geoviz ライブラリ(d3ベースの主題図作成ライブラリ)をRから使えるようにしたものです。オプション名はJS版とほぼ同じで、Rでは |> パイプでレイヤーを積み重ねていくスタイルになっています。

パッケージバージョンは1.0.0。Windows 11 x64 (build 26200)のR version 4.6.0で確認しています。

パッケージのインストール

下記コマンドを実行してください。

# パッケージのインストール
install.packages("geovizr")
# パッケージの読み込み
library("geovizr")
# コマンド例実行で必要なパッケージを読み込み
library("sf")
スポンサーリンク

コマンド例

詳細はコメント、パッケージのヘルプを確認してください。

地図作成の最初のステップ、マップコンテナの生成:viz_createコマンド

SVGコンテナを作り、投影法・余白・幅高さなどの全体設定おこないます。オプションは下記のとおりです。

オプション名説明
idSVGコンテナのid(既定 “map”)
width地図の幅を手動指定。responsive = TRUEの場合、これは「地図座標系での」幅であり、実際の表示サイズとは一致しない点に注意
resizeウィンドウサイズ変更時に再計算して再描画するか(既定 TRUE、ドキュメント本文は”default FALSE”と矛盾記載あり注意)
domain表示範囲を決めるsfオブジェクト
responsiveコンテナに応じて見た目だけ拡大縮小するか(再計算はしない、既定 TRUE)
projection投影法。”mercator”, “equalearth”, “Polar”, “Spilhaus” など
background背景色
fontFamily地図全体のフォント
margin余白。単一値 or c(top, right, bottom, left)
zoomableズーム有効化。数値でズーム範囲指定、”versor”で球体ズーム
controlズームコントロールパネル表示。位置を2値ベクトルで指定も可(既定 TRUE)
warning地図上の警告表示(既定 TRUE)

ポリゴン/ライン/ポイント共通のレイヤーを追加:viz_pathコマンド

SVGコンテナにパスレイヤーを追加します。オプションは下記のとおりです。

オプション名説明
mapviz_create()で作ったマップオブジェクト(第1引数、パイプで渡る)
datasfデータフレーム。反復処理を有効化(フィーチャごとにスタイル関数やツールチップを適用可能)
datumsfデータフレーム。反復不要な場合(全体を1つの図形として描画、軽量)
idレイヤーの一意なid
coords座標系。既定”geo”。すでにSVG座標なら”svg”
clipアウトラインでクリッピングするか(既定TRUE)
fill塗り色。関数を渡すとコロプレス図・タイポロジー図に使える
stroke線色。同様に関数指定可
strokeWidth線幅(既定1)。関数指定可
tipツールチップ。TRUEで全フィールド表示、関数で任意定義(既定FALSE)
simplify図形簡略化。TRUEで自動、数値で固定許容誤差、c(k1, k2)でズーム連動の動的簡略化
rewindポリゴンの巻き方向(winding order)を補正するか
rewindPole極や日付変更線をまたぐ図形向けの特殊補正
clipOutline反子午線・極付近のクリッピング。TRUEで0.01度
rポイント図形の半径(既定3)

インタラクティブな地図の作成例

世界各国を人口密度で色分けし、日本だけを赤枠で強調表示するインタラクティブな地図の作成例です。

# 必要パッケージの読み込み
library("sf")       # 空間データ操作
library("geovizr")  # 地図描画
library("scales")   # 色スケール生成(col_numeric)

### データ準備#####
# パッケージ同梱のサンプル世界地図(GeoPackage形式)を読み込み
world <- st_read(
  system.file("gpkg/world.gpkg", package = "geovizr"),
  quiet = TRUE
)

# 各国の面積を計算し、単位をm^2からkm^2に変換
world$area_km2 <- as.numeric(st_area(world)) / 1e6

# 人口密度(人/km^2)を算出
world$pop_density <- as.numeric(world$pop) / world$area_km2

# ゼロ除算等で発生したInf/NAを除いた値でドメイン(色スケールの範囲)を作る
finite_density <- world$pop_density[is.finite(world$pop_density)]

# 色スケールを作成(人口密度は偏りが大きいので対数変換してから渡す)
pal <- col_numeric(
  palette = c("#f1f3f5", "#ffd166", "#ef476f", "#7b2cbf"),
  domain  = log1p(finite_density)
)

# 各国に塗る色を計算し、新しい列として追加
# ※viz_pathのfill/tipには「事前計算したベクトル」ではなく
#   「GeoJSONのプロパティ名(列名)を文字列で渡す」必要がある
world$fill_color <- pal(log1p(world$pop_density))

# ツールチップ用のテキストを事前に作成
world$tip_text <- paste0(
  world$NAMEen, ":",
  round(world$pop_density, 1), " 人/km²"
)

# 強調表示したい国(日本)だけを抽出
# ISO3コード列で絞り込む(NAMEen列は英語国名なので"Japan"を使う)
japan <- world[world$ISO3 == "JPN", ]

# 抽出できているか件数を確認(1件になっていればOK)
nrow(japan)

# --- 地図構築 ---

viz_create(
  projection = "mercator",     # 投影法(メルカトル)
  background = "#e9ecef",      # 背景色
  margin     = c(20, 10, 10, 10)  # 余白 top, right, bottom, left
) |>
  # コロプレス図本体:世界全体を国ごとに反復処理し、色分け・チップを付ける
  viz_path(
    data        = world,
    fill        = "fill_color",   # 列名を文字列で指定
    stroke      = "white",
    strokeWidth = 0.3,
    tip         = "$tip_text"     # $プレフィックス付きで参照
  ) |>
  # 強調レイヤー:日本のみを一括描画し、赤枠で目立たせる
  viz_path(
    datum       = japan,
    fill        = "none",         # SVG的に「塗りなし」
    stroke      = "#ff0000",
    strokeWidth = 2.5,
    clip        = TRUE
  ) |>
  viz_render()

上記コードを実行するとインタラクティブなマップが表示されます。下記は静止な画像ファイルです。

地図に円形の凡例を追加する:viz_leg_circlesコマンド

# パッケージ同梱のサンプル世界地図(GeoPackage形式)を読み込み
world <- st_read(
  system.file("gpkg/world.gpkg", package = "geovizr"),
  quiet = TRUE
)

viz_create(projection = "EqualEarth", background = "white") |>
  viz_path(datum = world, fill = "#f1f3f5") |>
# 地図に円形の凡例を追加する:viz_leg_circlesコマンド
#   mapオプション:地図オブジェクト。
#   idオプション:ユニークなレイヤーIDを指定;初期値NULL
#   posオプション:凡例の位置を指定 (x, y);初期値c(0, 0)
#   gapオプション:要素間のギャップを指定;初期値2
#   dataオプション:数字ベクトルを指定。;初期値c(1, 1000)
#   kオプション:半径最大の円の値(デフォルトは50)。;初期値50
#   fixmaxオプション:半径kに対応する値;初期値NULL
#   nbオプション:円の数を指定。;初期値4
#   circle_fillオプション:円の塗りつぶしを指定。(ヘルプ参照);初期値"none"
#   circle_strokeオプション:円の輪郭の色を指定。;初期値"#363636"
#   circle_spacingオプション:円同士の間隔を指定。;初期値5
#   line_strokeオプション:線の色を指定。;初期値"#363636"
#   line_strokeDasharrayオプション:線のスタイルを指定。(ヘルプ参照);初期値"1"
#   line_strokeWidthオプション:線の太さを指定。;初期値0.7
#   line_lengthオプション:線の長さを指定。;初期値10
#   values_textAnchorオプション:テキストの揺りかごを指定。;初期値"start"
#   values_dxオプション:X軸方向のずれを指定。;初期値5
#   values_dyオプション:数字を指定;初期値0
#   values_fillオプション:色を指定;初期値"#363636"
#   values_fontSizeオプション:文字の大きさを指定;初期値10
#   values_factorオプション:倍率を指定;初期値1
#   values_decimalオプション:区切り記号を指定;初期値"."
#   values_thousandsオプション:千の位の区切りを指定;初期値" "
#   titleオプション:タイトルを指定;初期値""
#   title_fillオプション:タイトルの色を指定;初期値"#363636"
#   title_fontSizeオプション:タイトルの大きさを指定;初期値16
#   subtitleオプション:サブタイトルを指定;初期値""
#   subtitle_fillオプション:色を指定。;初期値"#363636"
#   subtitle_fontSizeオプション:サイズを指定。;初期値12
#   noteオプション:メモを入力。;初期値""
#   note_fillオプション:メモの色を指定。;初期値"#363636"
#   note_fontSizeオプション:メモのサイズを指定。;初期値10
#   frameオプション:フレームを描画するかどうかを指定。;初期値FALSE
#   frame_marginオプション:フレームの余白を指定。;初期値15
#   frame_fillオプション:フレームの塗りつぶし色を指定。;初期値"white"
#   frame_strokeオプション:フレームの枠線の色を指定。;初期値"black"
#   frame_fillOpacityオプション:フレームの透明度を指定。;初期値0.5
  viz_leg_circles(pos = c(20, 20)) |>
  viz_render()

色と形状でデータを地図にプロット:viz_propchoroコマンド

# パッケージ同梱のサンプル世界地図(GeoPackage形式)を読み込み
world <- st_read(
  system.file("gpkg/world.gpkg", package = "geovizr"),
  quiet = TRUE
)

viz_create(
  projection = "EqualEarth", background = "white",
  zoomable = TRUE
) |>
  viz_path(
    datum = world, fill = "#f1f3f5"
  ) |>
# 色と形状でデータを地図にプロット:viz_propchoroコマンド
#   mapオプション:地図オブジェクト。
#   dataオプション:特徴を反復処理するためのデータ。;初期値NULL
#   var1オプション:絶対値の変数名。
#   var2オプション:相対値の変数名。
#   varオプション:(ヘルプ参照);初期値NULL
#   symbolオプション:シンボルの型。;初期値"circle"
#   kオプション:最大シンボルサイズ。;初期値50
#   fixmaxオプション:シンボルkに対応する値。;初期値NULL
#   dodgeオプション:シンボル重畳を避けるか。;初期値FALSE
#   widthオプション:スパイクシンボルの幅。;初期値30
#   straightオプション:スパイクシンボルの曲率。;初期値0
#   methodオプション:コロプレートの分類方法。;初期値"quantile"
#   nbオプション:クラス数。(デフォルトは6。);初期値6
#   breaksオプション:数値ベクトル。任意。;初期値NULL
#   colorsオプション:文字やベクトル。任意。DICOPALライブラリの色パレットや色ベクトルを指定する。(ヘルプ参照);初期値NULL
#   middleオプション:中央クラスかどうかの指定。(デフォルトは FALSE。);初期値FALSE
#   sdオプション:標準偏差の数。(デフォルトは1。);初期値1
#   reverseオプション:色パレットを反転するかどうか。(デフォルトは FALSE。);初期値FALSE
#   missingオプション:色を指定;初期値"white"
#   legendオプション:論理値。任意。凡例を表示するかどうか(デフォルトはTRUE)。;初期値TRUE
#   leg1_typeオプション:文字。任意。凡例の種類(デフォルトは「nested」)。;初期値"nested"
#   leg2_typeオプション:文字。任意。地図凡例の種類(デフォルトは「vertical」)。;初期値"vertical"
#   leg1_posオプション:数値ベクトル。任意。凡例の位置(デフォルトはc(10, 10))。;初期値c(10, 10)
#   leg2_posオプション:数値ベクトル。任意。地図凡例の位置。;初期値NULL
  viz_propchoro(
    data = world, var1 = "pop", k = 25,
    leg1_values_round = 0, var2 = "gdppc",
    leg1_title = "Population",
    leg1_subtitle = "(million inh.)",
    leg1_values_factor = 1 / 1000000,
    leg2_values_round = 0,
    leg2_title = "GDP per inh.",
    colors = "Temps"
  ) |>
  viz_render()

特定の地域やカテゴリごとに色分けやシンボルをプロット

# パッケージ同梱のサンプル世界地図(GeoPackage形式)を読み込み
world <- st_read(
  system.file("gpkg/world.gpkg", package = "geovizr"),
  quiet = TRUE
)

viz_create(
  projection = "EqualEarth", background = "white",
  zoomable = TRUE
) |>
  viz_path(
    datum = world, fill = "#f1f3f5"
  ) |>
# viz_proptypo() の引数(全20個・初期値つき):
#   mapオプション:地図オブジェクト。
#   dataオプション:特徴を反復処理するためのデータ。;初期値NULL
#   var1オプション:絶対値の変数名。
#   var2オプション:文字。必須。カテゴリーマッピングに使用する数値変数の名前。
#   varオプション:(ヘルプ参照);初期値NULL
#   symbolオプション:シンボルの型。;初期値"circle"
#   kオプション:最大シンボルサイズ。;初期値50
#   fixmaxオプション:シンボルkに対応する値。;初期値NULL
#   dodgeオプション:論理値。任意。シンボルの重なりを避けるかどうか(デフォルトはFALSE)。;初期値FALSE
#   widthオプション:スパイクシンボルの幅。;初期値30
#   straightオプション:スパイクシンボルの曲率。;初期値0
#   colorsオプション:文字やベクトル。任意。DICOPALライブラリの色パレットや色ベクトルを指定する。(ヘルプ参照);初期値NULL
#   orderオプション:文字ベクトル。任意。カテゴリカル値の明示的な順序。;初期値NULL
#   alphabeticalオプション:真偽値。指定されたカテゴリをアルファベット順に並べるかどうか。;初期値TRUE
#   missingオプション:色を指定;初期値"white"
#   legendオプション:論理値。任意。凡例を表示するかどうか(デフォルトはTRUE)。;初期値TRUE
#   leg1_typeオプション:文字。任意。凡例の種類(デフォルトは「nested」)。;初期値"nested"
#   leg2_typeオプション:文字列。レジェンドのタイプを指定する。;初期値"vertical"
#   leg1_posオプション:数値ベクトル。任意。凡例の位置(デフォルトはc(10, 10))。;初期値c(10, 10)
#   leg2_posオプション:数値ベクトル。レジェンドの位置を指定する。;初期値NULL
  viz_proptypo(
    data = world, var1 = "pop", k = 25,
    leg1_values_round = 0, var2 = "region",
    leg1_title = "Population",
    symbol = "square",
    leg1_subtitle = "(million inh.)",
    leg1_values_factor = 1 / 1000000,
    leg2_title = "Continents",
    colors = "Set3"
  ) |>
  viz_render()

地図上にテキストを追加:viz_textコマンド

# パッケージ同梱のサンプル世界地図(GeoPackage形式)を読み込み
world <- st_read(
  system.file("gpkg/world.gpkg", package = "geovizr"),
  quiet = TRUE
)

viz_create(projection = "EqualEarth", width = 750, background = "white") |>
  viz_path(datum = world, fill = "#f1f3f5") |>
  # 地図上にテキストを追加:viz_textコマンド
  #   mapオプション:地図オブジェクト。
  #   idオプション:ユニークなレイヤーIDを指定;初期値NULL
  #   dataオプション:空間データフレーム。;初期値NULL
  #   textオプション:文字列や関数。表示するテキストを指定する。;初期値"text"
  #   textAnchorオプション:文字列や関数。アンカーの位置を指定する。;初期値NULL
  #   dominantBaselineオプション:文字列。基準の揃え方を指定する。;初期値NULL
  #   fontFamilyオプション:文字列。フォントファミリーを指定する。;初期値NULL
  #   fontSizeオプション:数値。フォントサイズを指定する。;初期値12
  #   lineSpacingオプション:数値。行間隔を指定する。;初期値0
  #   posオプション:座標の位置を指定する。;初期値c(0, 0)
  #   dxオプション:水平方向のずれを指定する。(ヘルプ参照);初期値0
  #   dyオプション:数字を指定;初期値0
  #   sortオプション:ラベルを並べる基準を指定する。;初期値NULL
  #   descendingオプション:並び順を指定する。;初期値FALSE
  #   coordsオプション:座標系を指定する。;初期値"geo"
  #   fillオプション:塗りつぶし色を指定する。;初期値NULL
  #   strokeオプション:線の色を指定する。;初期値NULL
  #   strokeWidthオプション:線の太さを指定する。;初期値1
  #   strokeLinejoinオプション:線の接続方法を指定する。;初期値"round"
  viz_text(
    pos = c(100, 200), coords = "svg",
    text = "からだにいいもの",
    fill = "#38896F", fontSize = 30
  ) |>
  viz_render()

# 例2
viz_create(projection = "EqualEarth", background = "white") |>
  viz_path(datum = world, fill = "#f1f3f5") |>
  viz_text(data = world, text = "ISO3", fill = "#38896F") |>
  viz_render()

データポイントを円で表現:viz_circleコマンド

# パッケージ同梱のサンプル世界地図(GeoPackage形式)を読み込み
world <- st_read(
  system.file("gpkg/world.gpkg", package = "geovizr"),
  quiet = TRUE
)

viz_create(projection = "EqualEarth") |>
  viz_path(datum = world, fill = "#f1f3f5") |>
  # データポイントを円で表現:viz_circleコマンド
  #   mapオプション:地図オブジェクト。
  #   dataオプション:空間データフレームを指定;初期値NULL
  #   idオプション:ユニークなレイヤーIDを指定;初期値NULL
  #   posオプション:円の位置を指定;初期値c(0, 0)
  #   rオプション:円の半径を指定;初期値10
  #   kオプション:最大円の半径を指定;初期値50
  #   fixmaxオプション:比較用の値を指定;初期値NULL
  #   dodgeオプション:円の重なりを避けるか指定;初期値FALSE
  #   iterationオプション:回避処理の反復回数を指定;初期値200
  #   sortオプション:円をソートするフィールド名や関数を指定;初期値NULL
  #   descendingオプション:ソート順を指定;初期値NULL
  #   coordsオプション:地理座標系を指定する。;初期値"geo"
  #   fillオプション:塗りつぶし色を指定する。;初期値NULL
  #   strokeオプション:ストロークの色を指定する。;初期値"white"
  #   tipオプション:ツールチップの定義を指定する。(ヘルプ参照);初期値FALSE
  viz_circle(data = world, r = 5, fill = "#38896F") |>
  viz_render()

地図の表示領域からクリッピングした地図を作成:viz_clipPathコマンド

# パッケージ同梱のサンプル世界地図(GeoPackage形式)を読み込みと日本を抽出
world <- st_read(
  system.file("gpkg/world.gpkg", package = "geovizr"),
  quiet = TRUE
)
jpn <- world[world$ISO3 == "JPN", ]

viz_create(margin = 5, projection = "mercator") |>
  # 地図の表示領域からクリッピングした地図を作成:viz_clipPathコマンド
  #   mapオプション:地図オブジェクト。
  #   idオプション:クリッピングパスに一意のIDを付ける。;初期値NULL
  #   datumオプション:クリッピング用のジオメトリを指定する。;初期値list(type = "Sphere")
  #   permanentオプション:クリッピングパスが静的かどうかを指定する。;初期値FALSE
  viz_clipPath(id = "jpnclip", datum = jpn, permanent = TRUE) |>
  viz_tile(url = "worldStreet", clipPath = "url(#jpnclip)") |>
  viz_render()

この記事が誰かの役に立ちますように。

スポンサーリンク
価格および配送状況は変更される場合があります。購入時は商品ページをご確認ください。
当サイトに表示されている商品情報はAmazonから提供されたものであり、更新または削除される場合があります。
karada-goodはAmazonアソシエイトとして、適格販売により収入を得ています。