Engage to Life Energy
?
问题如下
上图(摘选自https://www.nature.com/articles/nature13385)意义明了,内容显而易见。但有一个问题,比如某个样本的TP53基因如果既发生了Missense突变又发生了Nonsense突变,那么该单元格里应当包含两个信息了,图形里怎么表示呢?这种情况并不罕见。
第一种方法
第二种方法
第三种方法
上述图片都是静态的(statitc)图片,完全可以利用动态的(interactive)的图片来表示更为丰富的内容。比如鼠标hover到某个单元格,弹出详细信息等。Javascript最适合来做这种工作,比如大家熟悉的D3.js,R里可以利用htmlwidgetsl类的包(比如plotly)来实现,当然这是另一个话题了,在此不再赘述。
问题的提出
肿瘤研究的相关文章中经常出现oncoplot,这种表现形式几乎成为肿瘤研究文章中的必备元素,见诸于上至TCGA(The Cancer Genome Atlas Programm)发表于Nautre、Science、Cell的综合性研究 (Comprehensive profiling)文章,下至零零散散的研究者发表的oncology领域的文章等等。
为了说明问题,我们从COSMIC(https://cancer.sanger.ac.uk/cosmic) 下载CosmicMutantExportCensus.tsv表格,这是一个综合性的数据,包含了若干万样本的oncogene的变异情况, 我们对数据做了个筛选,保留一个很小的数据集,筛选后的数据可以从github得到(见代码部分),最终保留内容如下(仅显示头部几行):
第一种方法的改进
library(data.table)
library(RColorBrewer)
library(grid)
library(gridExtra)
library(ggplot2)
library(gtable)
load('todo.RData')
###prepare the data (color, coorinate etc) using data.table manipulation;
todo[,.N,sample][order(-N)][,sample]->sams
todo[,.N,gene][order(-N)][,gene]->genes
melt(dcast(todo,gene~sample,value.var='mutation'),id.var='gene')->todo
names(todo)<-c('gene','sample','mutation')
todo[is.na(todo)]<-'None'
todo[,mut:=mutation]
todo[grep("///",mut),mut:='multipe hit']
mut.Cate<-c("Substitution - Missense","Substitution - Nonsense",
"Insertion - In frame","Insertion - Frameshift",
"Deletion - In frame","Deletion - Frameshift",
"Nonstop extension","Whole gene deletion")
setNames(brewer.pal(n=10,'Paired')[0-5:6],mut.Cate)->mut.Cate
c(mut.Cate,'None'='gray','multipe hit'='red')->mut.Cate
todo[,mut:=ordered(mut,levels=names(mut.Cate))]
inter.x<-setNames(ppoints(length(sams),1/2),sams)
inter.y<-setNames(rev(ppoints(length(genes),1/2)),genes)
todo[,x:=inter.x[as.character(sample)]]
todo[,y:=inter.y[gene]]
todo[,w:=1/length(sams)]
todo[,h:=1/length(genes)]
################################the ggplot graph
tu<-ggplot(todo,aes(x=x,y=y,height=h,width=w,fill=mut)) +
geom_tile(colour='white',show.legend=F)+
scale_x_continuous(expand=expansion(),breaks=inter.x,labels=names(inter.x))+
scale_y_continuous(expand=expansion(),breaks=inter.y,labels=names(inter.y),position = "right")+
scale_fill_manual(values=mut.Cate) +
theme_minimal() %+replace% theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.5),legend.position='top') +
labs(x='',y='')
gai<-ggplotGrob(tu)
#######################################ok1
zz<-todo[mut=='multipe hit']
apply(zz[,.(x,y,w,h)],1,function(xxx)
{
segmentsGrob(x0=c(0,0),x1=c(1,1),y0=c(0,1),y1=c(1,0),gp=gpar(col='#2B1B17'),vp=viewport(xxx[1],xxx[2],xxx[3],xxx[4]))
})->rs
append(rs,list(rectGrob(zz$x,zz$y,zz$w,zz$h,gp=gpar(col='#2B1B17'))))->rs
addOn<-gTree(children=Reduce(gList,rs))
gtable_add_grob(gai,addOn,t=7,l=5)->ok1
##################################ok2
apply(zz[,.(x,y,w,h,mutation)],1,function(xxx)
{
strsplit(xxx[5]," /// ")[[1]]->jus
grid.rect(x=ppoints(length(jus),0.5),width=1/length(jus),vp=viewport(xxx[1],xxx[2],xxx[3],xxx[4]),gp=gpar(fill=mut.Cate[jus],col='#2B1B17'))
})->rs
addOn<-gTree(children=Reduce(gList,rs))
gtable_add_grob(gai,addOn,t=7,l=5)->ok2
###################################combination
grid.arrange(gai,ok1,ok2)
地址:上海市松江区中心路1158号5幢5楼
电话:400-9200-612 传真:+86 21 6090 1207/1208-8154
dafabet手机黄金版技术(上海)有限公司 Copyright 2012 Genergy Inc. 沪ICP备10017363号
微信:genenergy