R繪圖(6): 拯救初學(xué)者——發(fā)表級(jí)繪圖全能包ggpubr

今天花了很多時(shí)間整理這個(gè)包的繪圖函數(shù)氧猬,不得不說(shuō)這個(gè)基于ggplot2的包,是真的友好柳琢,很適合初學(xué)者绍妨∪罅常可能對(duì)于熟悉ggplot2的人來(lái)說(shuō),ggpubr的存在有些多余他去,但這并不妨礙它成為一個(gè)優(yōu)秀的R包毙驯。

接下來(lái)我主要依據(jù)變量類型,對(duì)這個(gè)包的十來(lái)種函數(shù)灾测,近30種圖形進(jìn)行展示爆价,幾乎涵蓋了平常看到的大多數(shù)圖媳搪。這篇推文也很可能成為你見(jiàn)過(guò)的最詳細(xì)的ggpubr中文教程铭段。
公眾號(hào)后臺(tái)回復(fù)20210330,獲取今天的代碼和圖形示例pdf秦爆。

install.packages("ggpubr")
library(ggpubr)

1. 單變量——連續(xù)型

1.1 密度圖
#創(chuàng)建數(shù)據(jù)框
set.seed(0330)
mydata = data.frame(
  group = rep(c("A", "B","C","D"), each=200),
  value = c(rnorm(200, mean = 2), rnorm(200, 6),rnorm(200,2,4),rnorm(200,6,4))
)

ggdensity(mydata, x = "value", y="..density..", #或者"..count.."序愚,默認(rèn)為"..density.."
          fill = "lightgray",
          add = "mean", #或者"median",
          rug = TRUE #在圖形下方添加密度線
          )
ggsave("density1.pdf",width = 10,height = 10,units = "cm")

分組繪制

ggdensity(mydata, x = "value",
          color = "group", fill="group", #分組
          palette = "Dark2",#或者"aaas"這種ggsci包的配色形式,或者"#00AFBB"這種編碼形式
          add = "mean",
          rug = TRUE,
          alpha=0.2, #調(diào)整透明度
          xlab=F,ylab = "Density",
          facet.by="group", #分面
          panel.labs=list(group = c("1", "2", "3", "4")), #修改每個(gè)panel的名字
          title="density plot",
          ggtheme=theme_bw() #可以是ggplot2中的主題類型
)
ggsave("density2.pdf",width = 13,height = 12,units = "cm")
1.2 密度圖疊加正態(tài)分布
set.seed(0330)
mydata = data.frame(
  group = rep(c("A", "B"), each=200),
  value = c(rnorm(200, 2), rnorm(200, 6, 4))
)

ggdensity(mydata, x = "value", fill = "red") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")+
  scale_x_continuous(limits = c(-5,20))
ggsave("density3.pdf",width = 10,height = 10,units = "cm")

分組繪制

ggdensity(mydata, x = "value", fill = "group") +
  stat_overlay_normal_density(aes(color=group), linetype = "dashed")+
  scale_x_continuous(limits = c(-5,20))
ggsave("density4.pdf",width = 10,height = 10,units = "cm")

分組+分面

ggdensity(mydata, x = "value", fill = "group", facet.by = "group") +
  stat_overlay_normal_density(aes(color=group), linetype = "dashed")+
  scale_x_continuous(limits = c(-5,20))
ggsave("density5.pdf",width = 16,height = 10,units = "cm")
1.3 直方圖
gghistogram(mydata, x = "value", fill = "lightgray",
            add = "mean", rug = TRUE)
ggsave("hist1.pdf",width = 10,height = 10,units = "cm")

分組繪制

gghistogram(mydata, x = "value", fill = "group",
            add = "mean", rug = TRUE,
            palette = c("#00AFBB", "#E7B800"))
ggsave("hist2.pdf",width = 10,height = 10,units = "cm")

添加核密度圖

gghistogram(mydata, x = "value", fill = "group",
            rug = TRUE,
            palette = c("#00AFBB", "#E7B800"),
            add_density = TRUE)
ggsave("hist3.pdf",width = 10,height = 10,units = "cm")

2. 雙變量——x離散,y連續(xù)

2.1 箱型圖
library(patchwork)
set.seed(0330)
mydata = data.frame(
  group = rep(c("A", "B"), each=100),
  group2 = rep(c("g1","g2","g1","g2"),each=50),
  value = c(rnorm(100, 2), rnorm(100, 6, 4))
)

#下面的加號(hào)表示拼接圖形
ggboxplot(mydata, x = "group", y = "value", width = 0.8)+
ggboxplot(mydata, x = "group", y = "value", width = 0.8, orientation = "horizontal")+
ggboxplot(mydata, x = "group", y = "value", width = 0.8, notch = TRUE,order = c("B","A"))+
ggboxplot(mydata, x = "group", y = "value", width = 0.8, select = c("A"))
ggsave("box1.pdf",width = 10,height = 10,units = "cm")

