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

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

Rで解析:多変量データをグリフで可視化!「ggmultiglyph」パッケージ

散布図に多変量の情報を重ねることで、点の位置だけでは伝えきれない特徴を一枚の図に表現できます。しかし、複数の変数を一つの図形(グリフ)として描き分けるには、座標の計算や描画処理を個別に組み立てる必要があり、手間がかかります。

グリフ(glyph)とは、データの値を図形の大きさ・長さ・角度・色などに割り当てて表現する記号です。多変量データの可視化では、一つの観測値に一つのグリフを対応させ、散布図上の各点をグリフに置き換えることで、位置情報と複数の変数の情報を同時に示すことができます。

「ggmultiglyph」パッケージは、多変量データをグリフとして可視化できるggplot2向けのパッケージです。積み上げ点、花、泡、円、放射状の光線、プロファイルなど、複数の形式のグリフを描画するコマンドが用意されています。

また、gridによる描画に使用できるグリフオブジェクトを単体で生成したり、グリフ同士の重なりを避けて配置したり、グリフそのものを凡例として利用したりすることもできます。本パッケージを利用することで、多変量データの特徴や傾向を散布図上で視覚的に整理して示すことができます。

パッケージのバージョンは0.1.0です。Windows 11 x64(build 26200)、R version 4.6.1で動作を確認しています。

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

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

# パッケージのインストール
install.packages("ggmultiglyph")

# パッケージの読み込み
library("ggmultiglyph")

# コマンド例の実行に必要なパッケージの読み込み
library("ggplot2")
library("grid")
library("gridExtra")
library("scales")
library("RColorBrewer")
スポンサーリンク

サンプルデータの作成

本記事では、架空の道の駅12施設を8項目について5段階で評価したデータを使用します。年間来場者数と年間売上高を散布図の座標に使用し、8項目の評価をグリフとして表示します。

# 道の駅の評価データを作成
michi <- data.frame(
  ekimei = c("あおば野", "しらかば峠", "こもれび湖", "かぜのおか",
             "みずなら川", "ゆきわり平野", "はまなす浜", "からまつ台地",
             "すずらん谷", "とどまつ原", "くまざさ沢", "はくちょう沼"),

  chiiki = factor(c("道央", "道央", "道央", "道央",
                    "道北", "道北", "道北", "道北",
                    "道東", "道東", "道東", "道東"),
                  levels = c("道央", "道北", "道東")),

  # 年間来場者数(万人)
  raijo = c(58.2, 41.6, 33.4, 62.7, 27.8, 19.5,
            45.1, 22.3, 38.9, 15.4, 29.6, 50.3),

  # 年間売上高(百万円)
  uriage = c(412, 288, 236, 455, 190, 132,
             318, 158, 274, 108, 205, 366),

  # 8項目の5段階評価
  nousan = c(5, 4, 3, 5, 4, 2, 3, 2, 4, 1, 3, 5),
  kakou = c(4, 5, 2, 4, 3, 2, 4, 3, 3, 2, 2, 4),
  inshoku = c(4, 3, 5, 5, 2, 3, 4, 2, 5, 1, 3, 4),
  miyage = c(3, 4, 4, 5, 3, 2, 5, 3, 2, 2, 4, 5),
  kyukei = c(5, 3, 4, 4, 4, 3, 3, 4, 3, 3, 5, 4),
  joho = c(3, 4, 3, 4, 2, 4, 3, 3, 4, 2, 3, 5),
  keikan = c(4, 5, 5, 3, 5, 4, 5, 4, 3, 5, 4, 3),
  chusha = c(5, 3, 3, 5, 4, 4, 3, 5, 4, 4, 2, 4),

  stringsAsFactors = FALSE
)

# グリフに割り当てる評価項目
kmk <- c("nousan", "kakou", "inshoku", "miyage",
         "kyukei", "joho", "keikan", "chusha")

# 数値版のデータを作成
michi_num <- michi

# 評価値を0.15から1の範囲に変換
michi_num[kmk] <- lapply(
  michi_num[kmk],
  function(x) rescale(x, to = c(0.15, 1))
)

# 順序付き因子版のデータを作成
michi_ord <- michi

michi_ord[kmk] <- lapply(
  michi_ord[kmk],
  function(x)
    ordered(
      x,
      levels = 1:5,
      labels = c("E", "D", "C", "B", "A")
    )
)

