Rによるベン図の描画
R にてベン図を描く.Rにはベン図を描くライブラリーがいくつか存在するが,VennDiagram は別のライブラリ gplots よりきれいにベン図を描くことができる.最初に,VennDiagram を用いてベン図の描く.はライブラリ VennDiagram を以下のコマンドにてインストールし読み込む.既にインストールしている場合は,1行目のコマンドは不要.
VennDiagramを用いたベン図の描画
$ install.packages("VennDiagram", repos="http://cran.ism.ac.jp/") $ library(VennDiagram)
以下のような2つのファイル foo.txt および bar.txt からベン図を作成する.それぞれのファイルには , で区切られた英単語が数十個ずつ格納されている.
これらのファイルがあるディレクトリに移動し,以下のコマンドで,ファイルの内容をそれぞれ変数 foo および bar に格納する.sep は何によって値が区切られているかを指定するオプション.コンマ , で値が区切られている場合は sep="," と指定する.strip.white はスペース等の空白を削除するためのオプション.ファイルの内容の読み込みはread.table("clipboard") でも可能.このコマンドを打つとクリップボードからデータを読み込める.
$ foo=as.matrix(read.table("foo.txt",sep=",",strip.white=T)) $ bar=as.matrix(read.table("bar.txt",sep=",",strip.white=T))
このように読み込んだデータから以下のコマンドにてリストを作成し,変数 data に格納する.変数 foo および bar はそれぞれ FOO,BAR と名付ける.
$ data=list(FOO=foo,BAR=bar)
以上で作成したリスト data から以下のコマンドにてベン図を作成する.コマンド venn.diagram は作成したベン図を画像としてカレントディレクトリに吐き出す.そのときのファイル名を指定するのが filename オプションとなる.imagetype には出力ファイルのタイプを指定する.デフォルトは tiff となっている.height と width は画像の大きさを指定するオプション.fill では各データセットの領域を塗りつぶす色を指定できる.データセットを2つ用いた場合は c(数字1,数字2) で指定する.3つのデータセットからベン図を描いたときは c(数字1,数字2,数字3) とする.lty は各データセット領域の枠線を指定するオプション.基本的には fill と同様に指定するが,以下のように lty=数字 のように唯一の数字を指定した場合は全データセットで同じ枠線が使用される.scaled は各データセットの領域の面積をデータ数に応じて表示させるオプションである.scaled=F とした場合は各データセット領域の面積は等しく表示される.cex は各領域のラベル (以下の69, 17, 53) のフォントサイズを指定するオプション.2つデータセットからベン図を描くと3つの領域ができるので cex=c(2,2,2) のように3つの数字を指定する.cat.pos はカテゴリー名 (以下のFOOおよびBAR) の位置を指定する.各カテゴリー名について0から360度の範囲で指定できる.cat.dist はカテゴリー名の領域からの距離を指定するオプションである.負の値を入力するとカテゴリー名は円の内に表示される.cat.cex はカテゴリー名のフォントサイズの指定である.
$ venn.diagram(data, filename="ida_r_venn_diagram_01.svg", imagetype="svg", height=5, width=5, fill=c(4,7), lty=2, scaled=F, cex=c(2,2,2), cat.pos=c(330,30), cat.dist=c(0.05,0.05), cat.cex=c(1.2,1.2))
以下のようにベン図が描かれる.
ここで,領域の色および枠線を変え,scaled を TRUE にする以下のコマンドを打つ.
venn.diagram(data, filename="foo_bar.tiff", fill=c(5,6), lty=c(1,3), scaled=T, cex=c(2,2,2), cat.pos=c(330,30), cat.dist=c(0.05,0.05), cat.cex=c(1.2,1.2))
以下のように表示が変わる.領域の色と枠線のスタイルが変わり,データセットの大きさを反映した円の大きさになる.
オプションには以下のようなものがある.
オプション | 詳細 | 使用例 |
---|---|---|
lwd | 枠線の太さの指定 | lwd=c(1,2) |
lty | 枠線のスタイルの指定 | lty=c(2,2) |
col | 枠線の色の指定 | col=c(3,5) |
fill | 領域の色の指定 | fill=c(2,7) |
alpha | 領域の透明度の指定 | alpha=c(0.2,0.5) |
label.col | 各領域のラベル (上の69, 17, 53) の色の指定 | label.col=c(1,2,3) |
cex | 各領域のラベルフォントサイズの指定 | cex=c(1,2,3) |
fontface | 各領域のラベルのフォントデザインの指定 | fontface=c(1,2,3) |
fontfamily | 各領域のラベルのフォントの指定 | fontfamily=c(1,2,3) |
cat.dist | カテゴリー名 (上のFOOおよびBAR) の枠線からの距離の指定 | cat.dist=c(0.05,0.05) |
cat.pos | カテゴリー名の位置の指定 (0から360度) | cat.pos=c(30,330) |
cat.cex | カテゴリー名のフォントサイズの指定 | cat.cex=c(1,2) |
cat.col | カテゴリー名の表示色の指定 | cat.col=c(2,1) |
cat.fontface | カテゴリー名のフォントデザインの指定 | cat.fontface=c(3,4) |
cat.fontfamily | カテゴリー名のフォントの指定 | cat.fontfamily=c(5,6) |
margin | 作成されるベン図画像の余白の指定 | margin=0.3 |
scaled | データのサイズを領域の面積に反映する (T) かしないか (F) | scaled=F |
inverted | 2データセットからなるベン図の各領域の位置を逆にする (T) | inverted=T |
height | 作成されるベン図画像の高さの指定 | height=3000 |
width | 作成されるベン図画像の幅の指定 | width=3000 |
resolution | 作成されるベン図画像の解像度の指定 | resolution=500 |
3つ以上のデータセットに対してもベン図を描ける.以下のような,baz.txt を加えてベン図を描く.
以下のコマンドにて変数 baz に baz.txt の内容を読み込む.
$ baz=as.matrix(read.table("baz.txt",sep=",",strip.white=T))
上と同様にリストを作成する.
$ data=list(FOO=foo,BAR=bar,BAZ=baz)
最後に,以下のコマンドでベン図を描く.
$ venn.diagram(data, filename="foo_bar_baz.tiff", fill=c(2,3,4), alpha=0.4, lty=2)
結果は以下のようになる.
gplotsを用いたベン図の描画
ベン図は上とは別のライブラリ gplots でも描くことができる.以下のコマンドにて gplots をインストールし読み込む.
$ install.packages("gplots", repos="http://cran.ism.ac.jp/") $ library(gplots)
次に,上と同様に以下のコマンドにて,foo.txt,bar.txt および baz.txt をそれぞれ変数 foo,bar,baz に格納する.
$ foo=as.matrix(read.table("foo.txt",sep=",",strip.white=T)) $ bar=as.matrix(read.table("bar.txt",sep=",",strip.white=T)) $ baz=as.matrix(read.table("baz.txt",sep=",",strip.white=T))
以上の変数からリストを作成し,変数 data に格納する.各変数 foo,bar,baz はそれぞれ FOO,BAR,BAZ と名付ける.
$ data=list(FOO=foo,BAR=bar,BAZ=baz)
このように作成したリストから,以下のようにコマンドを打つことでベン図を描くことができる.
$ venn(data)
結果は以下のようになる.venn.diagram() と比べてシンプルなベン図が描かれる.結果は,BAZ のユニークな個数が上の venn.diagram() で描画したときと異なる.上では21個であったのが以下だと20個になっている.これは,baz.txt の中に重複している単語 (century) が1組あるが,venn.diagram() ではそれをふたつを数え,venn() ではひとつと数えていることによる.