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で記録した入力データフレーム | なし |
| sets | UpSet図に使う x の列名を並べた文字列ベクトル | NULL |
| sort_sets | セットの並び順。size、desc(size)、NULL のほか “ascending”、”descending”、”none” を指定できる | size |
| sort_intersect | 交差の並び順をリストで指定する。使える列は size、degree、set | list(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_ylab | y 軸ラベルを軸へ近づける調整量 | 0.8 |
| stripe_colours | 下段2パネルの背景ストライプの色。NULL でストライプなし | c(“grey90”, “white”) |
| keep_empty | 要素を1つも含まない空のセットを図に残す | FALSE |
| guides | patchwork の 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 |
| expand | expansion() へ渡す軸の乗法的な拡張量 | 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_run | TRUE で、既定として定義された未評価のレイヤーを返す | 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 |
| expand | expansion() へ渡す軸の乗法的な拡張量 | 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_run | TRUE で、既定として定義された未評価のレイヤーを返す | 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_run | TRUE で、既定として定義された未評価のレイヤーを返す | FALSE |
# マトリクスの点を小さめの丸にし、線分と点の色を青系へ変更する
grid_layers <- default_grid_layers(
light = "grey85",
dark = "steelblue4",
shape = 16,
size = 3.2)
# 作成したレイヤー定義を渡してUpSet図を描画
simpleUpSet(kyoto, areas, grid_layers = grid_layers)
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。