這2天我們系統(tǒng)的學(xué)習(xí)一些畫(huà)venn圖的一些技巧。我們今天先測(cè)試這個(gè)最常用的包VennDiagram。
library(VennDiagram)
我們先隨機(jī)生成一組測(cè)試數(shù)據(jù):
set1 <- paste(rep("test_" , 200) , sample(c(1:10000) , 200 , replace=F) , sep="")
set2 <- paste(rep("test_" , 500) , sample(c(1:10000) , 500 , replace=F) , sep="")
set3 <- paste(rep("test_" , 300) , sample(c(1:10000) , 300 , replace=F) , sep="")
其中rep函數(shù)前面用過(guò)很多次了,就是重復(fù)第一個(gè)變量多少次;paste是字符串連接符;sample函數(shù)可以完成隨機(jī)抽樣。
sample(x, size, replace = FALSE)
具體參數(shù)說(shuō)明:
x? 整體數(shù)據(jù),以向量形式給出
size? 抽取樣本的數(shù)目
replace? 如果為F(默認(rèn)),則是不重復(fù)抽樣,此時(shí)size不能大于x的長(zhǎng)度;
如果為T,則是重復(fù)抽樣,此時(shí)size允許大于x的長(zhǎng)度
先畫(huà)最簡(jiǎn)單的venn圖:
venn.diagram(
? x = list(set1, set2, set3),
? category.names = c("Set 1" , "Set 2 " , "Set 3"),
? filename = 'test1.png',
? output=TRUE
)
這個(gè)就展示一個(gè)最簡(jiǎn)單的venn圖,并且直接保存到了輸出文件test1.png中。

如果我們想在R里面展示的話,需要通過(guò)grid.draw操作實(shí)現(xiàn)。
p1 <- venn.diagram(
? x = list(set1, set2, set3),
? category.names = c("Set 1" , "Set 2 " , "Set 3"),
? filename = NULL
)
# 展示圖片:
grid.newpage()
grid.draw(p1)
下面我們來(lái)做細(xì)化和美化,比如修改自己想要的色系。
library(RColorBrewer)
myCol <- brewer.pal(3, "Pastel2")
venn.diagram(
? x = list(set1, set2, set3),
? category.names = c("Set 1" , "Set 2 " , "Set 3"),
? filename = 'test2.png',
? output=TRUE,
? # 設(shè)置輸出:
? imagetype="png" ,
? height = 1000 ,
? width = 1000 ,
? resolution = 300,
? compression = "lzw",
? # 圓的外觀調(diào)整:
? lwd = 2, # 描邊粗細(xì)
? lty = "blank",? # 去掉描邊
? fill = myCol,? # 填充顏色
)

venn.diagram(
? x = list(set1, set2, set3),
? category.names = c("Set 1" , "Set 2 " , "Set 3"),
? filename = 'test2.png',
? output=TRUE,
? imagetype="png" ,
? height = 1000 ,
? width = 1000 ,
? resolution = 300,
? compression = "lzw",
? lwd = 2, # 描邊粗細(xì)
? lty = "blank",? # 去掉描邊
? fill = myCol,? # 填充顏色
? # 文字大?。?/p>
? cex = .5,? # 大??;
? fontface = "bold",? # 粗體
? fontfamily = "sans",? # 字體
)

venn.diagram(
? x = list(set1, set2, set3),
? category.names = c("Set 1" , "Set 2 " , "Set 3"),
? filename = 'test2.png',
? output=TRUE,
? imagetype="png" ,
? height = 1000 ,
? width = 1000 ,
? resolution = 300,
? compression = "lzw",
? lwd = 2, # 描邊粗細(xì)
? lty = "blank",? # 去掉描邊
? fill = myCol,? # 填充顏色
? # 文字大小:
? cex = .5,? # 大小;
? fontface = "bold",? # 粗體
? fontfamily = "sans",? # 字體
?# 每個(gè)集合的名稱的調(diào)整:
? cat.cex = 1.2,
? cat.fontface = "bold",
? cat.default.pos = "outer",? # 集合名稱位置:outer -- 外部;text -- 內(nèi)部
? cat.pos = c(-30,30, 180),? # 集合名稱分別在圈圈的什么角度
? cat.dist = c(0.07, 0.07, 0.055),? # 外部多少距離
? cat.fontfamily = "sans",
? rotation = 1? # 旋轉(zhuǎn)
)

下面,我們嘗試畫(huà)一下更復(fù)雜一點(diǎn)的四維和五維韋恩圖。
set4 <- paste(rep("test_" , 500) , sample(c(1:10000) , 500 , replace=F) , sep="")
set5 <- paste(rep("test_" , 300) , sample(c(1:10000) , 300 , replace=F) , sep="")
fillcolor4 <-? c("#ffd7d8", "#d8f2e7", "#d9e7f2", "#eadff0")
venn.diagram(
? x = list(set1,set2,set3,set4),
? category.names = c("Set 1" , "Set 2 " , "Set 3", "Set 4"),
? filename = "test3.png",
? # 設(shè)置輸出:
? imagetype="png" ,
? height = 1000 ,
? width = 1000 ,
? resolution = 300,
? compression = "lzw",
? # 圓圈屬性:
? col = "white",? # 描邊顏色
? lty = 1, # 虛線形式:1,2,3,4,5可選
? lwd = 1,? # 粗細(xì)
? fill =fillcolor4,? # 填充顏色;
? alpha = 0.90, # 透明度
? # 標(biāo)簽屬性,這里可以修改圈內(nèi)的文字的屬性,比如顏色等
? label.col = "black",
? ? ? ? ? ? ? #c("#ffd7d8", "black", "#d8f2e7", "black", "black", "black",
? ? ? ? ? ? ? #"black", "black", "#d9e7f2", "black",
? ? ? ? ? ? ? # "black", "black", "black", "#eadff0", "black"),
? cex = 0.9, # 字體大小
? fontfamily = "serif",
? fontface = "bold",
? # 集合名稱屬性:
? cat.col = c("#cb6274", "#7ba498", "#687d94", "#81668b"),
? cat.cex = 1.2,
? cat.fontfamily = "serif"
)

venn.diagram(
? x = list(set1,set2,set3,set4,set5),
? category.names = c("Set 1" , "Set 2 " , "Set 3", "Set 4", "Set 5"),
? filename = "test4.png",
? # 設(shè)置輸出:
? imagetype="png" ,
? height = 1200 ,
? width = 1200 ,
? resolution = 300,
? compression = "lzw",
? # 圓圈屬性:
? col = "white",? # 描邊顏色
? lty = 1, # 虛線形式:1,2,3,4,5可選
? lwd = 1,? # 粗細(xì)
? fill = fillcolor5,? # 填充顏色;
? alpha = 0.90, # 透明度
? # 標(biāo)簽屬性:
? label.col = "black",
? # c("#ffd7d8", "black", "#d8f2e7", "black", "black", "black",
? #? ? ? ? ? ? "black", "black", "#d9e7f2", "black",
? #? ? ? ? ? ? "black", "black", "black", "#eadff0", "black"),
? cex = .9, # 字體大小
? fontfamily = "serif",
? fontface = "bold",
? # 集合名稱屬性:
? cat.col = c("#cb6274", "#7ba498", "#687d94", "#81668b", "#ffcf5c"),
? cat.cex = 1.1,
? cat.fontfamily = "serif",
? cat.pos = c(0,-30,-130, 130, 40),
? cat.dist = 0.18? # 外部多少距離
)

但是超過(guò)5維的,一般顯示就比較混亂,比較推薦用upset圖來(lái)表示。