數(shù)據(jù)可視化是將數(shù)據(jù)直觀展示出來的一個必不可少的步驟。ggplot2是一個非常常見的繪圖R包级零,在文獻(xiàn)中滞乙,我們常常會看見用漂亮箱線圖來展示原始數(shù)據(jù)的分布奏纪。這里我們就用一個基因表達(dá)水平的例子來展示用R包繪圖神器ggplot2繪制的過程吧斩启!
Step1:數(shù)據(jù)的預(yù)處理
這里我們利用GEO中單細(xì)胞RNA測序數(shù)據(jù)來練練手。
數(shù)據(jù)來源:
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE128147
在R中讀取這個數(shù)據(jù):
counts = read.table("~/Downloads/GSE128147_raw_counts_w_ercc.txt", header = TRUE)
我們可以得到行是基因名兔簇,列是細(xì)胞名,中間的數(shù)值為表達(dá)量垄琐。也就是每個基因在每個細(xì)胞中的表達(dá)量,這種數(shù)據(jù)稱為raw counts狸窘。如圖所示:dim(counts)
[1] 23512 193
這里數(shù)據(jù)一共有193個細(xì)胞,通常我們有某種研究目的時氓涣,需要看某幾類細(xì)胞的表達(dá)情況陋气,那么根據(jù)細(xì)胞名或其他指標(biāo)將它們區(qū)分開劳吠。
由于這里僅為了學(xué)習(xí)如何作圖巩趁,那么為了方便,只取幾種基因议慰,并將這些細(xì)胞按照順序粗暴地分為3組,每組64個褒脯,每組分別命名為CellType1, CellType2, CellType3,計算每個基因在各類細(xì)胞中的表達(dá)水平(求和)番川,并整理成一個數(shù)據(jù)框脊框,變量名為expres。整理代碼如下:
## 將原始數(shù)據(jù)截取出左浇雹、中屿讽、右三段
type1 = counts[,1:65]
type2 = counts[,c(1,66:129)]
type3 = counts[,c(1,130:193)]
## 將每個基因在每種細(xì)胞內(nèi)的表達(dá)量求和昭灵,并將結(jié)果添加到數(shù)據(jù)框中
type1 = within(type1,{sum.of.expression = rowSums(type1[-1])})
type2 = within(type2,{sum.of.expression = rowSums(type2[-1])})
type3 = within(type3,{sum.of.expression = rowSums(type3[-1])})
## 只取出第1列基因名與最后一列表達(dá)水平之和
type1 = type1[,c(1,66)]
type2 = type2[,c(1,66)]
type3 = type3[,c(1,66)]
## 將三個向量合并為一個數(shù)據(jù)框
expres = data.frame(Gene = type1[,1],
CellType1 = type1[,2],
CellType2 = type2[,2],
CellType3 = type3[,2])
這么一來得到的數(shù)據(jù)就是這樣:> head(expres)
Gene CellType1 CellType2 CellType3
1 Xkr4 0 0 0
2 Rp1 0 1249 4
3 Sox17 0 0 0
4 Mrpl15 12 2172 1483
5 Lypla1 268 1956 2235
6 Tcea1 206 508 1443
將數(shù)據(jù)變形烂完,利于后續(xù)作圖。
library(reshape2)
expres.melt = melt(expres, value.name = "Counts")
# Using Gene as id variables
# ggplot2常用melt型數(shù)據(jù)
expres.melt = subset(expres.melt, Counts > 300 & Counts < 10000)
# 篩選掉一些表達(dá)量過少和過多的基因
expres.melt$Counts = log(expres.melt$Counts)
#由于表達(dá)量絕對值差距太大抠蚣,因此用對數(shù)將數(shù)據(jù)標(biāo)準(zhǔn)化
head(expres.melt)
Gene variable Counts
8 Atp6v1h CellType1 6.967909
11 Rb1cc1 CellType1 7.502186
14 Pcmtd1 CellType1 5.910797
16 Rrs1 CellType1 7.092574
21 Vcpip1 CellType1 8.051978
30 Arfgef1 CellType1 7.686621
Step2:繪制箱線圖
1. 畫一個基礎(chǔ)的箱線圖:geom_boxplot()
library(ggplot2)
ggplot(expres.melt, aes(x=variable,y=Counts)) +
geom_boxplot(aes(fill=variable))
- expres.melt即我們的數(shù)據(jù)履澳;
- aes(x = 橫坐標(biāo)向量, y = 縱坐標(biāo)向量)嘶窄;
- geom_boxplot 箱線圖距贷;
- fill=variable 按照variable類型來填充顏色柄冲。
2. 更改坐標(biāo)軸標(biāo)題忠蝗、圖片標(biāo)題與圖例標(biāo)題:labs()
在剛才的基礎(chǔ)上我們想要將圖的橫坐標(biāo)、縱坐標(biāo)以及圖的標(biāo)題進(jìn)行修改什湘,那么可以使用labs()函數(shù)在之前的代碼后面進(jìn)行添加。
ggplot(expres.melt, aes(x=variable,y=Counts)) +
geom_boxplot(aes(fill=variable)) +
labs(title="Expression Level of 3 Types of Cells",
x="Cell Type", y = "Counts/(log)", fill = "Cell Type") # fill為修改圖例標(biāo)題
3. 圖例的設(shè)置:theme()
圖例標(biāo)題的修改比較特殊得哆,不能再用labs了,而是用theme()贩据,同時theme()這個函數(shù)還能設(shè)置圖例的標(biāo)題的字體闸餐、顏色饱亮、大小舍沙。也能修改總標(biāo)題的位置。
ggplot(expres.melt, aes(x=variable,y=Counts)) +
geom_boxplot(aes(fill=variable)) +
labs(title="Expression Level of 3 Types of Cells",
x="Cell Type", y = "Counts/(log)", fill = "Cell Type") +
theme(plot.title = element_text(hjust = 0.5), # 將圖表標(biāo)題居中
legend.title=element_text(face="italic", # 圖例標(biāo)題改為斜體
family="Times", # 圖例標(biāo)題字體調(diào)為Times
colour="red")) # 圖例標(biāo)題顏色改為紅色
4.將箱線圖轉(zhuǎn)置:coord_flip()
有時候如果數(shù)據(jù)類型比較多拂铡,為了排版方便葱绒,可能需要將箱線圖轉(zhuǎn)置,這種情況下怎么處理呢地淀?
ggplot(expres.melt, aes(x=variable,y=Counts)) +
geom_boxplot(aes(fill=variable)) +
labs(title="Expression Level of 3 Types of Cells",
x="Cell Type", y = "Counts/(log)",
fill = "Cell Type") +
theme(plot.title = element_text(hjust = 0.5) +
coord_flip()
圖形就橫過來了岖是。
5.將背景變?yōu)榘咨簍heme_bw()
背景的顏色也可以進(jìn)行修改帮毁,這樣一來做PPT上組會匯報時白色背景顯得更為學(xué)術(shù)和美觀豺撑。
ggplot(expres.melt, aes(x=variable,y=Counts)) +
geom_boxplot(aes(fill=variable)) +
labs(title="Expression Level of 3 Types of Cells",
x="Cell Type", y = "Counts/(log)",
fill = "Cell Type") +
theme_bw()
除了這些,其實還有許多的功能可以疊加前硫,如增加數(shù)據(jù)點(diǎn)可疊加散點(diǎn)+geom_dotplot荧止,標(biāo)注異常值可利用outlier屹电,代碼示例:
ggplot(expres.melt, aes(x=variable,y=Counts)) +
geom_boxplot(aes(fill=variable),
outlier.colour="red",
outlier.shape=8,
outlier.size=4)
但由于數(shù)據(jù)本身的原因不含異常值跃巡,因此顯示不出來,代碼貼出來供學(xué)習(xí)使用素邪。
文章已發(fā)布到微信公眾號:百味科研芝士,歡迎關(guān)注兔朦。