本笔记为个人学习整理,仅供参考。主要参考内容在文末附有链接。如有侵权,请联系删除。
云雨图(Raincloud plots)
其实是可以看成核密度估计曲线图、箱形图和抖动散点图的组合图,清晰、完整、美观地展示了所有数据信息。本质上是一个混合图,可同时将原始数据、数据分布和关键汇总统计表现出来,由对分的小提琴图(Violin plot)
、箱线图(boxplot)
和作为某种散点的原始数据
组成。
云雨图的绘制方法有很多。包括但不限于使用自定义的半小提琴函数 geom_flat_violin()
、箱形图函数 geom_boxplot()
和抖动散点图函数 geom_jitter()
分别叠加实现,或使用gghalves
、ggdist
等R包混合绘制。
2024年01月23日ggrain
被发布在CRAN上。ggrain
是一个R
包,允许我们按照“图形语法”(即 ggplot2
)创建 Raincloud图
。
安装
ggrain
提供了两种安装方式。
下载 CRAN
版本
install.packages("ggrain")
library(ggrain)
从 Github
下载
if (!require(remotes)) {
install.packages("remotes")
}
remotes::install_github('njudd/ggrain')
library(ggrain)
geom_rain()
函数参数介绍
geom_rain()
函数可显示单个数据点
、方框图
和半小提琴图。
它还可以通过指定连接的 id
,用跨组的线将数据点连接起来。最后,如果需要,还可以根据另一个变量为点着色。
用法
geom_rain(
mapping = NULL,
data = NULL,
inherit.aes = TRUE,
id.long.var = NULL,
cov = NULL,
rain.side = NULL,
likert = FALSE,
seed = 42,
...,
point.args = rlang::list2(...),
point.args.pos = rlang::list2(position = position_jitter(width = 0.04, height = 0, seed
= seed)),
line.args = rlang::list2(alpha = 0.2, ...),
line.args.pos = rlang::list2(position = position_jitter(width = 0.04, height = 0, seed
= seed), ),
boxplot.args = rlang::list2(outlier.shape = NA, ...),
boxplot.args.pos = rlang::list2(width = 0.05, position = position_nudge(x = 0.1), ),
violin.args = rlang::list2(...),
violin.args.pos = rlang::list2(side = "r", width = 0.7, position = position_nudge(x =
0.15), )
)
常用参数及用法
mapping
用途: 用于定义美学映射,如 x 轴、y 轴和颜色。通常通过 aes()
函数设置。示例: aes(x = factor(Species), y = Sepal.Width, color = Species)
data
用途: 指定图层中使用的数据。通常默认使用传递给 ggplot()
的数据集,但可以在此覆盖。示例: data = iris
rain.side
用途: 决定雨云图的显示位置。可选值包括 "r"
(右侧)、"l"
(左侧)、"f"
(两侧)。示例: rain.side = "r"
point.args
用途: 自定义点图的参数,如点的大小、颜色等。 示例: point.args = list(size = 2, colour = "blue")
line.args
用途: 自定义线条的参数,如线条的颜色、透明度等。通常需要指定 id.long.var
以连接点。示例: line.args = list(colour = "grey", alpha = 0.3)
boxplot.args
用途: 自定义箱线图的参数,如箱线图的填充颜色、边框等。 示例: boxplot.args = list(fill = "yellow")
violin.args
用途: 自定义小提琴图的参数,如小提琴图的宽度、填充颜色等。 示例: violin.args = list(fill = "green", alpha = 0.5)
inherit.aes
用途: 是否继承默认的美学映射。默认为 TRUE
,如果设置为FALSE
,则会覆盖默认映射。示例: inherit.aes = FALSE
id.long.var
用途: 用于指定连接线条的组。必须是一个字符串,例如 "id"
。示例: id.long.var = "Species"
绘制图形
我们使用鸢尾花数据集中 Sepal.Width
的所有值来绘制一个简单的图形。
# 清空当前R环境,删除所有对象
rm(list = ls())
# 加载ggplot2包,用于数据可视化
library(ggplot2)
# 加载ggrain包,用于创建雨云图(raincloud plot)
library(ggrain)
# 加载内置的iris数据集
iris
# 创建一个雨云图,y轴是Sepal.Width,x轴是一个虚拟变量1
ggplot(iris, aes(1, Sepal.Width)) +
geom_rain() + # 使用geom_rain()函数绘制雨云图
theme_classic() + # 应用经典主题,给图形一个简洁的外观
theme(
axis.title.x = element_blank(), # 移除x轴的标题
axis.text.x = element_blank(), # 移除x轴的文本标签
axis.ticks.x = element_blank() # 移除x轴的刻度
)
由于我们并没有设置填充因子或字符向量,因此图形是黑白色。并不能区分三种花色的变化趋势及数据分布情况。
rm(list = ls())
library(ggplot2)
library(ggrain)
iris
ggplot(iris, aes(1, Sepal.Width, fill = Species)) +
geom_rain(alpha = .5) +
theme_classic()
上述代码中,我们添加了color = Species
来着色。
geom_boxplot
的默认行为是为箱线图中的线着色,显示中位数和 IQR
。因此,我们需要添加一个 boxplot.args
列表以将箱线图重新着色为黑色。这样做时,所有默认值都会丢失,因此我们必须添加选项以不显示异常值。
rm(list = ls())
library(ggplot2)
library(ggrain)
iris
ggplot(iris, aes(1, Sepal.Width, fill = Species, color = Species)) +
geom_rain(alpha = .5,
boxplot.args = list(color = "black", outlier.shape = NA)) +
theme_classic() +
scale_fill_brewer(palette = 'Dark2') +
scale_color_brewer(palette = 'Dark2')
也可以微移箱形图,使它们不会与 boxplot.args.pos
重叠。
rm(list = ls())
library(ggplot2)
library(ggrain)
iris
ggplot(iris, aes(1, Sepal.Width, fill = Species, color = Species)) +
geom_rain(alpha = .5,
boxplot.args = list(color = "black", outlier.shape = NA),
boxplot.args.pos = list(
position = ggpp::position_dodgenudge(x = .1, width = 0.1), width = 0.1
)
) +
theme_classic() +
scale_fill_brewer(palette = 'Dark2') +
scale_color_brewer(palette = 'Dark2')
boxplot.args.pos
这个参数用于控制箱线图的位置信息
,具体来说,它影响了箱线图的水平位置和宽度。
position:
这里使用了 ggpp
包中的 position_dodgenudge()
函数。这是一个位置调整函数,结合了位置抖动 (dodge)
和推移 (nudge)
两个效果。dodge
效果会根据组别(如 Species)将箱线图水平分开,避免重叠。nudge
效果会根据提供的值将元素沿 x
轴轻微移动。在这个例子中,x = 0.1
意味着将箱线图沿 x
轴向右移动 0.1
个单位。width = 0.1
控制的是 dodge
效果的宽度,即各组之间的间距。
width:
这个参数直接控制箱线图的宽度。在这里设置为 0.1
,表示每个箱线图的宽度将较窄。
如果要将云雨图按Species
分开,则需在ggplot
的aes
里给予映射。
rm(list = ls())
library(ggplot2)
library(ggrain)
iris
ggplot(iris, aes(Species, Sepal.Width, fill = Species, color = Species)) +
geom_rain(alpha = .5,
boxplot.args = list(color = "black", outlier.shape = NA),
boxplot.args.pos = list(
position = ggpp::position_dodgenudge(x = .1, width = 0.1), width = 0.1
)
) +
theme_classic() +
scale_fill_brewer(palette = 'Dark2') +
scale_color_brewer(palette = 'Dark2')
可以通过coord_flip()
来翻转绘图
rm(list = ls())
library(ggplot2)
library(ggrain)
iris
ggplot(iris, aes(Species, Sepal.Width, fill = Species, color = Species)) +
geom_rain(alpha = .5,
boxplot.args = list(color = "black", outlier.shape = NA),
boxplot.args.pos = list(
position = ggpp::position_dodgenudge(x = .1, width = 0.1), width = 0.1
)
) +
theme_classic() +
scale_fill_brewer(palette = 'Dark2') +
scale_color_brewer(palette = 'Dark2') +
coord_flip()
我们发现,半小提琴图、箱线图、散点图之间显得拥挤。我们可以使用boxplot.args.pos
和 violin.args.pos
参数来进行调整。
rm(list = ls())
library(ggplot2)
library(ggrain)
iris
ggplot(iris, aes(Species, Sepal.Width, fill = Species, color = Species)) +
geom_rain(alpha = .5,
boxplot.args = list(color = "black", outlier.shape = NA),
boxplot.args.pos = list(
width = .08, position = position_nudge(x = .13)
),
violin.args.pos = list(
width = .87,
side = "r",
position = position_nudge(x = .25)
),
point.args = list(
size = 1.5,
alpha = .6,
shape = 21
)) +
theme_classic() +
scale_fill_brewer(palette = 'Dark2') +
scale_color_brewer(palette = 'Dark2') +
coord_flip()
outlier.shape = NA:
去除箱线图中的异常值点。position = position_nudge(x = .13):
将箱线图在 x 轴方向上向右偏移0.13
个单位。
geom_rain()
也提供了 cov
参数。
rm(list = ls())
library(ggplot2)
library(ggrain)
iris
ggplot(iris, aes(Species, Sepal.Width, fill = Species)) +
geom_rain(alpha = .6,
cov = "Sepal.Length") +
theme_classic() +
scale_fill_brewer(palette = 'Dark2') +
guides(fill = 'none', color = 'none') +
scale_color_viridis_c(option = "A", direction = -1)
cov = "Sepal.Length":
这个参数指示 geom_rain()
使用 Sepal.Length
作为协变量来对点进行着色。这样,在每个物种内,点的颜色将根据 Sepal.Length
的值来变化,通常是通过一种渐变的颜色映射来实现的。换句话说,Sepal.Length
值的大小决定了点的颜色深浅。
scale_color_viridis_c(option = "A", direction = -1):
使用 viridis
色阶对点的颜色进行映射,其中 option = "A"
指定了色阶的类型,direction = -1
则翻转了色阶的方向,使得颜色从深到浅进行过渡。
主要参考:
[1]. https://cran.r-project.org/web/packages/ggrain/vignettes/ggrain.html
本文为个人学习笔记,整理过程难免有误。如有错误,欢迎指正。仅供个人学习使用,如有侵权,请联系删除