我想用R畫一個(gè)bar圖

本文介紹了如果用拼拼湊湊的方法畫出一個(gè)想要的bar圖。可能并不成體系冰单,但只要能達(dá)到目的方法,就是好方法灸促。

0. 準(zhǔn)備工作

  1. 加載需要的工具包诫欠。
library(ggpubr)
library(ggplot2)
  1. 加載并查看數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惠桃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辜王,老刑警劉巖劈狐,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呐馆,居然都是意外死亡肥缔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門汹来,熙熙樓的掌柜王于貴愁眉苦臉地迎上來续膳,“玉大人,你說我怎么就攤上這事收班》夭恚” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵摔桦,是天一觀的道長社付。 經(jīng)常有香客問我,道長邻耕,這世上最難降的妖魔是什么鸥咖? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮兄世,結(jié)果婚禮上啼辣,老公的妹妹穿的比我還像新娘。我一直安慰自己御滩,他們只是感情好鸥拧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艾恼,像睡著了一般住涉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钠绍,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天舆声,我揣著相機(jī)與錄音,去河邊找鬼柳爽。 笑死媳握,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磷脯。 我是一名探鬼主播蛾找,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赵誓!你這毒婦竟也來了打毛?” 一聲冷哼從身側(cè)響起柿赊,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幻枉,沒想到半個(gè)月后碰声,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熬甫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年胰挑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椿肩。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞻颂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郑象,到底是詐尸還是另有隱情贡这,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布扣唱,位于F島的核電站藕坯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏噪沙。R本人自食惡果不足惜炼彪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望正歼。 院中可真熱鬧辐马,春花似錦、人聲如沸局义。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萄唇。三九已至檩帐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間另萤,已是汗流浹背湃密。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留四敞,地道東北人泛源。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像忿危,于是被迫代替她去往敵國和親达箍。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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