下面這個(gè)圖是我在單細(xì)胞相關(guān)文章中見(jiàn)過(guò)的恃泪,也算是火山圖的變種泪漂【铮可以看出X軸是不同的細(xì)胞類型,Y軸是marker基因的fold change(log2),但是不同類別之間他們是不連續(xù)的褒翰,其實(shí)可以用我們前面講過(guò)的抖動(dòng)散點(diǎn)圖的效果。今天我們就來(lái)嘗試是否能畫出這個(gè)效果匀泊。
還是用我們最常用的pbmc的單細(xì)胞數(shù)據(jù)优训。
pbmc.markers <- read.table("markers.txt",sep="\t",header=T)
pbmc.markers <- pbmc.markers %>%mutate(type = ifelse(avg_log2FC >=0,"Up","Down"))%>%mutate(type2 = ifelse(p_val_adj < 0.01,"adjust Pvalue < 0.01","adjust Pvalue >= 0.01"))
然后獲得每個(gè)細(xì)胞類型(cluster)的marker基因。
從結(jié)果也很容易理解各聘,第一列:pval揣非。第二列是兩組間平均log2 FC,正值表示在第一組較高躲因。pct.1和pct.2則分別為基因在對(duì)應(yīng)細(xì)胞類型中的表達(dá)比例早敬。cluster代表是在那個(gè)細(xì)胞類型中。最后一列是基因的名字大脉。type和type2是我們自己添加了一列用于標(biāo)記是上調(diào)還是下調(diào)以及P值搞监。
先畫一個(gè)基本的散點(diǎn)圖,這里我們用的是前面的技巧镰矿,抖動(dòng)散點(diǎn)圖琐驴。
ggplot(pbmc.markers, aes(cluster, avg_log2FC)) +
geom_jitter(aes(color = type))
下面我們嘗試在每個(gè)cluster周圍添加一個(gè)柱狀的框。ggplot里面兩個(gè)命令可以添加柱狀圖秤标。geom_bar和geom_col绝淡。前面講過(guò)geom_bar的用法。
簡(jiǎn)單來(lái)說(shuō)苍姜,col够委,column也。列也怖现,豎直也茁帽。bar:條玉罐、帶也。
在新版本的ggplot中:
geom_col針對(duì)最常見(jiàn)的柱狀圖 潘拨,即既給ggplot映射x值(x值一般是因子型的變量吊输,才能成為柱,而沒(méi)有成為曲線)铁追,也映射y值季蚂。
如: ggplot2(data, aes(x = x, y = y)) +geom_col()
geom_bar針對(duì)計(jì)數(shù)的柱狀圖,即count, 是只給ggplot映射x值(x也一般是因子)琅束。自動(dòng)計(jì)算x的每個(gè)因子所擁有的數(shù)據(jù)點(diǎn)的個(gè)數(shù)扭屁,將這個(gè)個(gè)數(shù)給與y軸。
如:? gplot2(data, aes(x = x)) +? geom_bar()
總結(jié):區(qū)別在于給ggplot是否映射y值涩禀。
這里明顯我們不自動(dòng)計(jì)算Y值料滥,需要自己給Y值,所以我們采用geom_col艾船。
所以首先葵腹,我們需要計(jì)算Y值,其實(shí)就是每個(gè)cluster里面FC的最大值和最小值屿岂。為了不壓著極值點(diǎn)践宴,我們可以稍微多一點(diǎn)點(diǎn)。
所以我們先計(jì)算每個(gè)cluster的Y軸極坐標(biāo)爷怀,然后再來(lái)添加geom_col阻肩。
cell <-unique(pbmc.markers$cluster)
back.data<- data.frame()
for(n in 1:length(cell))
{
? tmp <- pbmc.markers %>%filter(cluster==cell[n])
?new.tmp <- data.frame(cluster = cell[n],min = min(tmp$avg_log2FC) - 0.2,max = max(tmp$avg_log2FC) + 0.2)
? back.data <- rbind(back.data,new.tmp)
}
ggplot(pbmc.markers, aes(cluster, avg_log2FC)) +
geom_jitter(aes(color = type)) +
geom_col(data = back.data,aes(x = cluster,y = min),fill="grey93",color="black",alpha=0.5) +
geom_col(data = back.data,aes(x = cluster,y = max),fill="grey93",color="black",alpha=0.5)
這樣我們就添加了每個(gè)cluster的周邊框框。前面我們畫曼哈頓圖的時(shí)候运授,是用的annotate('rect')來(lái)操縱的四個(gè)變量烤惊,因?yàn)槲覀儼衙總€(gè)點(diǎn)轉(zhuǎn)化成了X軸上的連續(xù)坐標(biāo),不是因子徒坡。
我們先簡(jiǎn)單修改一下背景色撕氧,框邊色等。
ggplot(pbmc.markers, aes(cluster, avg_log2FC)) +
geom_jitter(aes(color = type)) +
geom_col(data = back.data,aes(x = cluster,y = min),fill="grey93",alpha=0.5) +
geom_col(data = back.data,aes(x = cluster,y = max),fill="grey93",alpha=0.5) +
scale_color_manual(values=c(Down="#0099CC",Up="#CC3333"))+
theme_classic(base_size = 14) +
theme(panel.grid = element_blank(),
? ? ? ? ? ? ? ? ? legend.position = c(0.7,0.9),
? ? ? ? ? ? ? ? ? legend.title = element_blank(),
? ? ? ? ? ? ? ? ? legend.background = element_blank()) +
xlab('Clusters') + ylab('Average log2FoldChange') +
guides(color = guide_legend(override.aes = list(size = 5)))
下面我們?cè)赮=0的地方添加一個(gè)框喇完。如果繼續(xù)使用geom_col則是下面的效果伦泥。
ggplot(pbmc.markers, aes(cluster, avg_log2FC)) +
geom_jitter(aes(color = type)) +
geom_col(data = back.data,aes(x = cluster,y = min),fill="grey93",alpha=0.5) +
geom_col(data = back.data,aes(x = cluster,y = max),fill="grey93",alpha=0.5) +
scale_color_manual(values=c(Down="#0099CC",Up="#CC3333"))+
theme_classic(base_size = 14) +
theme(panel.grid = element_blank(),
? ? ? ? ? ? ? ? ? legend.position = c(0.7,0.9),
? ? ? ? ? ? ? ? ? legend.title = element_blank(),
? ? ? ? ? ? ? ? ? legend.background = element_blank()) +
xlab('Clusters') + ylab('Average log2FoldChange') +
guides(color = guide_legend(override.aes = list(size = 5)))+
geom_col(data = back.data,aes(x = cluster,y = 0.5,fill=cluster),show.legend = F)+
geom_col(data = back.data,aes(x = cluster,y = -0.5,fill=cluster),show.legend = F)
但是缺點(diǎn)是,就像添加的數(shù)據(jù)框一樣锦溪,是非連續(xù)的不脯。
我們?cè)谠囋嚻渌鼣?shù)據(jù)框的方法。一共有三個(gè)矩形函數(shù):geom_rect()刻诊、geom_tile()防楷、geom_raster()。
geom_rect()和geom_tile()函數(shù)的功能是一致的则涯,但是參數(shù)有所區(qū)別:geom_rect()使用的是矩形四個(gè)頂點(diǎn)的位置复局,即xmin冲簿、xmax、ymin和ymax亿昏,而geom_tile()使用的是矩形的中心位置及其尺寸峦剔,即x、y角钩、width吝沫、height。geom_tile()是geom_tile()的特例递礼,其要求所有矩形的尺寸相同惨险。
另外就是使用我們前面使用注釋函數(shù)annotate()。
所以脊髓,都可以根據(jù)需要多使用和測(cè)試辫愉。
ggplot(pbmc.markers, aes(cluster, avg_log2FC)) +
geom_jitter(aes(color = type)) +
geom_col(data = back.data,aes(x = cluster,y = min),fill="grey93",alpha=0.5) +
geom_col(data = back.data,aes(x = cluster,y = max),fill="grey93",alpha=0.5) +
scale_color_manual(values=c(Down="#0099CC",Up="#CC3333"))+
theme_classic(base_size = 14) +
theme(panel.grid = element_blank(),
? ? ? ? ? ? ? ? ? legend.position = c(0.7,0.9),
? ? ? ? ? ? ? ? ? legend.title = element_blank(),
? ? ? ? ? ? ? ? ? legend.background = element_blank()) +
xlab('Clusters') + ylab('Average log2FoldChange') +
guides(color = guide_legend(override.aes = list(size = 5)))+
#geom_col(data = back.data,aes(x = cluster,y = 0.5,fill=cluster),show.legend = F)+
#geom_col(data = back.data,aes(x = cluster,y = -0.5,fill=cluster),show.legend = F)
geom_tile(aes(x = cluster,y = 0,fill = cluster),color = 'black',height = 1,alpha = 0.3,show.legend = F)
可以看出,例子圖中他們用的是這個(gè)效果供炼。
下面一屋,我們就需要注釋掉X軸窘疮,以及改變X軸label的位置了袋哼。
ggplot(pbmc.markers, aes(cluster, avg_log2FC)) +
geom_jitter(aes(color = type)) +
geom_col(data = back.data,aes(x = cluster,y = min),fill="grey93",alpha=0.5) +
geom_col(data = back.data,aes(x = cluster,y = max),fill="grey93",alpha=0.5) +
scale_color_manual(values=c(Down="#0099CC",Up="#CC3333"))+
theme_classic(base_size = 14) +
theme(panel.grid = element_blank(),
? ? ? ? ? ? ? ? ? legend.position = c(0.7,0.9),
? ? ? ? ? ? ? ? ? legend.title = element_blank(),
? ? ? ? ? ? ? ? ? legend.background = element_blank()) +
xlab('Clusters') + ylab('Average log2FoldChange') +
guides(color = guide_legend(override.aes = list(size = 5)))+
#geom_col(data = back.data,aes(x = cluster,y = 0.5,fill=cluster),show.legend = F)+
#geom_col(data = back.data,aes(x = cluster,y = -0.5,fill=cluster),show.legend = F)
geom_tile(aes(x = cluster,y = 0,fill = cluster),color = 'black',height = 1,alpha = 0.3,show.legend = F)+
geom_text(data=back.data,aes(x = cluster,y = 0,label = cluster),size=4,color="white") +
theme(axis.line.x = element_blank(),
? ? ? axis.text.x = element_blank(),
? ? ? axis.ticks.x = element_blank())
下面就是要highlight一些top 5的基因了。
cell <-unique(pbmc.markers$cluster)
up.top<- data.frame()
for(n in 1:length(cell))
{
? tmp <- pbmc.markers %>% filter(cluster==cell[n]) %>% filter(avg_log2FC>0)%>% arrange(desc(avg_log2FC)) %>%head(5)
? up.top <- rbind(up.top,tmp)
}
down.top<- data.frame()
for(n in 1:length(cell))
{
? tmp <- pbmc.markers %>% filter(cluster==cell[n]) %>% filter(avg_log2FC<0)%>% arrange(avg_log2FC) %>%head(5)
? down.top <- rbind(down.top,tmp)
}
ggplot(pbmc.markers, aes(cluster, avg_log2FC)) +
geom_jitter(aes(color = type)) +
geom_col(data = back.data,aes(x = cluster,y = min),fill="grey93",alpha=0.5) +
geom_col(data = back.data,aes(x = cluster,y = max),fill="grey93",alpha=0.5) +
scale_color_manual(values=c(Down="#0099CC",Up="#CC3333"))+
scale_y_continuous(breaks = seq(-10, 10, 2), labels = as.character(seq(-10, 10, 2)),expand = c(0, 0),limits = c(-10, 10)) +
theme_classic(base_size = 14) +
theme(panel.grid = element_blank(),
? ? ? ? ? ? ? ? ? legend.position = c(0.7,0.9),
? ? ? ? ? ? ? ? ? legend.title = element_blank(),
? ? ? ? ? ? ? ? ? legend.background = element_blank()) +
xlab('Clusters') + ylab('Average log2FoldChange') +
guides(color = guide_legend(override.aes = list(size = 5)))+
#geom_col(data = back.data,aes(x = cluster,y = 0.5,fill=cluster),show.legend = F)+
#geom_col(data = back.data,aes(x = cluster,y = -0.5,fill=cluster),show.legend = F)
geom_tile(aes(x = cluster,y = 0,fill = cluster),color = 'black',height = 1,alpha = 0.3,show.legend = F)+
geom_text(data=back.data,aes(x = cluster,y = 0,label = cluster),size=4,color="white") +
theme(axis.line.x = element_blank(),
? ? ? axis.text.x = element_blank(),
? ? ? axis.ticks.x = element_blank()) +
geom_text_repel(data = up.top,aes(x = cluster,y = avg_log2FC,label = gene),max.overlaps = 50)+
geom_text_repel(data = down.top,aes(x = cluster,y = avg_log2FC,label = gene),max.overlaps = 50)