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

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

Rで解析:UpSet図を1枚にまとめてプロット「SimpleUpset」パッケージの紹介

複数のグループが互いにどう重なっているかを調べるとき、ベン図はグループが3〜4個を超えると領域が潰れ、各組み合わせの大きさを読み取れなくなります。しかし、多数のグループの重なりを棒グラフと点の並びで表すUpSet図を、集計から作図まで一から組み立てるには手間がかかります。

「SimpleUpset」パッケージは、ggplot2とpatchworkを組み合わせてUpSet図を描画するコマンドが就労されています。所属を0/1で記録したデータフレームから、セットの大きさを示す棒、交差の大きさを示す棒、どのセットの組み合わせかを示すマトリクスをまとめて作成可能です。表示する交差の数や次数の範囲を絞り込むことや、特定の交差を強調することも可能です。また、交差ごとの分布を表す注釈パネルを図の上部へ追加することも可能です。

本パッケージの利用で、多くのグループの重なりを整理して示すことができるのではないかと考えます。SimpleUpsetの紹介です。

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

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

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

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

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

# コマンド例実行で必要なパッケージを読み込み
library("ggplot2")
スポンサーリンク

コマンド例

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

複数の集合が互いにどう重なっているかを、集合ごとの大きさを表す棒、各組み合わせ(交差)の大きさを表す棒、どの集合の組み合わせかを示す点と線のマトリクスの3つに分けて並べた図を、UpSet図(UpSet plot)と呼びます。ベン図と違い、集合の数が増えても各組み合わせの大きさをそのまま比較できます。

本パッケージでは、図に載せる集合をセット(set)、複数のセットに同時に属する組み合わせを交差(intersection)、その交差に含まれるセットの数を次数(degree)と呼びます。simpleUpSet() には、セットの所属を0/1または論理値で記録したデータフレームと、対象とする列名のベクトルを渡します。以降のコマンド例では、次の擬似データを共通して使います。

# 乱数の種を固定
set.seed(1234)

# 回答者数を設定
n <- 400

# UpSet図で扱うエリア列の名前をまとめる
areas <- c("Arashiyama", "Fushimi", "Kiyomizu", "Kinkakuji", "Amanohashidate")

# 各エリアの訪問有無を 0(未訪問)と 1(訪問)で記録する
kyoto <- data.frame(
  Arashiyama     = rbinom(n, 1, 0.55),
  Fushimi        = rbinom(n, 1, 0.60),
  Kiyomizu       = rbinom(n, 1, 0.65),
  Kinkakuji      = rbinom(n, 1, 0.45),
  Amanohashidate = rbinom(n, 1, 0.20))

# 滞在日数の列を追加し、訪問エリアが多いほど長めになるようにする
kyoto$stay <- round(rnorm(n, 2.4, 0.9) + rowSums(kyoto[areas]) * 0.3, 1)

# どのエリアも訪問していない回答者を除く
kyoto <- kyoto[rowSums(kyoto[areas]) != 0, ]

UpSet図を1枚にまとめて描画する:simpleUpSetコマンド

渡したデータフレームと列名から、セット側の棒・交差側の棒・交差マトリクスをまとめた1枚のUpSet図を作成します。戻り値はpatchworkオブジェクトなので、テーマや凡例の調整をそのまま重ねられます。n_intersectやmin_sizeで表示する交差を絞り込み、annotationsで交差ごとの分布などを示すパネルを図の上部へ追加できます。

オプション意味初期値
xセットの所属を0/1で記録した入力データフレームなし
setsUpSet図に使う x の列名を並べた文字列ベクトルNULL
sort_setsセットの並び順。size、desc(size)、NULL のほか “ascending”、”descending”、”none” を指定できるsize
sort_intersect交差の並び順をリストで指定する。使える列は size、degree、setlist(desc(size), degree, set)
n_intersect表示する交差の最大数20
min_sizeこの人数より多い交差だけを表示する0
min_degree表示する交差の次数の下限1
max_degree表示する交差の次数の上限length(sets)
set_layersセット側パネルの見た目を定めるレイヤーのリスト。default_set_layers() で生成・拡張するdefault_set_layers()
intersect_layers交差側パネルの見た目を定めるレイヤーのリスト。default_intersect_layers() で生成・拡張するdefault_intersect_layers()
grid_layers交差マトリクスの見た目を定めるレイヤーのリストdefault_grid_layers()
highlight強調する交差を定める case_when() 文。結果は highlight 列として追加されるNULL
highlight_levels因子に変換される highlight 列の水準を手動で指定するNULL
annotations各要素が ggplot2 レイヤーのリストであるリスト。要素ごとに交差プロットの上へ注釈パネルとして追加されるlist()
width交差パネルの横方向の比率0.75
height交差パネルの縦方向の比率0.75
vjust_ylaby 軸ラベルを軸へ近づける調整量0.8
stripe_colours下段2パネルの背景ストライプの色。NULL でストライプなしc(“grey90”, “white”)
keep_empty要素を1つも含まない空のセットを図に残すFALSE
guidespatchwork の plot_layout() へ渡す凡例の扱い“keep”
top_left左上のパネルに表示する ggplot オブジェクトNULL
show_setsセット側パネルを表示するかどうかTRUE
使用しないなし
na.rm欠測値の扱いTRUE
# 作図テーマを設定
theme_set(theme_bw())
# 5つのエリアを対象に、基本的なUpSet図を描画
simpleUpSet(kyoto, areas)

