R包-ggpubr

ggpubr 是用于可视化的一个 R 包。

散点图

ggpubr 散点图是使用 ggscatter 函数,但是貌似没法调节透明度(alpha),因此没办法用于数据量较大有重叠的散点图。

因此这里我感觉不如直接使用其它包 ,比如我就用 ggplot2 和 scatterplot3d 画 PCA 的二维和三维图。

使用 ggscatter 函数的一个简单例子如下

1
2
3
4
5
6
data("mtcars")
df <- mtcars
df$cyl <- as.factor(df$cyl)
p1 <- ggscatter(df, x = "wt", y = "mpg",
color = "cyl")
p1

你可以在图中对每一个点添加标签(适合点比较少的情况),如下。其中 :

  • label = "name": 指定标签列
  • repel = TRUE : 避免标签重叠
1
2
3
4
df$name <- rownames(df)
ggscatter(df, x = "wt", y = "mpg",
color = "cyl", palette = c("#00AFBB", "#E7B800", "#FC4E07"),
label = "name", repel = TRUE)

折线图

折线图比较简单,如下

1
2
3
4
5
6
7
8
9
df4 <- data.frame(sex=factor(rep(c("F","M"),each=10)),year = factor(c(seq(10,19),seq(10,19))), weight=c(rnorm(10,20),rnorm(10,40)))

ggline(df4, x="year", y="weight", color = "sex",
shape = "sex", linetype="sex", # 设置点的形状,线的形状
position = position_dodge(1.0), # 避免点与点重叠在一块
palette = c("#00AFBB", "#E7B800"), # 调色板
legend.title = "", # 取消图例标题
legend=c(0.94,0.18), # 设置图例位置,手动调节
)

条形图

条形图使用 ggbarplot 函数。

横坐标标签不重复

这里是指的是所有数据横坐标的标签均不相同的情况下。

首先我们看一个简单的例子,按照纵坐标大小排序绘图。如下

1
2
3
4
5
ggbarplot(df, x="name", y="mpg", fill = "cyl", color = "white",
palette = "jco",#杂志jco的配色
sort.val = "desc",#按照纵坐标大小下降排序
sort.by.groups=FALSE,#不按组排序
x.text.angle=60) #x坐标文字角度

如果我们按组进行排序,则设置 sort.by.groups=TRUE ,如下

1
2
3
4
5
ggbarplot(df, x="name", y="mpg", fill = "cyl", color = "white",
palette = "jco",#杂志jco的配色
sort.val = "desc",#按照纵坐标大小下降排序
sort.by.groups=TRUE,#按组排序
x.text.angle=60) #x坐标文字角度

我们可以通过设置 rotate=TRUE 来翻转 X 轴和 Y 轴 (此时不用设置 x.text.angle ) 。

1
2
3
4
5
ggbarplot(df, x="name", y="mpg", fill = "cyl", color = "white",
palette = "jco",#杂志jco的配色
sort.val = "desc",#按照纵坐标大小下降排序
sort.by.groups=TRUE,#按组排序
rotate=TRUE)

横坐标标签不重复

如果横坐标标签重复,比如我们对不同情况下去做重复实验,不同分组对应的 x 轴标签均相同。

这里有一点我不太清楚原理,基于 ggplot2 的书籍,我了解到了 position_dodge(width=0.5) 中必须与外面的width=0.5中的数值相同, 这样才能使用组内的柱子之间间距为0,彼此紧挨着。

1
2
3
4
5
6
7
p <- ggbarplot(df4, x="位点数", y="基因型一致率", fill = "参考群数目", color = "white",
palette = "jco",#杂志jco的配色
x.text.angle=60, #x坐标文字角度
ylim = c(min(df4$"基因型一致率")-0.1,ceiling(max(df4$"基因型一致率")*10)/10), # y轴区间
width=0.5, # 条形图中条行的宽度
position = position_dodge(width=0.5), #设置分组之间并排,其中width必须和上面设置完全一致
)

如果需要有一些组内间距,则将 position_dodge(width=*) 中的值设得更大一下,比如下面设为 0.7

1
2
3
4
5
6
7
p <- ggbarplot(df4, x="位点数", y="基因型一致率", fill = "参考群数目", color = "white",
palette = "jco",#杂志jco的配色
x.text.angle=60, #x坐标文字角度
ylim = c(min(df4$"基因型一致率")-0.1,ceiling(max(df4$"基因型一致率")*10)/10), # y轴区间
width=0.5, # 条形图中条行的宽度
position = position_dodge(width=0.7), #设置分组之间并排,其中width必须和上面设置完全一致
)

棒棒糖图

棒棒图可以视为条形图的一种变体,用线条和点来替换了条形图中的长方形,如下。

这里 ggdotchart 函数默认就是画一个点图,因此必须设置 add = "segments" 在点图基础上添加棒子(柱状线条)。

1
2
3
4
5
6
ggdotchart(df, x="name", y="mpg", color = "cyl", 
palette = "jco", sorting = "desc",
dot.size = 6, # 点的大小
add = "segments", # 在点图基础上添加棒子(柱状线条)
add.params = list(color = "cyl", size = 0.5), # 棒子的参数,颜色设置与点相同
)

如果需要按组排序,则设置 group = "cyl" ,如下

1
2
3
4
5
6
7
ggdotchart(df, x="name", y="mpg", color = "cyl", 
palette = "jco", sorting = "desc",
dot.size = 6, # 点的大小
add = "segments", # 在点图基础上添加棒子(柱状线条)
add.params = list(color = "cyl", size = 0.5), # 棒子的参数,颜色设置与点相同
group = "cyl", # 按组排序
)