# 単体グリフ用の評価値
z_aoba <- as.numeric(
  michi[michi$ekimei == "あおば野", kmk]
)

zn_aoba <- as.numeric(
  michi_num[michi_num$ekimei == "あおば野", kmk]
)

# 評価項目ごとの配色
clr_kmk <- brewer.pal(8, "Dark2")

# 作図テーマ
theme_set(theme_bw(base_size = 12))

ggmultiglyphで利用できる主なグリフ

ggmultiglyphでは、グリフを単体のgridオブジェクトとして作成するコマンドと、ggplot2上に直接描画するgeomコマンドが用意されています。主なコマンドを一覧にすると次のようになります。

グリフ単体で作成ggplot2で描画主な特徴
積み上げ点dotglyphGrob()geom_dotglyph()値を点の数や配置で表現
flowerglyphGrob()geom_flowerglyph()値を花弁の長さや面積で表現
bubbleglyphGrob()geom_bubbleglyph()複数の円の大きさで表現
光線metroglyphGrob()geom_metroglyph()中心から伸びる光線の長さで表現
pieglyphGrob()geom_pieglyph()扇形の半径や中心角で表現
プロファイルprofileglyphGrob()geom_profileglyph()棒や折れ線で複数の値を表現

グリフを単体で作成

「*glyphGrob()」形式のコマンドを使用すると、ggplot2とは独立したgridオブジェクトとしてグリフを作成できます。ここでは、積み上げ点グリフと花グリフを例に紹介します。

dotglyphGrobコマンドでは値を積み上げた点として表現し、flowerglyphGrobコマンドでは各値を花弁の長さとして表現できます。

# 積み上げ点グリフ
dg <- dotglyphGrob(
  x = unit(0.5, "npc"),
  y = unit(0.5, "npc"),
  z = z_aoba,
  radius = 2
)

# 花グリフ
fg <- flowerglyphGrob(
  x = unit(0.5, "npc"),
  y = unit(0.5, "npc"),
  z = zn_aoba,
  size = 18,
  petal.width = 0.3,
  scale.length = TRUE
)

# 横に並べてプロット
grid.arrange(dg, fg, nrow = 1)

ggplot2上にグリフをプロット

geom系のコマンドでは、通常のggplot2と同じようにx座標とy座標を指定し、colsオプションにグリフとして表示する列を指定します。同じデータを異なるグリフで表現した例を紹介します。

積み上げ点:geom_dotglyphコマンド

geom_dotglyphコマンドでは、複数の値を積み上げた点として表示します。colsオプションには因子型の列を指定するため、ここでは順序付き因子版のmichi_ordを使用します。

ggplot(data = michi_ord) +
  geom_dotglyph(
    aes(x = raijo, y = uriage, fill = chiiki),
    cols = kmk,
    radius = 0.4,
    alpha = 0.8
  ) +
  xlim(c(5, 75)) +
  ylim(c(0, 550)) +
  labs(
    x = "年間来場者数(万人)",
    y = "年間売上高(百万円)",
    fill = "地域区分"  )

花:geom_flowerglyphコマンド

geom_flowerglyphコマンドでは、各項目を花弁として配置し、その長さや面積で値を表現できます。

ggplot(data = michi_num) +
  geom_flowerglyph(
    aes(x = raijo, y = uriage, fill = chiiki),
    cols = kmk,
    size = 8,
    petal.base.shape = 3,
    petal.width = 0.25,
    alpha = 0.8
  ) +
  xlim(c(5, 75)) +
  ylim(c(0, 550)) +
  labs(
    x = "年間来場者数(万人)",
    y = "年間売上高(百万円)",
    fill = "地域区分"  )

泡:geom_bubbleglyphコマンド

geom_bubbleglyphコマンドでは、複数の値を泡の大きさとして表示できます。

ggplot(data = michi_num) +
  geom_bubbleglyph(
    aes(x = raijo, y = uriage, fill = chiiki),
    cols = kmk,
    size = 1.2,
    alpha = 0.8
  ) +
  xlim(c(5, 75)) +
  ylim(c(0, 550)) +
  labs(
    x = "年間来場者数(万人)",
    y = "年間売上高(百万円)",
    fill = "地域区分"  )

光線:geom_metroglyphコマンド

