Rで解析:準面積比例ベン図をプロット「nVennR2」パッケージ
複数の集合の関係を表す図としてはベン図が定番ですが、集合の数が増えると円だけでは重なりを表現しきれず、見やすい図を描くのは難しくなります。nVennR2は、領域を円に限定せず変形させることで、集合数に制限なく「準面積比例(quasi-proportional)ベン図」を作成するパッケージです。ベン図オブジェクトの作成から外観の調整、特定の領域に含まれる要素の取り出しまでを、役割ごとのコマンドで扱えるのが特徴です。
なお、準面積比例とは、各領域の面積がそこに含まれる要素の数におおよそ比例するという意味で、どの重なりに要素が多いのかを面積の大小として一目で把握できます。
パッケージバージョンは2.0.2。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("nVennR2")
# パッケージの読み込み
library("nVennR2")
# nVennDiagramやplotVennでプロット領域に描画したい場合は下記もインストールする
install.packages(c("rsvg", "grImport2"))コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
この記事で使うサンプルデータ
コード例では、パッケージ同梱のデータではなく自作のデータを使います。3つのSNSサービスA・B・Cのそれぞれの利用者名をまとめた名前付きリストを用意します。この形式(名前が集合名、中身がその集合の要素)は、nVennDiagramが受け付ける標準的なデータ形式です。
# 3つのSNSの利用者名を集合としてまとめる
# 各要素は利用者名、リストの名前が集合名(サービス名)になる
mysets <- list(
SNS_A = c("sato", "suzuki", "takahashi", "tanaka", "ito"),
SNS_B = c("suzuki", "tanaka", "watanabe", "ito"),
SNS_C = c("takahashi", "tanaka", "ito", "yamamoto"))ベン図オブジェクトを作成:nVennDiagramコマンド
リストのリストやデータフレーム、テキスト表からベン図オブジェクトを作成します。作成したオブジェクトを他のコマンドに渡すことで、描画や外観設定、領域の取得などを行います。
| オプション | 意味 | 初期値 |
|---|---|---|
| desc | セットの記述。リストのリスト・データフレーム・テキスト表・ファイルパス・作成済みnVennオブジェクトのいずれか | なし |
| plot | 生成した図を描画するかどうかを指定 | TRUE |
| outFile | 有効なパスかつ plot が true の場合に SVG コードを保存 | “” |
| systemShow | plot が true のとき既定のエディタで SVG を開くかどうかを指定 | FALSE |
| verbose | 図の生成過程でメッセージを表示するかどうかを指定 | TRUE |
| maxlevel | 0 より大きい場合、最小化ステップに網羅的アルゴリズムを用い、その値が探索の深さになる | 0L |
| byCol | 入力がテキストの場合、各セットを列(1)か行(2)で指定。0 は自動推測 | 0L |
# mysetsからベン図オブジェクトを作成する(生成過程のメッセージは非表示)
myv <- nVennDiagram(mysets, verbose = FALSE)
# 透明度とフォントサイズを指定して外観を調整する
myv <- setVennOpts(myv, opacity = 0.2, fontSize = 14)
rsvgとgrImport2を導入していない環境では、上記の実行時に「The figure cannot be rendered in the plot window.」というメッセージが表示され、プロット領域には描画されません。その場合は、下記のようにplotをFALSEにしてオブジェクトだけを作成し、plotVennのoutFileでSVGファイルとして書き出せます。
# 画面描画は省略してオブジェクトだけ作る
myv <- nVennDiagram(mysets, plot = FALSE, verbose = FALSE)
# 外観を調整する(これも描画は省略)
myv <- setVennOpts(myv, opacity = 0.2, fontSize = 14, plot = FALSE)
# 図をSVGファイルとして書き出す
plotVenn(myv, outFile = "mysets.svg")深さにおける最小化ステップの所要時間の推定:estimateExhaustiveRunTimeコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| desc | セットの記述。ファイルパス・リストのリスト・テキスト・作成済みnVennオブジェクトのいずれか | なし |
| maxlevel | 網羅的探索(exhaustive)の深さを指定 | 0L |
| byCol | 入力テキストのセットを列(1)か行(2)で指定。自動推測も可能 | 0L |
# 深さ4で網羅的手法を用いた場合の所要時間(秒)を推定する
estimateExhaustiveRunTime(mysets, 4)実行結果(推定値は環境により変わります):
[1] 0.0198732指定した領域に含まれる要素の一覧を取得:getVennRegionコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| nVennObj | nVennDiagram() で生成したオブジェクトを指定 | なし |
| n | 整数またはセット名のベクトルで領域を指定 | なし |
# 猫と犬、それぞれの飼い主名を集合にしてオブジェクトを作成する
pets <- nVennDiagram(list(Cat = c("Mei", "Rin", "Sora"),
Dog = c("Rin", "Sora", "Yuki")),
plot = FALSE, verbose = FALSE)
# 「猫と犬の両方を飼っている人」の領域を指定する
# 整数3は2進数で11、右から1・2番目の集合に属する領域を表す
getVennRegion(pets, 3)
[[1]]
[1] "Rin"
[[2]]
[1] "Sora"
透明度やフォントサイズを含むテーマリストで外観を設定:setVennSkinコマンド
複数の外観パラメータをテーマとしてまとめて指定し、図の見た目を一括で設定できます。同じテーマリストを複数のオブジェクトに適用することも可能です。
| オプション | 意味 | 初期値 |
|---|---|---|
| nVennObj | nVennDiagram() で生成したオブジェクトを指定 | なし |
| params | setVennOpts() と同じ引数に、palette と colors を加えたリスト | なし |
| plot | 操作後の図を描画するかどうかを指定 | TRUE |
# 外観をテーマリストとしてまとめる
theme <- list(opacity = 0.2, lineWidth = 2, fontSize = 14,
showRegions = FALSE, palette = 2, colors = c("red"))
# mysetsからベン図を作成する
myv <- nVennDiagram(mysets)
# テーマリストを適用して外観を設定する
myv <- setVennSkin(myv, theme)
作成済みのベン図オブジェクトを描画して表示させる処理:plotVennコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| nVennObj | 作成した nVenn オブジェクトを指定 | なし |
| outFile | SVG 図の出力先パスを指定。空の場合は出力されない | “” |
| systemShow | 既定の SVG エディタで図を開くかどうかを指定する論理値 | FALSE |
# mysetsからベン図オブジェクトを作成する
myv <- nVennDiagram(mysets, verbose = FALSE)
# 作成したオブジェクトを描画する
plotVenn(myv)指定したファイル名を持つ SVG ファイルから描画を読み込む:readVennSVGコマンド
nVenn が生成した SVG または HTML ファイルを読み込み、図として再描画します。
| オプション | 意味 | 初期値 |
|---|---|---|
| svgFile | nVenn が生成した SVG または HTML のファイル名 | なし |
| plot | 結果の図を描画するかどうかを指定する論理値 | TRUE |
| outFile | 有効なファイルパスかつ plot が true の場合に SVG コードを保存 | “” |
| systemShow | 既定のエディタで SVG ファイルを開くかどうかを指定する論理値 | FALSE |
# ファイルが存在する場合に SVG を読み込んで描画する
if (file.exists('example.svg')){
readVennSVG('example.svg')
}
<おすすめのRに関する書籍です>
領域の可視化や透明度などを設定:setVennOptsコマンド
透明度やフォントサイズなどのグラフィカルパラメータを設定し、図の視認性を調整できます。
| オプション | 意味 | 初期値 |
|---|---|---|
| nVennObj | nVennDiagram() で生成したオブジェクトを指定 | なし |
| opacity | 集合の透明度。0 で透明、1 で不透明 | 0.4 |
| fontSize | 各領域の要素数を表示するフォントサイズを指定 | 12 |
| lineWidth | 各セットの境界線の幅。最も近い整数に丸められる | 1 |
| palette | 使用する色パレットの整数インデックス(0〜3)を指定 | 0 |
| showRegions | 領域の説明を表示するかどうかを指定 | TRUE |
| showWeights | 各領域の要素数を表示するかどうかを指定 | TRUE |
| plot | 操作後の図を描画するかどうかを指定 | TRUE |
# mysetsからベン図オブジェクトを作成する
myv <- nVennDiagram(mysets)
# 領域説明を非表示にし、透明度と線幅を設定する
myv <- setVennOpts(myv, showRegions = FALSE, opacity = 0.2, lineWidth = 2)
パレット番号でベン図の色分けパターンを変更する:setVennPaletteコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| nVennObj | nVennDiagram() で作成したオブジェクトを指定 | なし |
| palette | 0 から 3 までの整数でカラーパレットを選択 | 0 |
| plot | 適用後の図を描画するかどうかを指定 | TRUE |
# mysetsからベン図オブジェクトを作成する
myv <- nVennDiagram(mysets, verbose = FALSE)
# パレット2を適用する
myv <- setVennPalette(myv, 2)
# パレット3を適用する
myv <- setVennPalette(myv, 3)コマンド実行時のプロットは省略
<おすすめのRに関する書籍です>
この記事が誰かの役に立ちますように。