对于集合的可视化,第一时间想到的都是韦恩图(venn diagram),一般集合不超过5个的时候,可视化效果还是不错的;但是一旦数据集增加,比如说五个的时候,你就很难从图中解读出想要的信息了。即便你把它画的很美观,还是还是很难直观找到自己需要的信息。可视化的目的不是炫技,而是快速理解数据。
The R Graph Gallery
213维恩图和集合图(Venn&Upset)
目录
- Venn图
- UpSet图
一 、Venn图
VennDiagram 包
R语言:VennDiagram绘制venn图
venn.diagram rdocumentation
1.参数介绍
#加载包
install.packages("VennDiagram")
library(VennDiagram)
#数据准备
set1 <- paste(rep("word_" , 200) , sample(c(1:1000) , 200 , replace=F) , sep="")
set2 <- paste(rep("word_" , 200) , sample(c(1:1000) , 200 , replace=F) , sep="")
set3 <- paste(rep("word_" , 200) , sample(c(1:1000) , 200 , replace=F) , sep="")
set4 <- paste(rep("word_" , 200) , sample(c(1:1000) , 200 , replace=F) , sep="")
set5 <- paste(rep("word_" , 200) , sample(c(1:1000) , 200 , replace=F) , sep="")
#颜色设置
library(RColorBrewer)
color <- brewer.pal(3, "Set3")
# Chart
venn.diagram(
x = list(set1, set2, set3),
category.names = c("Set 1" , "Set 2 " , "Set 3"),
filename = 'venn2.png',
output=TRUE,
# 输出
imagetype="png" , # 类型(tiff png svg)
#height = 1000 , # 高度
#width = 1000 , # 宽度
resolution = 400, # 分辨率
compression = "lzw", # 压缩算法
# 圈
lwd = 5, # 圈线条粗细 1 2 3 4 5
lty = 1, # 线条类型, 1 实线, 2 虚线, blank 无线条
fill = color, # 填充色
col = c("red", 'green', 'blue'), # 线条色
# 数字 number
cex = 2, # 数字大小
fontface = "bold", # 加粗
fontfamily = "sans", # 字体
# 标签 category
cat.cex = 2, # 字体大小
cat.col = c("red", 'green', 'blue'), # 字体色
cat.fontface = "bold", # 加粗
cat.default.pos = "outer", # 位置, outer 内 text 外
cat.pos = c(-27, 27, 135), # 位置,用圆的度数
cat.dist = c(0.055, 0.055, 0.085), # 位置,离圆的距离
cat.fontfamily = "sans", # 字体
rotation = 1 # 1 2 3 旋转确定大打头数据集
)
venn.png
#图片保存
library(RColorBrewer)
######################图片暂存
p = venn.diagram(
x = list(set1, set2, set3, set4, set5),
category.names = c("Set 1" , "Set 2 " , "Set 3", "Set 4", "Set 5"),
# filename = 'venn.png',
filename = NULL,
output=TRUE,
fill = brewer.pal(5, "Set2"),
col = brewer.pal(5, "Set3"),
fontface = "bold",
cat.col = brewer.pal(5, "Set3"),
cat.fontface = "bold"
)
#################保存为PDF
pdf("venn1.pdf")
grid.draw(p)
dev.off()
#################保存为png
pdf("venn2.pdf")
grid.draw(p)
dev.off()
二、 UpSet图
1、 UpSetR包 UpSetR:集合可视化神包
参数介绍
upset(data, nsets = 5, nintersects = 40, sets = NULL,
keep.order = F, set.metadata = NULL, intersections = NULL,
matrix.color = "gray23", main.bar.color = "gray23",
mainbar.y.label = "Intersection Size", mainbar.y.max = NULL,
sets.bar.color = "gray23", sets.x.label = "Set Size",
point.size = 2.2, line.size = 0.7, mb.ratio = c(0.7, 0.3),
expression = NULL, att.pos = NULL, att.color = main.bar.color,
order.by = c("freq", "degree"), decreasing = c(T, F),
show.numbers = "yes", number.angles = 0, group.by = "degree",
cutoff = NULL, queries = NULL, query.legend = "none",
shade.color = "gray88", shade.alpha = 0.25, matrix.dot.alpha = 0.5,
empty.intersections = NULL, color.pal = 1, boxplot.summary = NULL,
attribute.plots = NULL, scale.intersections = "identity",
scale.sets = "identity", text.scale = 1, set_size.angles = 0,
set_size.show = FALSE, set_size.numbers_size = NULL,
set_size.scale_max = NULL)
#########其中较为常用的参数介绍
nsets: 最多展示多少个集合数据。毕竟原来有20多种电影类型,放不完的
nintersects: 展示多少交集。
mb.ratio: 点点图和条形图的比例。
order.by: 交集如何排序。这里先根据freq,然后根据degree
decreasing: 变量如何排序。这里表示freq降序,degree升序
输入数据类型
UpsetR接受三种类型的数据输入:
- 表格形式,在R语言里就是数据框了。行表示元素,列表示数据集分配和额外信息。
- 元素名的集合(没见过,不知道。。)fromList
- venneuler包引入的用于描述集合交集的向量fromExpression。
第一种输入数据,表格型输入数据
install.packages("UpSetR")
require(ggplot2); require(plyr); require(gridExtra); require(grid);require(UpSetR)
movies <- read.csv(system.file("extdata","movies.csv",package = "UpSetR"), header = TRUE, sep=";")
upset(movies)
数据展示
可以看到这里的示例数据,行是要取交集的对象即电影名称,列是每个对象的具体信息(上映年份,动作片,恐怖片,爱情片等等),一般只有两个取值,1或0
,是与否
第二种输入数据,fromExpression对向量进行转化
input <- c(
"MAQ"=144600,
"FaSD"=16532,
"Bcftools"=283,
"GATK"=15160,
"MAQ&FaSD"=16323,
"MAQ&Bcftools"=636,
"Bcftools&GATK"=65435,
"FaSD&GATK"=33874,
"MAQ&FaSD&Bcftools"=114,
"MAQ&FaSD&GATK"=41858,
"MAQ&Bcftools&GATK"=4,
"FaSD&Bcftools&GATK"=6603,
"MAQ&FaSD&Bcftools&GATK"=8357
)
data <- fromExpression(input)
upset(data)
向量经fromExpression转换后.png
可以看到,转换后的数据行名是每个对象,比如可以是基因,列名则是每个对象的具体情况,比如基因A在算法1,算法2,算法3中是否差异,是否富集等信息。
第二种输入数据.png
进一步探究如何将年份这个变量加进这张图可以参考UpSetR:集合可视化神包
网友评论