ずっと「かっこいいな〜!」と思っていた「ベン図」をRで描く機会がやってきたのでそのことを。
ベン図とはこんな感じの図、グループとグループとの間に共通しているものがどのくらいあるのかが分かりやすく表現できるもの。
今回は必要最低限の基本メモになりますが、とても便利そうなので使えるようになるといいと思います!!
なぜベン図が必要なのか
今回私は、あるプロジェクトで使っている6つのデータにどのくらいの人たちがどのデータに入っているのか、同じ人が別のデータにも入っているのかなどを知りたかったので、次のような表をまず作りました。
study1 study2 study3 study4 study5 study6
study1 1000 0 0 0 9 0
study2 0 23000 0 171 4 0
study3 0 0 2521 0 0 0
study4 0 171 0 1365 0 0
study5 9 4 0 0 1871 3
study6 0 0 0 0 3 21392
この表から、例えば
- study1に参加した人の中でstudy5にも参加した人が9人いる
- study2に参加した人の中でstudy4にも参加した人が171人、study5にも参加した人が4人いる
ということがわかります。でも分かりづらい。
そこでベン図をもう一度見ると、そういった情報がもっと感覚的に分かるようになっています。(後述しますが、今回はstudy3〜5は諸事情で統合したベン図になっているので、上記の例2はstudy2に参加した人の中でstudy3,4,5のどれかに参加した人が175人いる、というようなベン図になっています。)
Rで使うライブラリ
Rでベン図を描く場合、いろんな方法があるみたいなのですが、大概はVennDiagram
というライブラリで事足りそうな気がします。今回このページに載せているベン図もこのライブラリで作成しました。
公式のマニュアル(英語)はこちらから参照できます:https://cran.r-project.org/web/packages/VennDiagram/VennDiagram.pdf
いろいろ描いてあるけど、最初の取り掛かりとしては下記の方法で良さそう。慣れてきて他にも追加したいことがあったりカスタマイズしたいことがでてきたらこのマニュアルやらネット情報やらで順次グレードアップしていこうと思います。
VennDiagram
のインストール
VennDiagram
がまだRにインストールされていない場合は下記のコマンドでインストール。既にこのライブラリを持っている場合はこのステップは飛ばします。
install.packages("VennDiagram")
VennDiagram
を使う準備
下記のコマンドでVennDiagram
を使える状態にします。
library(VennDiagram)
ベン図を描くコード
上記のコードでライブラリを読み込んだ後、こちらのコードで基本的なベン図が描けます。
venn.diagram(data, filename="venn.png", imagetype="png",
category.names = c("study1", "study2", "study3"),
fill=c(2,3,4))
data
は数字や文字列のリストの形式のもの(後述)filename
を指定する(保存したいファイル名)imagetype
は任意、デフォルトはtiff
。.pngにしたい場合はpng
を指定。category.names
は必須、data
のそれぞれのグループの名前を入れる(例えばstudy1、study2、study3など)fill
で色の指定。このfill
の部分を飛ばすとモノクロのベン図になる(後述)。
ここで使うdata
は、数字や文字列のリストの形式になっている必要があります。形式が合っていれば、"data" という名前じゃなくても何でもOK。
例えば、下記の「data
」がそれにあたります。
# a,b,cに数字を入れる
a <- c(1:10)
b <- c(1:20)
c <- c(10:30)
a
# [1] 1 2 3 4 5 6 7 8 9 10
b
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
c
# [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
data <- list(a, b, c)
data
# [[1]]
# [1] 1 2 3 4 5 6 7 8 9 10
#
# [[2]]
# [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#
# [[3]]
# [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
今回は数字を羅列したけど、文字列のリストでもOK。
このdata
さえあれば、ベン図が描ける。
venn.diagram(data, filename="venn.png", imagetype="png",
category.names = c("a: 1-10", "b: 1-20", "c: 10-30"), fill=c(2,3,4))
色の指定
# fill=c(2,3,4) を除いたバージョン
venn.diagram(data, filename="venn_monotone.png", imagetype="png",
category.names = c("a: 1-10", "b: 1-20", "c: 10-30"))
fill
の部分が無いこちらのスクリプトだとモノクロのベン図に。
ちょっと味気ないし、分かりづらい印象。
venn.diagram(data, filename="venn.png", imagetype="png",
category.names = c("a: 1-10", "b: 1-20", "c: 10-30"),
fill=c("pink","yellow","skyblue"))
fill=c(1,2,3,4,5)
のように色の指定を入れてあげると色がつく。このVennDiagramが(今の私の理解では)5つのグループまでしか作図できないようで、色も5色までの指定。数字での指定でも大丈夫だし上記のように色の名前でも指定できる。
私は最初category.names
やfilename
を指定しなかったのでエラーの連発。これらは必須の部分なのね。後はグループが6つあったから
# Error: Incorrect number of elements.
# In addition: Warning message:
# In (function (fmt, ...) :
# one argument not used by format 'Incorrect number of elements.'
みたいなエラーももらいました。
調べてみるとグループは5つまでしか指定できなさそうな。そこでグループを4つにすると、無事に最初に示したようなベン図を描くことができました。
まだまだカスタマイズの余地がたっぷりあるので、少しずつ取り入れていきたいところ。さらにggplot
でベン図を描いている人もいるし、グループが6つ以上のすごい形をしたベン図も見たことがあるので(パワポとかでの手描きなのかな?)、いつか描いてみたい。