ベン図

ベン図は、複数の集合の関係を視覚化した図である。2 つの集合の重なりを図示すると、A、B、A∩B、および A∪B 以外の 4 つの領域に分けることができる。3 つの集合の重なりを図示すると、8 つの領域に分けることができる。このように、集合の数が n のとき、平面上に 2n 個の領域を分ける必要がある。集合が増えると分割すべき領域が指数的に増えるため、集合が多い場合は、ベン図がかえって、見づらく、理解しづらくなることがある。集合が 4 つ以上の場合は、ベン図を利用する前に、代替できる視覚化方法も一度検討したほうがいいかもしれない。また、複数の集合の関係を視覚化するとき、ベン図の他に UpSet プロットで描いた方がわかりやすい場合もある。

ベン図を作成できる R の関数として、gplots パッケージの venn 関数、venneuler パッケージの venneuler 関数、VennDiagram パッケージの venn.diagram 関数などがある。

venn

gplots パッケージ中の venn 関数はベン図を作成できる。ベン図を作成するとき、各集合の要素を、リスト型で与える。他の関数に比べて、venn 関数で作成したベン図が見劣りするが、使い方がシンプル。

library(gplots)

prot1 <- c("3U5Z", "3PT6", "1MHT", "1SSO", "1H1J", "1RIY")
prot2 <- c("3U5Z", "3PT6", "1MHT", "1T2K")
prot3 <- c("1SSO", "1H1J", "2KI2")
data <- list(A = prot1, B = prot2, C = prot3)

venn(data)
venn関数によるベン図

venn 関数で描いたベン図を PNG フォーマットで保存すると、画像が崩れることがある。次のようにして、背景を透明にすることで、回避される。

png("venn.png", 300, 300, bg = "transparent")
venn(data)
dev.off()

venneuler

venneuler 関数でベン図を描く例。venneuler を利用するには、グループの重なり合う部分を予めに計算する必要がある。

library(venneuler)

A <- c("3U5Z", "3PT6", "1MHT", "1SSO", "1H1J", "1RIY")
B <- c("3U5Z", "3PT6", "1MHT", "1T2K")
C <- c("1SSO", "1H1J", "2KI2")

n.A <- length(A)
n.B <- length(B)
n.C <- length(C)
n.AB <- sum(!is.na(match(A, B)))
n.BC <- sum(!is.na(match(B, C)))
n.CA <- sum(!is.na(match(C, A)))
n.ABC <- n.A + n.B + n.C - (n.AB + n.BC + n.CA)

v <- venneuler(c(A = n.A, B = n.B, C = n.C, "A&B" = n.AB, "B&C" = n.BC, "C&A" = n.CA, "A&B&C" = n.ABC))
plot(v, main = "Overlaps of ABC", col = c("darkgreen", "blue", "orange"))
venneulerによるベン図描画

VennDiagram

VennDiagram パッケージにもベン図を描く関数が用意されている。

library(VennDiagram)

a <- c("3U5Z", "3PT6", "1MHT", "1SSO", "1H1J", "1RIY")
b <- c("3U5Z", "3PT6", "1MHT", "1T2K")
c <- c("1SSO", "1H1J", "2KI2")
data <- list(A = a, B = b, C = c)

venn.diagram(
  data,
  fill = c(3, 2, 7),           # background color
  alpha = c(0.5, 0.5 , 0.5),   # transparency
  lty = c(1, 2, 3),            # border line type
  filename = "venn.tiff"       # file name
)