Boxplot我想應該是做科研的最常用的可視化方式之一吧(具體自行百度),尤其是在做組學研究,常常要比較兩組或多組間的某一個因素(代謝物、基因、蛋白質等)的強度,而且有時間還需要對其做顯著性分析。
其實,可以做boxplot的軟件非常多,Origin,GraphPad,excel等等,性能和效果各有多長。但是在現在常見做boxplot的方法中,R是非常好的策略,沒有之一。其優(yōu)勢在于,可以個性化設置,可以批量出圖,僅僅這兩點已經是大部分做組學且對圖表有高癖好的同學們愛不釋手的了。
先讓我們看看常見的boxplot有哪些風格呢?在必應的國際版images檢索“boxplot”得到的結果是這樣的:
這一眼看到,還真的沒有哪幾個是看的上眼的,尤其是想用來發(fā)高水平文章的。那我們看看高水平文章的boxplot是什么樣子的,姑且就先看看前幾天代謝組圈子里吵得比較熱的一篇Nature communication的文章(https://doi.org/10.1038/s41467-019-09550-x)中的boxplot做的效果,請看下圖:
如論是配色、線條粗細、字體大小、還有表現風格都非常的小清醒。那么今天我們就來好好用R來學學(模仿)這個boxplot,看看是否能達到原圖的效果,因為沒有原始數據,我們姑且用ToothGrowth的data來演示(R內置,無需下載)。
---------------------------------------------------------------
首先,我們可以看到這個圖應該是基于ggplot2完成的(猜測的),我們可以借用ggplot2開發(fā)的作圖包ggpubr,和配套ggpubr的magrittr包。我們發(fā)現圖中有顯著性分析,推測可能會用到ggsignif包,接下來我們就這4個包開展boxplot圖的繪制。
安裝包(pacman請自行安裝):
pacman::p_load(ggplot2, ggpubr, magrittr, ggsignif)
安裝好這4個作圖的包之后,開始觀察數據:
View(ToothGrowth)
將數據中第三列屬性設置成factor:
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
如果我們查看dose組的factors有哪些,可以看到如下:
下面我們就要根據數據來出圖:
ggboxplot(ToothGrowth, #數據對象
x = 'dose', # 選擇x軸用那一列數據
y = 'len', #選擇y軸用什么數據
fill = 'dose', #顏色根據哪一列決定
bxp.errorbar = T, #是否添加error bar
bxp.errorbar.width = 0.2, #error bar的長度
palette = 'npg', #顏色風格
add = 'point' # 是否添加boxplot上面的點點
)
我們會得到下面的圖:
似乎基本形成已經形成了,下面我們就需要美化這張boxplot。
先把默認的x軸和y軸的標題改好:
ggboxplot(ToothGrowth, #數據對象
x = 'dose', # 選擇x軸用那一列數據
y = 'len', #選擇y軸用什么數據
fill = 'dose', #顏色根據哪一列決定
bxp.errorbar = T, #是否添加error bar
bxp.errorbar.width = 0.2, #error bar的長度
palette = 'npg', #顏色風格
add = 'point' # 是否添加boxplot上面的點點
) +
labs(title = 'Effect of Vitamin C on Tooth Growth', # 添加主標題
subtitle = 'Plot of length by dose', # 添加次標記
caption = 'Data source: ToothGrowth', #添加腳注
x = 'Dose (mg)', # x軸的名字
y = 'Teeth length' # y軸的名字
)
接著我們就得到下面的圖:
我們需要添加顯著性分析,假設我們dose=1和2的組需要跟dose=0.5的組進行比較:
ggboxplot(ToothGrowth, #數據對象
x = 'dose', # 選擇x軸用那一列數據
y = 'len', #選擇y軸用什么數據
fill = 'dose', #顏色根據哪一列決定
bxp.errorbar = T, #是否添加error bar
bxp.errorbar.width = 0.2, #error bar的長度
palette = 'npg', #顏色風格
add = 'point' # 是否添加boxplot上面的點點
) +
labs(title = 'Effect of Vitamin C on Tooth Growth', # 添加主標題
subtitle = 'Plot of length by dose', # 添加次標記
caption = 'Data source: ToothGrowth', #添加腳注
x = 'Dose (mg)', # x軸的名字
y = 'Teeth length' # y軸的名字
) +
geom_signif(comparisons = list(c('0.5', '1'), c('1','2'), c('0.5','2')), # 設置要對比的組
y_position = c(34,36,38), #設置3個顯著性標記的高度
tip_length = c(0), #設置顯著性那條橫線兩頭向下的長度
map_signif_level = T, #設置是否標記顯著性的*號,還是直接標記數值
test = t.test #設置顯著性計算方式
)
最后就是設置線寬度和字體大小,及其他的主題theme()參數:
ggboxplot(ToothGrowth, #數據對象
x = 'dose', # 選擇x軸用那一列數據
y = 'len', #選擇y軸用什么數據
fill = 'dose', #顏色根據哪一列決定
bxp.errorbar = T, #是否添加error bar
bxp.errorbar.width = 0.2, #error bar的長度
palette = 'npg', #顏色風格
add = 'point' # 是否添加boxplot上面的點點
) +
labs(title = 'Effect of Vitamin C on Tooth Growth', # 添加主標題
subtitle = 'Plot of length by dose', # 添加次標記
caption = 'Data source: ToothGrowth', #添加腳注
x = 'Dose (mg)', # x軸的名字
y = 'Teeth length' # y軸的名字
) +
geom_signif(comparisons = list(c('0.5', '1'), c('1','2'), c('0.5','2')), # 設置要對比的組
y_position = c(34,36,38), #設置3個顯著性標記的高度
tip_length = c(0), #設置顯著性那條橫線兩頭向下的長度
map_signif_level = T, #設置是否標記顯著性的*號,還是直接標記數值
test = t.test #設置顯著性計算方式
) +
theme(
plot.title = element_text(color = 'black', size = 16, hjust = 0.5),
plot.subtitle = element_text(color = 'black', size = 16,hjust = 0.5),
plot.caption = element_text(color = 'black', size = 16,face = 'italic', hjust = 1),
axis.text.x = element_text(color = 'black', size = 16, angle = 0),
axis.text.y = element_text(color = 'black', size = 16, angle = 0),
axis.title.x = element_text(color = 'black', size = 16, angle = 0),
axis.title.y = element_text(color = 'black', size = 16, angle = 90),
legend.title = element_text(color = 'black', size = 16),
legend.text = element_text(color = 'black', size = 16),
axis.line.y = element_line(color = 'black', linetype = 'solid'), # y軸線特征
axis.line.x = element_line (color = 'black',linetype = 'solid'), # x軸線特征
panel.border = element_rect(linetype = 'solid', size = 1.2,fill = NA) # 圖四周框起來
)
看起來效果已經達到。
That's easy!
如需聯系EasyCharts團隊
請加微信:EasyCharts
聯系客服