geom_metroglyphコマンドでは、中央の円から伸びる放射状の光線の長さで複数の値を表現します。

ggplot(data = michi_num) +
  geom_metroglyph(
    aes(x = raijo, y = uriage, colour = chiiki),
    cols = kmk,
    circle.size = 2,
    linewidth.circle = 1.2,
    linewidth.ray = 1.2,
    size = 8,
    alpha = 0.8
  ) +
  xlim(c(5, 75)) +
  ylim(c(0, 550)) +
  labs(
    x = "年間来場者数(万人)",
    y = "年間売上高(百万円)",
    colour = "地域区分")

円:geom_pieglyphコマンド

geom_pieglyphコマンドでは、各項目を扇形として配置し、半径や中心角によって値を表現できます。

ggplot(data = michi_num) +
  geom_pieglyph(
    aes(x = raijo, y = uriage, fill = chiiki),
    cols = kmk,
    size = 8,
    alpha = 0.8
  ) +
  xlim(c(5, 75)) +
  ylim(c(0, 550)) +
  labs(
    x = "年間来場者数(万人)",
    y = "年間売上高(百万円)",
    fill = "地域区分")

プロファイル:geom_profileglyphコマンド

geom_profileglyphコマンドでは、複数の値を棒や折れ線のプロファイルとして表示できます。

ggplot(data = michi_num) +
  geom_profileglyph(
    aes(x = raijo, y = uriage, fill = chiiki),
    cols = kmk,
    size = 4,
    width = 1,
    alpha = 0.8
  ) +
  xlim(c(5, 75)) +
  ylim(c(0, 550)) +
  labs(
    x = "年間来場者数(万人)",
    y = "年間売上高(百万円)",
    fill = "地域区分")

グリフの表示方法を変更

各geomコマンドでは、グリフの種類に応じて色や大きさなどを調整できます。また、複数のgeomで共通して利用できる機能もあります。

機能主な指定内容
グリフの大きさsize、radiusなどグリフや構成要素の大きさを調整
塗りつぶしfillグリフの塗りつぶし色を指定
輪郭色colourグリフの輪郭や線の色を指定
項目ごとの色fill.petal、fill.segment、fill.barなどグリフを構成する各項目を色分け
グラデーションfill.gradient値に応じたグラデーションで表示
段階水準draw.grid = TRUE順序付き因子の水準をグリフ内に表示
重なり回避repel = TRUEグリフ同士を反発させて配置
パネル分割facet_grid()グループごとにプロットを分割

評価項目ごとに色分け

グリフを構成する各項目に異なる色を指定することもできます。次の例では、8つの評価項目をそれぞれ異なる色の扇形として表示します。

ggplot(data = michi_num) +
  geom_pieglyph(
    aes(x = raijo, y = uriage),
    cols = kmk,
    size = 8,
    fill.segment = clr_kmk,
    alpha = 0.8
  ) +
  xlim(c(5, 75)) +
  ylim(c(0, 550)) +
  labs(
    x = "年間来場者数(万人)",
    y = "年間売上高(百万円)")

グリフ同士の重なりを回避

グリフは通常の点よりも大きいため、観測値が近いと互いに重なりやすくなります。repel = TRUEを指定すると、元の座標を基準としながらグリフ同士を反発させて配置できます。

ggplot(data = michi_num) +
  # 元の座標を点で表示
  geom_point(
    aes(x = raijo, y = uriage, colour = chiiki)) +
  
  # 花グリフを反発配置
  geom_flowerglyph(
    aes(x = raijo, y = uriage, fill = chiiki),
    cols = kmk,
    size = 8,
    petal.base.shape = 3,
    petal.width = 0.25,
    repel = TRUE) 

段階水準をグリフ内に表示

順序付き因子を使用する場合は、draw.grid = TRUEを指定することで、段階評価の水準をグリフ内に表示できます。

ggplot(data = michi_ord) +
  geom_pieglyph(
    aes(x = raijo, y = uriage, fill = chiiki),
    cols = kmk,
    size = 1.5,
    draw.grid = TRUE,
    alpha = 0.8
  ) +
  xlim(c(5, 75)) +
  ylim(c(0, 550)) +
  labs(
    x = "年間来場者数(万人)",
    y = "年間売上高(百万円)",
    fill = "地域区分")


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

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