orientation調(diào)整圖形方向等限;notch添加缺口爸吮;order調(diào)整順序;select選擇特定的水平來(lái)畫圖

ggboxplot(mydata, x = "group", y = "value", width = 0.8, add = "jitter",add.params=list(color = "lightblue",size=1, shape = 17))+
ggboxplot(mydata, x = "group", y = "value", width = 0.8, add = "dotplot",add.params=list(color = "lightblue",size=0.5))
ggsave("box2.pdf",width = 16,height = 10,units = "cm")

上面的add添加額外圖形
add.params對(duì)附加圖形的參數(shù)進(jìn)行調(diào)整望门,shape表示點(diǎn)的形狀拗胜,可以參加下圖

內(nèi)部分組

ggboxplot(mydata, x = "group", y = "value", width = 0.6, color = "black",fill="group2",palette = c("#00AFBB", "#E7B800"),
          xlab = F, #不顯示x軸的label
          bxp.errorbar=T,bxp.errorbar.width=0.4, #添加errorbar
          size=1, #箱型圖邊線的粗細(xì)
          outlier.shape=NA, #不顯示outlier
          legend = "right") #圖例放右邊
ggsave("box3.pdf",width = 10,height = 10,units = "cm")
2.1.1 箱型圖添加配對(duì)連線

可以接受兩種數(shù)據(jù)框

mydata2=mydata
mydata2$group2=NULL
head(mydata2)
# group    value
# 1     A 3.551687
# 2     A 3.664068
# 3     A 2.194454
# 4     A 2.569605
# 5     A 2.579997
# 6     A 1.837967
ggpaired(mydata2, x = "group", y = "value",
         color = "group", line.color = "gray", line.size = 0.4,
         palette = "npg")
                 
mydata2$id=rep(1:100,2)
mydata2=mydata2%>%reshape2::dcast(id~group)
head(mydata2)
# id        A         B
# 1  1 3.551687  4.720074
# 2  2 3.664068  7.821049
# 3  3 2.194454  8.956841
# 4  4 2.569605 -4.450063
# 5  5 2.579997  7.568216
# 6  6 1.837967  5.133688
ggpaired(mydata2, cond1 = "A", cond2 = "B",
         color = "condition", line.color = "gray", line.size = 0.4,
         palette = "npg")
ggsave("box4.pdf",width = 10,height = 10,units = "cm")

上面兩種數(shù)據(jù)框得到的圖是一模一樣的

2.1.2 添加p值

一般用法

ggboxplot(mydata, x = "group", y = "value", width = 0.8, 
          add = "dotplot",add.params=list(color = "lightblue",size=0.5))+
  stat_compare_means(method = "t.test")
ggsave("box5.pdf",width = 10,height = 10,units = "cm")

成對(duì)數(shù)據(jù)

ggpaired(mydata2, cond1 = "A", cond2 = "B",
         color = "condition", line.color = "gray", line.size = 0.4,
         palette = "npg")+
  stat_compare_means(paired = TRUE)
ggsave("box6.pdf",width = 10,height = 10,units = "cm")

多于兩個(gè)組時(shí),定義想檢驗(yàn)的配對(duì)

my_comparisons <- list( c("0.5", "1"), c("1", "2"), c("0.5", "2") )
ggboxplot(ToothGrowth, x = "dose", y = "len",
          color = "dose", palette = "npg")+
  #兩兩比較的p值
  stat_compare_means(comparisons = my_comparisons, label.y = c(29, 35, 40))+
  #整體的p值
  stat_compare_means(label.y = 45)
ggsave("box7.pdf",width = 10,height = 10,units = "cm")

固定某一組怒允,其他組與其比較

ggboxplot(ToothGrowth, x = "dose", y = "len",
          color = "dose", palette = "npg")+
  # 整體的p值
  stat_compare_means(method = "anova", label.y = 40)+ 
  #label中用點(diǎn)表示顯著性
  stat_compare_means(aes(label = ..p.signif..),
                     method = "t.test", ref.group = "0.5")
ggsave("box8.pdf",width = 10,height = 10,units = "cm")

分組/分面之后再做比較

ggboxplot(ToothGrowth, x = "supp", y = "len",
          color = "supp", palette = "npg",
          add = "jitter",
          facet.by = "dose")+
  #label中去掉檢驗(yàn)方法
  stat_compare_means(aes(label = paste0("p = ", ..p.format..)))
ggsave("box9.pdf",width = 10,height = 10,units = "cm")
2.2 小提琴圖

