【R语言学习笔记】| 超好看的云雨图,一定要这样画!

文摘   科技   2024-08-21 23:08   甘肃  

本笔记为个人学习整理,仅供参考。主要参考内容在文末附有链接。如有侵权,请联系删除。

云雨图(Raincloud plots)其实是可以看成核密度估计曲线图、箱形图和抖动散点图的组合图,清晰、完整、美观地展示了所有数据信息。本质上是一个混合图,可同时将原始数据、数据分布和关键汇总统计表现出来,由对分的小提琴图(Violin plot)箱线图(boxplot)作为某种散点的原始数据组成。

云雨图的绘制方法有很多。包括但不限于使用自定义的半小提琴函数 geom_flat_violin()箱形图函数 geom_boxplot()抖动散点图函数 geom_jitter()分别叠加实现,或使用gghalvesggdist等R包混合绘制。

2024年01月23日ggrain被发布在CRAN上。ggrain是一个R包,允许我们按照“图形语法”(即 ggplot2)创建 Raincloud图

安装

ggrain提供了两种安装方式。

  1. 下载CRAN版本
install.packages("ggrain")

library(ggrain)
  1. 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), )
)

常用参数及用法

  1. mapping
  • 用途: 用于定义美学映射,如 x 轴、y 轴和颜色。通常通过 aes() 函数设置。
  • 示例: aes(x = factor(Species), y = Sepal.Width, color = Species)
  1. data
  • 用途: 指定图层中使用的数据。通常默认使用传递给 ggplot() 的数据集,但可以在此覆盖。
  • 示例: data = iris
  1. rain.side
  • 用途: 决定雨云图的显示位置。可选值包括 "r"(右侧)、"l"(左侧)、"f"(两侧)。
  • 示例: rain.side = "r"
  1. point.args
  • 用途: 自定义点图的参数,如点的大小、颜色等。
  • 示例: point.args = list(size = 2, colour = "blue")
  1. line.args
  • 用途: 自定义线条的参数,如线条的颜色、透明度等。通常需要指定 id.long.var 以连接点。
  • 示例: line.args = list(colour = "grey", alpha = 0.3)
  1. boxplot.args
  • 用途: 自定义箱线图的参数,如箱线图的填充颜色、边框等。
  • 示例: boxplot.args = list(fill = "yellow")
  1. violin.args
  • 用途: 自定义小提琴图的参数,如小提琴图的宽度、填充颜色等。
  • 示例: violin.args = list(fill = "green", alpha = 0.5)
  1. inherit.aes
  • 用途: 是否继承默认的美学映射。默认为 TRUE,如果设置为 FALSE,则会覆盖默认映射。
  • 示例: inherit.aes = FALSE
  1. 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分开,则需在ggplotaes里给予映射。

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.posviolin.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

本文为个人学习笔记,整理过程难免有误。如有错误,欢迎指正。仅供个人学习使用,如有侵权,请联系删除

可凡的学习笔记本
在读硕士生,R、Python爱好者
 最新文章