【R】Rでベン図を描く(基礎編)

ずっと「かっこいいな〜!」と思っていた「ベン図」をRで描く機会がやってきたのでそのことを。

ベン図とはこんな感じの図、グループとグループとの間に共通しているものがどのくらいあるのかが分かりやすく表現できるもの。

venndiagram

今回は必要最低限の基本メモになりますが、とても便利そうなので使えるようになるといいと思います!!

なぜベン図が必要なのか

今回私は、あるプロジェクトで使っている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

この表から、例えば

  1. study1に参加した人の中でstudy5にも参加した人が9人いる
  2. 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))
venn1

色の指定

# 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.namesfilename指定しなかったのでエラーの連発これらは必須の部分なのね。後はグループが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つ以上のすごい形をしたベン図も見たことがあるので(パワポとかでの手描きなのかな?)、いつか描いてみたい。

\ Share /

Leave a Comment