今天花了很多時間整理這個包的繪圖函數,不得不說這個基於ggplot2的包,是真的友好,很適合初學者。可能對於熟悉ggplot2的人來說,ggpubr的存在有些多余,但這並不妨礙它成為一個優秀的R包。
接下來我主要依據變量類型,對這個包的十來種函數,近30種圖形進行展示,幾乎涵蓋了平常看到的大多數圖。這篇推文也很可能成為你見過的最詳細的ggpubr中文教程。
公眾號后台回復20210330,獲取今天的代碼和圖形示例pdf。
install.packages("ggpubr")
library(ggpubr)
1. 單變量——連續型
1.1 密度圖
#創建數據框
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..",默認為"..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, #調整透明度
xlab=F,ylab = "Density",
facet.by="group", #分面
panel.labs=list(group = c("1", "2", "3", "4")), #修改每個panel的名字
title="density plot",
ggtheme=theme_bw() #可以是ggplot2中的主題類型
)
ggsave("density2.pdf",width = 13,height = 12,units = "cm")
1.2 密度圖疊加正態分布
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連續
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))
)
#下面的加號表示拼接圖形
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調整圖形方向;notch添加缺口;order調整順序;select選擇特定的水平來畫圖
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對附加圖形的參數進行調整,shape表示點的形狀,可以參加下圖
內部分組
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, #箱型圖邊線的粗細
outlier.shape=NA, #不顯示outlier
legend = "right") #圖例放右邊
ggsave("box3.pdf",width = 10,height = 10,units = "cm")
2.1.1 箱型圖添加配對連線
可以接受兩種數據框
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")
上面兩種數據框得到的圖是一模一樣的
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")
成對數據
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")
多於兩個組時,定義想檢驗的配對
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中用點表示顯著性
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中去掉檢驗方法
stat_compare_means(aes(label = paste0("p = ", ..p.format..)))
ggsave("box9.pdf",width = 10,height = 10,units = "cm")
2.2 小提琴圖
整體上參數選項和箱型圖差不多
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", #內部分組
palette = c("#00AFBB", "#E7B800"),
add = "boxplot")
ggsave("violin1.pdf",width = 16,height = 10,units = "cm")
2.3 柱形圖
2.3.1 數據已經統計好
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 數據沒有統計好
(需要函數幫你計算,比如組內求和,一般反映在縱坐標上,這是函數幫你算的)
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,表示柱子之間的錯開程度
ggsave("bar2.pdf",width = 16,height = 10,units = "cm")
2.3.3 添加誤差棒
df3 <- mydata
#這時累加
ggbarplot(df3, x = "group", y = "value")+
#這時求均值
ggbarplot(df3, x = "group", y = "value",
add = "mean")+
#添加誤差棒,error.plot選擇展示形式,默認上下都展示
ggbarplot(df3, x = "group", y = "value",
add = "mean_se",
error.plot = "upper_errorbar")+
#內部分組
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 連線圖
#數據計算好,可以直接用
ggline(df1, x = "group", y = "len")+
#內部分組,點線的形狀和顏色均不同
ggline(df2, x = "group", y = "len",
linetype = "group2", shape = "group2",#點的形狀
color = "group2", palette = c("#00AFBB", "#E7B800"))+
#添加點和誤差棒
ggline(df3, x = "group", y = "value",
add = c("mean_se","dotplot"),add.params = list(size=0.5),
color = "steelblue")+
#內部分組,線的顏色不一樣
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調整文本的位置,lab.font調整文本字體顏色
2.6 圓環圖
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 克利夫蘭點圖
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都連續
3.1 散點圖添加回歸線,相關系數
df4=mtcars
df4$cyl=as.factor(df4$cyl)
ggscatter(df4, x = "wt", y = "mpg",
color = "black", size = 3, # 點的顏色,大小
add = "reg.line", # 添加回歸線
add.params = list(color = "blue", fill = "lightgray"), # 回歸線的調整
conf.int = TRUE, # 回歸線的置信區間
cor.coef = TRUE, # 添加相關系數
cor.coeff.args = list(method = "pearson", label.x = 3, label.sep = "\n")#相關系數的調整
)
3.2 分組計算相關系數
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 添加分組橢圓,均值點,以及輻射線
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 散點圖邊緣添加密度圖/箱型圖
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()
)
感謝你能讀到這里,有任何疑問歡迎后台留言。
因水平有限,有錯誤的地方,歡迎批評指正!