交差の並び順や表示数を変え、滞在日数の分布を注釈パネルとして重ねます。

# セットは訪問者数の多い順、交差は上位12個まで、5人以下の交差は除外
# 交差ごとの滞在日数の分布を上部の注釈パネルとして追加
simpleUpSet(
  kyoto, areas,
  sort_sets = "descending", n_intersect = 12, min_size = 5,
  annotations = list(
    list(
      aes(y = stay),
      geom_boxplot(aes(group = intersect), fill = "grey90"),
      scale_y_continuous(name = "滞在日数"))))

セット側パネルの見た目を決める:default_set_layersコマンド

セット側パネル(左下の横棒グラフ)の既定のレイアウトを作る補助関数です。戻り値はそのまま simpleUpSet() の set_layers 引数へ渡せるレイヤーのリストで、… にggplot2のスケールやガイドを足すと既定のレイヤーの後ろに追加されます。fillにセット名やデータの列を指定すると、棒を塗り分けられます。

オプション意味初期値
既定のレイヤーの後ろに追加するレイヤーなし
fillセットの棒を塗り分ける列。’set’ か、データ内の別の列を指定するNULL
labels棒に添える値。size で合計、prop で全交差に対する割合“size”
fセットや交差の大きさを表示するときの整形関数comma
expandexpansion() へ渡す軸の乗法的な拡張量c(0.2, 0)
hjustラベルの水平位置の調整量1.1
vjustラベルの垂直位置の調整量0.5
angleラベルの回転角0
lineheightラベルの行の高さ1.2
fontfaceラベルの字体1
label_sizeセットと交差のラベルの文字サイズ3.5
name主軸のタイトル“Set Size”
dry_runTRUE で、既定として定義された未評価のレイヤーを返すFALSE
# セット側の棒をセット名で塗り分け、凡例は表示しない
# 軸の見出しを「訪問者数」に変更する
set_layers <- default_set_layers(
  fill = "set",
  scale_fill_brewer(palette = "Set2"),
  guides(fill = guide_none()),
  name = "訪問者数")

# 作成したレイヤー定義を渡してUpSet図を描画
simpleUpSet(kyoto, areas, set_layers = set_layers)

交差側パネルの見た目を決める:default_intersect_layersコマンド

交差側パネル(右上の縦棒グラフ)の既定のレイアウトを作ります。使い方は default_set_layers() と同じで、… に足したレイヤーが既定の後ろに追加されます。棒に添える数値の見た目(label_size、hjust、vjust)や軸の見出し(name)を調整できます。

オプション意味初期値
既定のレイヤーの後ろに追加するレイヤーなし
fill交差の棒を塗り分ける列。’set’ か、データ内の別の列を指定するNULL
labels棒に添える値。size で個数、prop で全交差に対する割合“size”
fセットや交差の大きさを表示するときの整形関数comma
expandexpansion() へ渡す軸の乗法的な拡張量c(0, 0.05)
hjustラベルの水平位置の調整量0.5
vjustラベルの垂直位置の調整量-0.5
angleラベルの回転角0
fontfaceラベルの字体1
lineheightラベルの行の高さ1.2
label_sizeセットと交差のラベルの文字サイズ3.5
name主軸のタイトル“Intersection Size”
dry_runTRUE で、既定として定義された未評価のレイヤーを返すFALSE
# 交差側の棒のラベルを小さくし、軸の見出しと位置を調整する
intersect_layers <- default_intersect_layers(
  label_size = 3,
  name = "交差の人数",
  vjust = -0.7)

# 作成したレイヤー定義を渡してUpSet図を描画
simpleUpSet(kyoto, areas, intersect_layers = intersect_layers)

交差マトリクスの見た目を決める:default_grid_layersコマンド

交差マトリクス(右下の点と線分の並び)の既定のレイアウトを作ります。lightは要素を含まない交差の点の色、darkは要素を含む交差の点と線分の色です。shapeとsizeで点の形と大きさを変えられます。

オプション意味初期値
既定のレイヤーの後ろに追加するレイヤーなし
colour交差マトリクスの点や線分を強調するときに使う色NULL
fill棒を塗り分ける列NULL
light空の交差に使う既定の色“grey80”
dark要素を含む交差と線分に使う既定の色“grey23”
shape交差マトリクスの点の形19
size交差マトリクスの点の大きさ4
name主軸のタイトルNULL
dry_runTRUE で、既定として定義された未評価のレイヤーを返すFALSE
# マトリクスの点を小さめの丸にし、線分と点の色を青系へ変更する
grid_layers <- default_grid_layers(
  light = "grey85",
  dark = "steelblue4",
  shape = 16,
  size = 3.2)

# 作成したレイヤー定義を渡してUpSet図を描画
simpleUpSet(kyoto, areas, grid_layers = grid_layers)


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

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