本文介紹了如果用拼拼湊湊的方法畫出一個(gè)想要的bar圖。可能并不成體系冰单,但只要能達(dá)到目的方法,就是好方法灸促。
0. 準(zhǔn)備工作
- 加載需要的工具包诫欠。
library(ggpubr)
library(ggplot2)
- 加載并查看數(shù)據(jù)
以ToothGrowth數(shù)據(jù)為例
The response is the length of odontoblasts (cells responsible for tooth growth) in 60 guinea pigs. Each animal received one of three dose levels of vitamin C (0.5, 1, and 2 mg/day) by one of two delivery methods, orange juice or ascorbic acid (a form of vitamin C and coded as VC).
df_demo <- ToothGrowth
head(df_demo)
1. 我想要畫一個(gè)簡單的bar圖
df_demo %>%
ggbarplot(x = 'dose', y = 'len',
color = 'supp',
add = 'mean_se',
position = position_dodge(0.8),
xlab = 'Dose(mg/day)',
ylab = 'Length',
title = 'The length of odontoblasts'
)
bar1.jpg
2. 我想加上每個(gè)點(diǎn)的數(shù)據(jù)
df_demo %>%
ggbarplot(x = 'dose', y = 'len',
color = 'supp',
add = c('mean_se', 'jitter'), # 加上jitter
add.params = list(alpha = 0.7, size = 0.8), # 調(diào)整點(diǎn)的參數(shù),alpha為透明度浴栽,size為大小
position = position_dodge(0.8),
xlab = 'Dose(mg/day)',
ylab = 'Length',
title = 'The length of odontoblasts'
)
bar2.jpg
3. 我想將bar圖改為填充色并且加上jitter點(diǎn)
如果只是想單純地改成填充荒叼,那只需要將color = 'supp'
改為fill='supp'
,或者加上這一句就好了。但這樣更改的話典鸡,add = 'jitter'
會出錯(cuò)被廓。我也不知道為什么。所以萝玷,如果想要將bar圖改為填充色嫁乘,并且還想保留jitter
點(diǎn)的話,可以用geom_jitter
df_demo %>%
ggbarplot(x = 'dose', y = 'len',
fill = 'supp',
add = c('mean_se'),
add.params = list(alpha = 0.7, size = 0.8), # 調(diào)整點(diǎn)的參數(shù)球碉,alpha為透明度蜓斧,size為大小
position = position_dodge(0.8),
xlab = 'Dose(mg/day)',
ylab = 'Length',
)+
geom_jitter(aes(dose, len, fill = supp), #對應(yīng)前面的x,y,fill
shape = 16, # 從1~25可以更改不同的形狀
size = 0.9,
position = position_jitterdodge(jitter.width = 0.3)
)
bar3.jpg
4. 我想修改圖例的顏色和名稱
df_demo %>%
ggbarplot(x = 'dose', y = 'len',
fill = 'supp',
add = c('mean_se'),
add.params = list(alpha = 0.7, size = 0.8), # 調(diào)整點(diǎn)的參數(shù),alpha為透明度睁冬,size為大小
position = position_dodge(0.8),
xlab = 'Dose(mg/day)',
ylab = 'Length',
)+
geom_jitter(aes(dose, len, fill = supp), #對應(yīng)前面的x,y,fill
shape = 16, # 從1~25可以更改不同的形狀
size = 0.9,
position = position_jitterdodge(jitter.width = 0.3)
)+
scale_fill_manual(name = 'Supp', # 如果前面是color就用scale_color_manual
label = c('Orange Juice','vitamin C'),
values = c('#0073c299','#efc00099'))
bar4.jpg
5. 我想修改x軸y軸字體/刻度等
df_demo %>%
ggbarplot(x = 'dose', y = 'len',
fill = 'supp',
add = c('mean_se'),
add.params = list(alpha = 0.7, size = 0.8), # 調(diào)整點(diǎn)的參數(shù)挎春,alpha為透明度,size為大小
position = position_dodge(0.8),
xlab = 'Dose(mg/day)',
ylab = 'Length',
)+
geom_jitter(aes(dose, len, fill = supp), #對應(yīng)前面的x,y,fill
shape = 16, # 從1~25可以更改不同的形狀
size = 0.9,
position = position_jitterdodge(jitter.width = 0.3)
)+
scale_fill_manual(name = 'Supp', # 如果前面是color就用scale_color_manual
label = c('Orange Juice','vitamin C'),
values = c('#0073c299','#efc00099'))+
font('xylab', face = 'bold', size = 10)+ #對x軸y軸名稱進(jìn)行加粗,也可用xlab或ylab進(jìn)行單獨(dú)處理
theme(axis.text.y = element_blank(), # y軸的text
axis.ticks.y = element_blank(), # y軸的刻度
axis.line.y = element_blank()) # y軸的軸
bar5.jpg
6. 我想加上顯著性星標(biāo)
這里的顯著性是需要自己先做統(tǒng)計(jì)分析才得到的結(jié)果
df_demo %>%
ggbarplot(x = 'dose', y = 'len',
fill = 'supp',
add = c('mean_se'),
add.params = list(alpha = 0.7, size = 0.8), # 調(diào)整點(diǎn)的參數(shù)直奋,alpha為透明度能庆,size為大小
position = position_dodge(0.8),
xlab = 'Dose(mg/day)',
ylab = 'Length',
)+
geom_jitter(aes(dose, len, fill = supp), #對應(yīng)前面的x,y,fill
shape = 16, # 從1~25可以更改不同的形狀
size = 0.9,
position = position_jitterdodge(jitter.width = 0.3)
)+
scale_fill_manual(name = 'Supp', # 如果前面是color就用scale_color_manual
label = c('Orange Juice','vitamin C'),
values = c('#0073c299','#efc00099'))+
font('xylab', face = 'bold', size = 13)+ #對x軸y軸名稱進(jìn)行加粗,也可用xlab或ylab進(jìn)行單獨(dú)處理
geom_signif(y_position=c(35), # y_position是誤差線所在y軸位置
xmin=c(0.8, 1.8),
xmax=c(1.2, 2.2),# xmin和xmax是誤差線在x軸位置脚线,可傳入多個(gè)值
annotation=c("***",'**'), # 顯著性標(biāo)識,可自定義輸入
tip_length=0.02, # 顯著性括號下延長度
size=0.6, # 線的大小
textsize = 7, # 星標(biāo)大小
vjust = 0.5 #星標(biāo)與線的距離
)+
geom_signif(y_position=c(35),
xmin=c(2.8), xmax=c(3.2),#
annotation=c('ns'), # 自定義輸入
tip_length=0.02,
size=0.6, # 線的大小
textsize = 4.5, # 此處為ns搁胆,是字母,所以字體大小需要重新設(shè)置
vjust = 0.01 #重新設(shè)置
)
bar6.jpg
7. 我想分面展示
分面(facet)展示其實(shí)更適合三個(gè)條件以上的殉挽,這里的示例數(shù)據(jù)只有兩個(gè)條件丰涉。所以我這里認(rèn)為加上一個(gè)gender
用于演示。
df_demo %>%
mutate(gender = rep(c('f','m'),30)) %>%
ggbarplot(x = 'dose', y = 'len',
fill = 'supp',
add = c('mean_se'),
add.params = list(alpha = 0.7, size = 0.8), # 調(diào)整點(diǎn)的參數(shù)斯碌,alpha為透明度一死,size為大小
position = position_dodge(0.8),
facet.by = 'gender', # 根據(jù)gender分面
panel.labs = list(gender = c('Female','Male')), # 每個(gè)panel的名稱
xlab = 'Dose(mg/day)',
ylab = 'Length',
)+
geom_jitter(aes(dose, len, fill = supp), #對應(yīng)前面的x,y,fill
shape = 16, # 從1~25可以更改不同的形狀
size = 0.9,
position = position_jitterdodge(jitter.width = 0.3)
)+
scale_fill_manual(name = 'Supp', # 如果前面是color就用scale_color_manual
label = c('Orange Juice','vitamin C'),
values = c('#0073c299','#efc00099'))+
font('xylab', face = 'bold', size = 13) #對x軸y軸名稱進(jìn)行加粗,也可用xlab或ylab進(jìn)行單獨(dú)處理
bar7.jpg
8. 我想分面展示并加上不同的顯著性星標(biāo)
使用facet.by
去分面展示數(shù)據(jù)之后傻唾,如果直接用geom_signif
去加顯著性星標(biāo)的畫投慈,R會平等地對待每一個(gè)panel,也就是說冠骄,每個(gè)panel的星標(biāo)是一樣的伪煤。但現(xiàn)實(shí)情況是,每個(gè)panel內(nèi)條件間的差異是不一樣的凛辣,這也是我們想要分面展示數(shù)據(jù)的原因抱既。那要怎么給每個(gè)panel加上不同的顯著性星標(biāo)呢。答案是扁誓,我也不知道防泵。但是我可以用一些曲線救圖的方法來實(shí)現(xiàn)。也就是蝗敢,分開畫圖捷泞,然后拼在一起。
# 先畫第一個(gè)面
p_female <- df_demo %>%
mutate(gender = rep(c('f','m'),30)) %>%
filter(gender == 'f') %>%
ggbarplot(x = 'dose', y = 'len',
fill = 'supp',
add = c('mean_se'),
add.params = list(alpha = 0.7, size = 0.8), # 調(diào)整點(diǎn)的參數(shù)寿谴,alpha為透明度锁右,size為大小
position = position_dodge(0.8),
facet.by = 'gender', # 根據(jù)gender分面
panel.labs = list(gender = c('Female')), # panel的名稱
xlab = 'Dose(mg/day)',
ylab = 'Length',
)+
geom_jitter(aes(dose, len, fill = supp), #對應(yīng)前面的x,y,fill
shape = 16, # 從1~25可以更改不同的形狀
size = 0.9,
position = position_jitterdodge(jitter.width = 0.3)
)+
scale_fill_manual(name = 'Supp', # 如果前面是color就用scale_color_manual
label = c('Orange Juice','vitamin C'),
values = c('#0073c299','#efc00099'))+
font('xylab', face = 'bold', size = 13)+ #對x軸y軸名稱進(jìn)行加粗,也可用xlab或ylab進(jìn)行單獨(dú)處理
theme_pubr(margin = T)+
geom_signif(y_position=c(30), # y_position是誤差線所在y軸位置
xmin=c(0.8, 1.8),
xmax=c(1.2, 2.2),# xmin和xmax是誤差線在x軸位置讶泰,可傳入多個(gè)值
annotation=c("***",'*'), # 顯著性標(biāo)識,可自定義輸入
tip_length=0.02, # 顯著性括號下延長度
size=0.6, # 線的大小
textsize = 7, # 星標(biāo)大小
vjust = 0.5 #星標(biāo)與線的距離
)
# 再畫第二個(gè)面咏瑟,然后實(shí)現(xiàn)y軸消失術(shù)
p_male <- df_demo %>%
mutate(gender = rep(c('f','m'),30)) %>%
filter(gender == 'm') %>%
ggbarplot(x = 'dose', y = 'len',
fill = 'supp',
add = c('mean_se'),
add.params = list(alpha = 0.7, size = 0.8), # 調(diào)整點(diǎn)的參數(shù),alpha為透明度痪署,size為大小
position = position_dodge(0.8),
facet.by = 'gender', # 根據(jù)gender分面
panel.labs = list(gender = c('Male')), # panel的名稱
xlab = 'Dose(mg/day)',
ylab = ' ', # 這里把y軸名稱也取消
)+
geom_jitter(aes(dose, len, fill = supp), #對應(yīng)前面的x,y,fill
shape = 16, # 從1~25可以更改不同的形狀
size = 0.9,
position = position_jitterdodge(jitter.width = 0.3)
)+
scale_fill_manual(name = 'Supp', # 如果前面是color就用scale_color_manual
label = c('Orange Juice','vitamin C'),
values = c('#0073c299','#efc00099'))+
font('xylab', face = 'bold', size = 13)+ #對x軸y軸名稱進(jìn)行加粗响蕴,也可用xlab或ylab進(jìn)行單獨(dú)處理
theme_pubr(margin = T)+
geom_signif(y_position=c(30), # y_position是誤差線所在y軸位置
xmin=c(0.8, 1.8),
xmax=c(1.2, 2.2),# xmin和xmax是誤差線在x軸位置,可傳入多個(gè)值
annotation=c("*",'**'), # 顯著性標(biāo)識,可自定義輸入
tip_length=0.02, # 顯著性括號下延長度
size=0.6, # 線的大小
textsize = 7, # 星標(biāo)大小
vjust = 0.5 #星標(biāo)與線的距離
)+
theme(axis.text.y = element_blank(), # y軸消失術(shù)
axis.ticks.y = element_blank(),
axis.line.y = element_blank())
# 把這兩張圖拼起來
ggarrange(p_female, p_male, ncol = 2, nrow = 1,common.legend = T)
bar8.jpg