整體上參數(shù)選項(xiàng)和箱型圖差不多

ggviolin(mydata, x = "group", y = "value", fill = "group",
         palette = c("#00AFBB", "#E7B800"),
         add = "boxplot", add.params = list(fill = "white"))+
ggviolin(mydata, x = "group", y = "value", color = "group2", #內(nèi)部分組
         palette = c("#00AFBB", "#E7B800"), 
         add = "boxplot")
ggsave("violin1.pdf",width = 16,height = 10,units = "cm")
2.3 柱形圖
2.3.1 數(shù)據(jù)已經(jīng)統(tǒng)計(jì)好
df1 <- data.frame(group=c("A", "B", "C"),
                 len=c(6, 10, 14))
ggbarplot(df1, "group", "len",
          fill = "group", color = "group",
          palette = c("#00AFBB", "#E7B800", "#FC4E07"),
          label = TRUE, lab.pos = "in", lab.col = "white")
ggsave("bar1.pdf",width = 10,height = 10,units = "cm")
2.3.2 數(shù)據(jù)沒(méi)有統(tǒng)計(jì)好

(需要函數(shù)幫你計(jì)算,比如組內(nèi)求和锈遥,一般反映在縱坐標(biāo)上纫事,這是函數(shù)幫你算的)

df2 <- data.frame(group=rep(c("A", "B", "C"),2),
                  group2=rep(c("1", "2"), each=3),
                  len=c(6, 15, 3, 4, 10, 5))
# group group2 len
# 1     A      1   6
# 2     B      1  15
# 3     C      1   3
# 4     A      2   4
# 5     B      2  10
# 6     C      2   5
ggbarplot(df2, "group", "len",
          fill = "group2", color = "group2", palette = "Paired",
          label = TRUE, lab.col = "white", lab.pos = "in")+
ggbarplot(df2, "group", "len",
          fill = "group2", color = "group2", palette = "Paired",
          label = TRUE,
          position = position_dodge(0.9)) #范圍0-1,表示柱子之間的錯(cuò)開程度
ggsave("bar2.pdf",width = 16,height = 10,units = "cm")
2.3.3 添加誤差棒
df3 <- mydata
#這時(shí)累加
ggbarplot(df3, x = "group", y = "value")+
#這時(shí)求均值
ggbarplot(df3, x = "group", y = "value",
          add = "mean")+
#添加誤差棒,error.plot選擇展示形式所灸,默認(rèn)上下都展示
ggbarplot(df3, x = "group", y = "value",
          add = "mean_se",
          error.plot = "upper_errorbar")+
#內(nèi)部分組
ggbarplot(df3, x = "group", y = "value", color = "group2", 
          add = "mean_se", palette = c("#00AFBB", "#E7B800"),
          position = position_dodge())
ggsave("bar3.pdf",width = 16,height = 16,units = "cm")
2.4 連線圖
#數(shù)據(jù)計(jì)算好丽惶,可以直接用
ggline(df1, x = "group", y = "len")+
#內(nèi)部分組,點(diǎn)線的形狀和顏色均不同
ggline(df2, x = "group", y = "len", 
       linetype = "group2", shape = "group2",#點(diǎn)的形狀
       color = "group2", palette = c("#00AFBB", "#E7B800"))+
#添加點(diǎn)和誤差棒
ggline(df3, x = "group", y = "value",
       add = c("mean_se","dotplot"),add.params = list(size=0.5),
       color = "steelblue")+
#內(nèi)部分組爬立,線的顏色不一樣
ggline(df3, x = "group", y = "value", color = "group2",
       add = "mean_se", palette = c("#00AFBB", "#E7B800"))
ggsave("line1.pdf",width = 16,height = 16,units = "cm")
2.5 餅圖
df1$ratio=paste(df1$group,"(",round(df1$len / sum(df1$len),3) * 100,"%)",sep = "")
ggpie(df1, "len", label = "ratio",
      fill = "group", color = "white",
      palette = c("#00AFBB", "#E7B800", "#FC4E07"))+
ggpie(df1, "len", label = "ratio",
      lab.pos = "in", lab.font = "white",
      fill = "group", color = "white",
      palette = c("#00AFBB", "#E7B800", "#FC4E07"))
ggsave("pie1.pdf",width = 16,height = 10,units = "cm")

label添加文本注釋钾唬;
color是扇形的邊線,lab.pos調(diào)整文本的位置侠驯,lab.font調(diào)整文本字體顏色

2.6 圓環(huán)圖
ggdonutchart(df1, "len", label = "ratio",
             lab.pos = "in", lab.font = "white",
             fill = "group", color = "white",
             palette = c("#00AFBB", "#E7B800", "#FC4E07"))