如果需要在点上显示数值,则加上标签label = round(df$mpg)font.label = list(color="white", size=9, vjust=0.5) 这一句用于设置标签上的文字,这里的vjust=0.5就是使得标签文字出现在点的中心部位(参考R语言 hjust = 0, vjust = 1属性设置) 。

1
2
3
4
5
6
7
8
ggdotchart(df, x="name", y="mpg", color = "cyl", 
palette = "jco", sorting = "desc",
dot.size = 6, # 点的大小
add = "segments", # 在点图基础上添加棒子(柱状线条)
add.params = list(color = "cyl", size = 0.5), # 棒子的参数,颜色设置与点相同
group = "cyl", # 按组排序
label = round(df$mpg), # 添加标签
font.label = list(color="white", size=9, vjust=0.5)) # 设置标签

最后,你可以使用 rotate = TRUE 来翻转坐标轴,如下

1
2
3
4
5
6
7
8
9
ggdotchart(df, x="name", y="mpg", color = "cyl", 
palette = "jco", sorting = "desc",
dot.size = 6, # 点的大小
add = "segments", # 在点图基础上添加棒子(柱状线条)
add.params = list(color = "cyl", size = 0.5), # 棒子的参数,颜色设置与点相同
group = "cyl", # 按组排序
label = round(df$mpg), # 添加标签
font.label = list(color="white", size=9, vjust=0.5), # 设置标签
rotate = TRUE) # 翻转坐标轴

描述数据分布

直方图

直方图比较简单,通过设置rug = TRUE可以添加边际地毯线,通过设置add = "mean" 可以添加均值线。

1
2
3
4
5
6
7
8
9
df2 <- data.frame(sex=factor(rep(c("F","M"),each=200)),weight=c(rnorm(200,55),rnorm(200,58)))

gghistogram(df2, x="weight", color = "sex", fill = "sex",
add = "mean", rug = TRUE, # 添加均值线和边际地毯
palette = c("#00AFBB", "#E7B800"), # 调色板
bins = (nrow(df2)%/%10), # 区间数目等于行数整除10
alpha = 0.4, # 设置透明度
legend.title = "", # 取消图例标题
)

密度分布图

密度分布图和直方图的设置基本一样,不多解释。

1
2
3
4
5
6
ggdensity(df2, x="weight",  color = "sex", fill = "sex", 
add = "mean", rug = TRUE, # 添加均值线和边际地毯
palette = c("#00AFBB", "#E7B800"), # 调色板
alpha = 0.4, # 设置透明度
legend.title = "", # 取消图例标题
)

箱线图

首先我们画一个正常的箱线图,如下

1
2
3
4
5
6
data("ToothGrowth")
df3 <- ToothGrowth

ggboxplot(df3, x="dose", y="len", color = "dose",
palette = c("#00AFBB", "#E7B800", "#FC4E07"),
)

我们可以在箱线图上显示所有的数据点,如下

1
2
3
4
5
p <- ggboxplot(df3, x="dose", y="len", color = "dose",
palette = c("#00AFBB", "#E7B800", "#FC4E07"),
add = "jitter", shape="dose", # 添加所有数据点,设置数据点的性状
)
p

我们还可以进一步显示组间比较的 P 值,这里 stat_compare_means(label.y = 50) 这句应该是添加总的 P 值,通过 label.y = 50 设置其结果放在 y=50 的位置。

1
2
my_comparisons <- list(c("0.5", "1"), c("1", "2"), c("0.5", "2"))
p + stat_compare_means(comparisons = my_comparisons)+ stat_compare_means(label.y = 50)

这里在 stat_compare_means 中添加 label = "p.signif" ,将显示的 p 值改为星号 。

1
p + stat_compare_means(comparisons = my_comparisons, label = "p.signif")+ stat_compare_means(label.y = 50)

小提琴图

类似于箱线图,如下

1
2
3
4
5
6
7
p <- ggviolin(df3, x="dose", y="len", fill = "dose",
palette = c("#00AFBB", "#E7B800", "#FC4E07"),
add = "boxplot", add.params=list(fill="white"), # 添加箱线图,设置箱线图填充颜色
)
p
my_comparisons <- list(c("0.5", "1"), c("1", "2"), c("0.5", "2"))
p + stat_compare_means(comparisons = my_comparisons)+ stat_compare_means(label.y = 50)

其它设置

标题及坐标轴设置

具体见 ggpar() 函数的说明文档,常见设置如下

1
2
3
4
5
6
7
8
9
p2 <- ggpar(p,
title = "Box plot created with ggpubr", #标题
subtitle = "Length by dose", #副标题
xlab = "Dose (mg)", # 横坐标名称
ylab = "Teeth length", # 纵坐标名称
legend.title = "Dose (mg)", #图例名称
legend = 'right', #图例位置
legend = c(0.95,0.2), #图例在图上的相对位置
)

调色板

调色板就是使用的颜色模板,常用的专业期刊调色板如下

“npg”, “aaas”, “lancet”, “jco”, “ucscgb”, “uchicago”, “simpsons”, “rickandmorty”

参考文献

  1. https://zhuanlan.zhihu.com/p/33093479

  2. https://liuyang0681.github.io/2019/11/15/快速绘制发表级图片ggplot2智能版ggpubr包学习总结/

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2019-2024 Vincere Zhou
  • 访问人数: | 浏览次数:

请我喝杯茶吧~

支付宝
微信