【R畫圖學(xué)習(xí)13.4】散點(diǎn)圖---單細(xì)胞不同亞群火山圖

下面這個(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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闸衫,一起剝皮案震驚了整個(gè)濱河市涛贯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔚出,老刑警劉巖弟翘,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異骄酗,居然都是意外死亡稀余,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門趋翻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睛琳,“玉大人,你說(shuō)我怎么就攤上這事踏烙∈ζ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵讨惩,是天一觀的道長(zhǎng)辟癌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)荐捻,這世上最難降的妖魔是什么黍少? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任寡夹,我火速辦了婚禮,結(jié)果婚禮上厂置,老公的妹妹穿的比我還像新娘要出。我一直安慰自己,他們只是感情好农渊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布患蹂。 她就那樣靜靜地躺著,像睡著了一般砸紊。 火紅的嫁衣襯著肌膚如雪传于。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天醉顽,我揣著相機(jī)與錄音沼溜,去河邊找鬼。 笑死游添,一個(gè)胖子當(dāng)著我的面吹牛系草,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唆涝,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼找都,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了廊酣?” 一聲冷哼從身側(cè)響起能耻,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亡驰,沒(méi)想到半個(gè)月后晓猛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凡辱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年戒职,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片透乾。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洪燥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出续徽,到底是詐尸還是另有隱情蚓曼,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布钦扭,位于F島的核電站纫版,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏客情。R本人自食惡果不足惜其弊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一癞己、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梭伐,春花似錦痹雅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赂苗,卻和暖如春愉耙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拌滋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工朴沿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人败砂。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓赌渣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親昌犹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坚芜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容