ggsave("donut1.pdf",width = 10,height = 10,units = "cm")
2.7 克利夫蘭點(diǎn)圖
ggdotchart(df2, x = "group", y = "len",
           color = "group2", size = 3,
           add = "segment",
           add.params = list(color = "lightgray", size = 1.5),
           position = position_dodge(0.5),
           palette = "jco",
           ggtheme = theme_pubclean())
ggsave("Clevelands_Dot1.pdf",width = 10,height = 10,units = "cm")

3. 雙變量——x, y都連續(xù)

3.1 散點(diǎn)圖添加回歸線抡秆,相關(guān)系數(shù)
df4=mtcars
df4$cyl=as.factor(df4$cyl)
ggscatter(df4, x = "wt", y = "mpg",
          color = "black", size = 3, # 點(diǎn)的顏色,大小
          add = "reg.line",  # 添加回歸線
          add.params = list(color = "blue", fill = "lightgray"), # 回歸線的調(diào)整
          conf.int = TRUE, # 回歸線的置信區(qū)間
          cor.coef = TRUE, # 添加相關(guān)系數(shù)
          cor.coeff.args = list(method = "pearson", label.x = 3, label.sep = "\n")#相關(guān)系數(shù)的調(diào)整
)
3.2 分組計(jì)算相關(guān)系數(shù)
ggscatter(df4, x = "wt", y = "mpg",
          color = "cyl", palette = "jco",
          add = "reg.line", conf.int = TRUE)+
  stat_cor(aes(color = cyl), label.x = 3)
3.3 局部回歸
ggscatter(df4, x = "wt", y = "mpg",
          add = "loess", conf.int = TRUE)
3.4 添加分組橢圓吟策,均值點(diǎn)儒士,以及輻射線
ggscatter(df4, x = "wt", y = "mpg",
          color = "cyl", shape = "cyl",
          palette = c("#00AFBB", "#E7B800", "#FC4E07"),
          ellipse = TRUE, mean.point = TRUE,
          star.plot = TRUE)
3.5 添加文本注釋
df4$name <- rownames(df4)
ggscatter(df4, x = "wt", y = "mpg",
          color = "cyl", palette = c("#00AFBB", "#E7B800", "#FC4E07"),
          label = "name", repel = TRUE)+plot_layout(widths = c(1,2))
3.6 散點(diǎn)圖邊緣添加密度圖/箱型圖
ggscatterhist(
  iris, x = "Sepal.Length", y = "Sepal.Width",
  color = "Species", size = 3, alpha = 0.6,
  palette = c("#00AFBB", "#E7B800", "#FC4E07"),
  margin.params = list(fill = "Species", color = "black", size = 0.2)
)
ggscatterhist(
  iris, x = "Sepal.Length", y = "Sepal.Width",
  color = "Species", size = 3, alpha = 0.6,
  palette = c("#00AFBB", "#E7B800", "#FC4E07"),
  margin.plot = "boxplot",
  ggtheme = theme_bw()
)

感謝你能讀到這里,有任何疑問(wèn)歡迎后臺(tái)留言檩坚。

因水平有限着撩,有錯(cuò)誤的地方诅福,歡迎批評(píng)指正!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拖叙,一起剝皮案震驚了整個(gè)濱河市氓润,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薯鳍,老刑警劉巖咖气,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異辐啄,居然都是意外死亡采章,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門壶辜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)悯舟,“玉大人,你說(shuō)我怎么就攤上這事砸民〉衷酰” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵岭参,是天一觀的道長(zhǎng)反惕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)演侯,這世上最難降的妖魔是什么姿染? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮秒际,結(jié)果婚禮上悬赏,老公的妹妹穿的比我還像新娘。我一直安慰自己娄徊,他們只是感情好闽颇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寄锐,像睡著了一般兵多。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橄仆,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天剩膘,我揣著相機(jī)與錄音,去河邊找鬼沿癞。 笑死援雇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椎扬。 我是一名探鬼主播惫搏,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼具温,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了筐赔?” 一聲冷哼從身側(cè)響起铣猩,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茴丰,沒(méi)想到半個(gè)月后达皿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贿肩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年峦椰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汰规。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汤功,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溜哮,到底是詐尸還是另有隱情滔金,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布茂嗓,位于F島的核電站餐茵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏述吸。R本人自食惡果不足惜忿族,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝌矛。 院中可真熱鬧肠阱,春花似錦、人聲如沸朴读。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衅金。三九已至,卻和暖如春簿煌,著一層夾襖步出監(jiān)牢的瞬間氮唯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工姨伟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惩琉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓夺荒,卻偏偏與公主長(zhǎng)得像瞒渠,于是被迫代替她去往敵國(guó)和親良蒸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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