muzi0202的个人博客分享 http://blog.sciencenet.cn/u/muzi0202

博文

UpSet——可视化的集合图

已有 10021 次阅读 2020-9-4 08:55 |系统分类:科研笔记

分析背景

    集合的可视化,首先想到的肯定是venn图绘制方法。此绘制方法基于R语言,并根据项目经验,将常规的代码语句进行封装。然后将整理好的数据传入到函数中,即可得到高质量的Venn图。但是,当集合数较多如出现7个以上的时候,再使用Venn图就会显得多而散。
    针对上面这种情况,我们使用一个用于多个集合数据的可视化小程序——集合图,并且将其封装成函数,同样只需将自己的数据传入到函数中,即可作出整体系统的集合图。


分析方法

# 安装R包
if (!requireNamespace("UpSetR", quietly = TRUE))
  install.packages("UpSetR",repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
if (!requireNamespace("RColorBrewer", quietly = TRUE))
  install.packages("RColorBrewer",repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
if (!requireNamespace("data.table", quietly = TRUE))
  install.packages("data.table",repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
 
# 自定义函数
## 快速读入数据
readFlie=function(input,type,row=T,header=T){
  # input 为读入文件的路径,type为读入文件的类型,格式为‘.txt’或‘.csv’,row=T,将文件的第一列设置为列名
  library(data.table,quietly = TRUE)
  if(type=='txt'){
    dat = fread(input,header = header,sep='\t',stringsAsFactors = F,check.names = F)
    if(row){
      dat = as.data.frame(dat,stringsAsFactors = F)
      rownames(dat) = dat[,1]
      dat = dat[,-1]
    }else{
      dat = as.data.frame(dat,stringsAsFactors = F)
    }
  }else{
    dat = fread(input,header = header,sep=',',stringsAsFactors = F,check.names = F)
    if(row){
      dat = as.data.frame(dat,stringsAsFactors = F)
      rownames(dat) = dat[,1]
      dat = dat[,-1]
    }else{
      dat = as.data.frame(dat,stringsAsFactors = F)
    }
  }
  return(dat)
}
## 绘制集合图
wn_upset=function(list,bar_cor='lightblue2',point_cor = 'blue',keep.order=F,order.by=c("freq","degree")[1]){
    # list 传入数据为一个list
    # bar_cor 上方条形图的填充颜色
    # point_cor 共有集合点阵图的颜色
    # keep.order 根据list中的向量顺序展示样本,默认为FALSE,此时按照样本中物种数量由多至少顺序展示
    # order.by是否按照频数和度进行排序,默认矩阵先按度,然后按频率排序
    # 定义颜色体系
    require(RColorBrewer,quietly = T,warn.conflicts =F)
    corlor = c(brewer.pal(12,'Set3'),brewer.pal(12,'Paired'),brewer.pal(11,'Spectral'))
    require(UpSetR,quietly = T,warn.conflicts =F)
    g=upset(fromList(list), nsets = length(list),sets=names(list),keep.order=keep.order,
            number.angles = 30, point.size = 2.5, line.size = 0.20,mb.ratio = c(0.55, 0.45),
            text.scale = c(1.5,1, 1.5, 1, 1,1),
            # 上方条形图的填充颜色
            main.bar.color=bar_cor,mainbar.y.label = "Intersection Size",
            # 下方条形图的填充颜色
            sets.bar.color=corlor[1:length(list)],
            matrix.color=point_cor,
            sets.x.label = "Set Size",
            order.by = order.by,shade.color = brewer.pal(9,'BuPu')[2], shade.alpha = 0.70, matrix.dot.alpha = 0.85)
  return(g)
  
}

df = readFlie('./upset.txt',type = 'txt',row = F)
# 抽取数据,制造测试数据
set.seed(1234)
df_list = list('Symbol1'=sample(df$symbol,180),'Symbol2'=sample(df$symbol,200),
               'Symbol3'=sample(df$symbol,220),'Symbol4'=sample(df$symbol,240),
               'Symbol5'=sample(df$symbol,260),'Symbol6'=sample(df$symbol,280),
               'Symbol7'=sample(df$symbol,300),'Symbol8'=sample(df$symbol,310),
               'Symbol9'=sample(df$symbol,150))
# 绘制集合图
# 4维集合图
wn_upset(df_list[1:4])
# 6维集合图
wn_upset(df_list[1:6])
# 9维集合图
wn_upset(df_list)

# 保存图片
pdf('./up_set.pdf',height = 9,width = 16)
# 8维集合图
wn_upset(df_list[1:8]) 
dev.off()

image.png



https://blog.sciencenet.cn/blog-3445347-1249208.html

上一篇:AI科研绘图--常见问题汇总
下一篇:Fastaq——fasta文件转化为fastq文件
收藏 IP: 183.195.182.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-13 15:02

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部