orthofinder分析泛基因组及可视化

数据准备

GeneCount文件包含了所有同源基因组数目不为1的所有基因组,在各个样本中的数目;UnassignedGenes文件则包含了仅包含一个基因的同源基因组的样本来源信息。首先,我们要先将两个数据合并,结果文件是一个包含所有基因组的表格。

library(tidyverse)
df <- read.csv('Orthogroups.GeneCount.tsv', sep='\t',row.names = 1)
df 

df_uniq <- read.csv('Orthogroups_UnassignedGenes.tsv',sep = '\t', row.names = 1)
df <- df[,1:(ncol(df)-1)]
df_uniq[df_uniq != ''] <- 1
df_uniq[df_uniq == ''] <- 0
df <- rbind(df, df_uniq)

核心基因和特有基因统计

核心基因的筛选思路为:使用apply函数按行分析,若一行中所有值都不为0,即表示该基因组在全部样本中出现,对应的行名为核心基因。
特有基因的筛选思路为:使用apply函数按行分析,若一行中仅有1个值不为0,则为特有基因,并提取不为0列的列名为拥有该基因的个体。
附属基因:除核心基因、特有基因外者,为附属基因。

df_summary <- data.frame(gene=rownames(df))
df_summary$type <- apply(df, 1, function(x) if (length(x[x!=0]) == 1) colnames(df)[which(x != 0)] else NA)
df_summary$type[apply(df, 1, function(x) all(x != 0))] <- 'core'
df_summary[is.na(df_summary)] <- 'accessory'

st_u <- data.frame(t(table(df_summary$type))) %>% rename(strain=Var2) %>%select(strain, Freq) %>%
  merge(., data.frame(strain = colnames(df)), all.y=T)
st_u[is.na(st_u)] <- 0

整理好的数据结构,df_summary包含每个基因组类型,若为特有基因,则标记所属样本。st_u进一步统计了每个样本包含的特有基因数目。

饼图展示核心基因、附属基因、特有基因各自的数目和比例。我们使用ggpubr来绘制。

library(ggpubr) 
pdata1 <- data.frame(group = factor(c('core','unique','accessory'), levels = c('core','unique','accessory')), 
                     freq = c(nrow(df_summary %>% filter(type=='core')),sum(st_u$Freq), nrow(df_summary %>% filter(type=='accessory'))))
piedata1 <- pdata1%>% 
  mutate(labs=paste0(freq,'\n(',100*round(freq/sum(freq),4),'%)')) 
ggpie(piedata1, 'freq', #绘图,只用写频数就行,切记不用再写分组 
      fill = 'group', palette = 'jco',#颜色板为jco. 
      label = 'labs', lab.pos = 'in', lab.font = c(4, 'white'))+ #设置标签,标签的位置在图的内部,标签的大小为4, 颜色为白色. 
  theme(legend.position = "top")+ labs(fill="")
ggsave('result/pie.png')

花瓣图包含了对核心基因和每个样本的特有基因的数目统计。我们基于plotrix包来完成。首先先导入r包和绘图功能参数,并指定颜色。
需要注意的是,指定的颜色是8位字符的哦,比起6位字符颜色,最后两位表示其透明度。

ellipse_col <- c('#6181BD4E','#F348004E','#64A10E4E','#9300264E','#464E044E','#049a0b4E','#daa5204E','#1e90ff4e','#ba55d34E')# 椭圆的颜色设置
flower_plot <- function(sample, otu_num, core_otu, start, a, b, r, ellipse_col, circle_col) {
  par( bty = 'n', ann = F, xaxt = 'n', yaxt = 'n', mar = c(1,1,1,1))#start为椭圆的起始位置, a为椭圆的短轴, b为椭圆的长轴, r为中心圆的半径
  plot(c(0,10),c(0,10),type='n')
  n   <- length(sample)
  deg <- 360 / n
  res <- lapply(1:n, function(t){
    draw.ellipse(x = 5 + cos((start + deg * (t - 1)) * pi / 180), #绘制椭圆
                 y = 5 + sin((start + deg * (t - 1)) * pi / 180), 
                 col = ellipse_col[t],
                 border = ellipse_col[t],
                 a = a, b = b, angle = deg * (t - 1))
    text(x = 5 + 2.5 * cos((start + deg * (t - 1)) * pi / 180),#在图上设置每个样品的otu_num数目
         y = 5 + 2.5 * sin((start + deg * (t - 1)) * pi / 180),
         otu_num[t])
    
    if (deg * (t - 1) < 180 && deg * (t - 1) > 0 ) {
      text(x = 5 + 3.3 * cos((start + deg * (t - 1)) * pi / 180),#设置每个样品名
           y = 5 + 3.3 * sin((start + deg * (t - 1)) * pi / 180),
           sample[t],
           srt = deg * (t - 1) - start,
           adj = 1,
           cex = 1
      )
    } else {
      text(x = 5 + 3.3 * cos((start + deg * (t - 1)) * pi / 180),
           y = 5 + 3.3 * sin((start + deg * (t - 1)) * pi / 180),
           sample[t],
           srt = deg * (t - 1) + start,
           adj = 0,
           cex = 1
      )
    }
  })
  draw.circle(x = 5, y = 5, r = r, col = circle_col, border = NA)#绘制中心圆
  text(x = 5, y = 5, paste('Core:', core_otu))#设置中心圆名字
}  


png('flower.png', w=500, h=500)
flower_plot(sample = st_u$strain, otu_num = st_u$Freq, core_otu =nrow(df_summary %>% filter(type=='core')),
            start = 90, a = 0.7, b = 2, r = 0.8, ellipse_col = ellipse_col, circle_col = 'white')
dev.off()

当样本数少于5时,可以选择韦恩图表示,大于等于5时,建议使用upset图

library(UpSetR)
upsetdf <- as.data.frame(lapply(df, as.numeric))
upsetdf [upsetdf != 0] <- 1
upset(upsetdf, nset = 9,
      order.by = 'freq')

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容