アメリエフの技術ブログ

Amelieff Staff Blog

venn.diagram のリストと引数の関係について

まだ花粉を感じるのは私だけでしょうか。。。🌳🌳🌳 引っ越しごとに関東を南下しているので少しはマシにはなりましたが、ツライものはツライです。リモートワーク有難し。

皆様お疲れ様です、受託コンサルティングチームのkutsuyでございます。 本日は業務の中で調べた、Rを用いたベン図の描画で気になることがあったので文章に残したいと思います。

作業環境

  • Windows 11 Pro 24H2
  • R v4.3.0
  • RStudio 2023.06.0 Build 421

解析ツール

  • VennDiagram

今回は上記Rパッケージのみに関する記事です。 ベン図を描画する各ツールはRだけでもたくさんあるので好みに応じて使い分けてください。 同じような名前のパッケージがあるのでご注意ください(ややこしい…)。

ベン図の作成

それではR関数を実行していきます。 いくつかの関数が用意されていますが、リストから簡単にベン図を作成してくれるvenn.diagramを使用します。 まずはパッケージのインストールとパッケージの読み込みです。

> install.packages("VennDiagram")
> library(VennDiagram)

次に、リストを作成していきます。 今回は簡単にアルファベットを用いてベクトル⇒リストを作成しました。

> left <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W")
> right <- c("Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")
> vd <- list("left" = left, "right" = right)
> vd
$left
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
[20] "T" "U" "V" "W"

$right
 [1] "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

leftの要素数が23、rightの要素数が10、そのうち重複する要素数は7です。 このリストで2円のベン図を作成します。 オプションの説明は省略しますので、興味のある方は公式ドキュメントをご覧ください。

> venn.diagram(vd, cex = 2, cat.cex = 2, filename = "venn_1.png", fill = c("#5975A4", "#B55D60"), margin = 0.1, cat.dist = c(0.2,0.2), scaled = FALSE, disable.logging = TRUE)

venn_1.png

はい、いい感じですね。 それでは左右の要素数の大小を逆にするとどうなるでしょうか。

> left <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
> right <- c("D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")

> vd <- list("left" = left, "right" = right)

> venn.diagram(vd, cex = 2, cat.cex = 2, filename = "venn_2.png", fill = c("#5975A4", "#B55D60"), margin = 0.1, cat.dist = c(0.2,0.2), scaled = FALSE, disable.logging = TRUE)

venn_2.png

はい、いい感じですね。

………ではないですね。 期待した図は左の円の要素数が10で青色なのですが逆になってしまいます。 これはなぜかといいますと、「2円のvenn.diagramの場合、要素数の大きい方が左に配置されるから」です。 これは非常にまぎらわしい設定になっていて、元データとよく見比べないと間違う危険があります。 (というかすでに私はこの罠にはまったわけでありますが) では、この図を期待する図に修正するにはどうすればよいでしょうか。という話になります。

まずは、invertedオプションを試します。 inverted ⇒ Flip the two-set Venn diagram along its vertical、らしいです。 引数にはTRUEの論理値を与えてあげます。

> venn.diagram(vd, cex = 2, cat.cex = 2, filename = "venn_3.png", fill = c("#5975A4", "#B55D60"), margin = 0.1, cat.dist = c(0.2,0.2), scaled = FALSE, disable.logging = TRUE, inverted = TRUE)

venn_3.png

はい、いい感じですね。

………ではないですね。 venn_1.pngと同じ図が出力されました。なるほどね。

検索したところ、rotation.degreeオプションが使えそうなので試します。 rotation.degree ⇒ Number of degrees to rotate the entire diagram、らしいです。 引数には180の数値を与えてあげます(図を180°回転させたいので)。

> venn.diagram(vd, cex = 2, cat.cex = 2, filename = "venn_4.png", fill = c("#5975A4", "#B55D60"), margin = 0.1, cat.dist = c(0.2,0.2), scaled = FALSE, disable.logging = TRUE, rotation.degree = 180)

venn_4.png

はい、ようやくいい感じですね。ただこれはツール側で自動でやってほしいですね。 ちなみにこの現象は3円以上のベン図では発生しないようです。

ベン図を作成するパッケージはたくさんあるので、それぞれに特性があるように思います。 まず基本として、出力された図が元データと整合性があるのか、よく見ることが重要です。 あと、期待する図が得られない場合、早く見切りをつけて次のツールに乗り換えることもタイパ的には必要かもしれませんね。 皆様のおすすめのツール(Rに限らず)があればぜひ教えてください。

DRY解析に関することでお困りごとがあれば、ぜひアメリエフにお声がけくださいませ。