【R语言】韦恩图合集
在 R 语言中绘制韦恩图通常有两种方法,小于 5 个集合的用 R 包 VennDiagram
即可完成绘制;超过 5 个的使用 R 包 UpSetR
进行绘制。
rm(list = ls())
data.test = data.frame(A = rep(c('a','b','c'),c(10,23,17)),
B = rep(c('b','c','e'),c(15,25,10)),
C = rep(c('a','c','e'),c(18,12,20)),
D = rep(c('a','c','d'),c(18,12,20)))
library(VennDiagram)
# 计算重叠
venn.diagram(x = list(A = data.test$A,
D = data.test$D,
B = data.test$B,
C = data.test$C),
height = 3000, # 高度
width = 3000, # 宽度
resolution = 500, # 分辨率
main = 'test', # 标题
main.cex = 4, # 标题字体大小
main.col = 'red', # 标题颜色
fill = c('red','blue','green','orange'), # 填充色
col = 'black',# 边框颜色
lwd = 2, # 线宽度
alpha = .5, # 透明度
cat.cex = 2, # 标签字体大小
filename = 'figures/venn.test.tiff'# 文件名
)
当集合很多的时候怎么办?下面这个图是 2012 年 Nature 上的图
,看起来真的是好复杂啊!这时候就该 UpSet
上场了。
UpSetR
有对应的网站:http://caleydo.org/tools/upset/。还有 Shiny APP:https://gehlenborglab.shinyapps.io/upsetr/。R 包的使用可以参考对应的 GitHub:https://github.com/hms-dbmi/UpSetR。也有开发者使用 Python 开发了对应的 Python 应用:https://github.com/ImSoErgodic/py-upset。
其中,Shiny APP 的示例视频是 YouTube 上的,我把它下载上传到腾讯视频了,点击观看即可。
library(UpSetR)
# 直接读取R包示例数据
movies <- read.csv( system.file("extdata", "movies.csv",
package = "UpSetR"), header=T, sep=";" )
mutations <- read.csv( system.file("extdata", "mutations.csv",
package = "UpSetR"), header=T, sep = ",")
upset(mutations,
sets = c("PTEN", "TP53", "EGFR", "PIK3R1", "RB1"),
sets.bar.color = "#56B4E9",
order.by = "freq")
下面这段代码可以展示更多内容:
upset(movies, # 绘图数据集
sets.bar.color = "red", # 侧边柱子颜色
matrix.color = 'blue', # 相互关系连线(点)的颜色
main.bar.color = 'black', # 交互数量柱状图颜色及附图颜色
mainbar.y.label = 'Intersection Size', # 主柱状图Y轴标题
sets.x.label = '这是X轴标题', # 左侧柱状图X轴标题
point.size = 1.8, # 交互点的大小
line.size = 1.2, # 交互线的宽度
att.pos = 'bottom',
att.color = 'yellowgreen', # 变量展示图颜色
number.angles = 0, # 柱状图上数字旋转角度
group.by = 'degree', # 数据分组标准可以降序(degree)也可以按数据集(sets)
# 下面的代码主要是展示感兴趣的变量之间的关系
attribute.plots=list(gridrows=60,
plots=list(list(plot=scatter_plot,
x="ReleaseDate",
y="AvgRating"),
list(plot=scatter_plot,
x="ReleaseDate",
y="Watches"),
list(plot=scatter_plot,
x="Watches",
y="AvgRating"),
list(plot=histogram,
x="ReleaseDate")),
ncols = 2))
我觉得最酷炫的地方在于可以自定义下方附图函数,展示想要的任何图像:
# 构建绘图函数
plot.test = function(mydata,x,y){
library(ggplot2)
my.plot = (ggplot(data = mydata, aes(x = as.character(mydata[,x]),
y = mydata[,y],
fill = as.character(mydata[,x])))+
geom_boxplot()+
theme_classic()+
labs(x = x, y = y)+
theme(legend.position = 'none'))
}
# 使用绘图函数
upset(movies,
sets = c("Action", "Adventure", "Children", "War", "Noir"),
attribute.plots=list(gridrows = 100,
ncols = 1,
plots = list(list(plot=plot.test, # 使用函数
x="ReleaseDate",
y="Watches",
queries=T))))
[1] D’hont, Angélique, et al. "The banana (Musa acuminata) genome and the evolution of monocotyledonous plants." Nature 488.7410 (2012): 213-217.