直观可靠的数据可视化对于研究成果的展示和科研文章的发表至关重要。鉴于条形图、箱线图、柱状图在可视化方面的不足,2019年Micah Allen等人引入一种新的一目了然的数据可视化方法—云雨图(图1),云雨图结合了数据分布(“云”)和原始数据点阵(“雨”),图中还添加箱形图、集中趋势和误差线信息来进一步补充。该方法结合了多种可视化手法,能够将原始数据、概率密度和关键的统计信息进行可视化展示。
图1 云雨图可视化方法
图源:https:// doi: 10.12688/wellcomeopenres.15191.2
01云雨图介绍
云雨图(Raincloud Plot)是一种结合小提琴图、散点图和箱线图的复合可视化工具,主要用于展示数据分布及其特征,是一种功能强大且灵活的可视化工具,能够帮助研究人员和数据分析师更好地理解和展示复杂数据。以下是云雨图的一些主要特点:
🔵 1.1 分布的可视化
云雨图展示了数据的分布情况,包括数据的密度和范围,小提琴图部分通过核密度估计显示不同组别之间的分布形状。
🔵 1.2 中心趋势表达
引入箱线图可以清晰地表示出数据的中位数、四分位数以及异常值,从而捕捉数据集的中心趋势。
🔵 1.3 个体的观察值
散点图覆盖在小提琴图上,展示了每个观测值的具体位置,可以直观地看到个体数据的分布情况。
🔵 1.4 比较不同组别
云雨图适用于比较多个组别之间的数据分布,通过不同颜色或形状区分不同条件,使得各组之间的差异一目了然。
🔵 1.5 数据的变异性
通过小提琴图和箱线图的结合,可以同时观察到数据的变异性,识别出数据集中是否存在离群值。
🔵 1.6 作图的美观性
云雨图在视觉上比传统的箱线图或小提琴图更具吸引力,色彩丰富,能够有效传达信息。
🔵 1.7 适用性较广泛
可以广泛应用于不同类型的数据,包括连续型和分类型数据,适用于多种研究领域,如生物学、心理学和社会科学等。
🔵 1.8 统计总结展示
云雨图还可以与其他统计分析结果结合使用,提供更全面的数据理解,例如平均值、标准差等统计量的展示。
02云雨图展示
03云雨图绘制
1. 加载所需的库
首先,需要加载一些常用的 R 库,这些库提供了数据处理和可视化的工具:
## Load the required libraries
library("ggplot2")
library("tidyr")
library("dplyr")
library("RColorBrewer")
source("https://gist.githubusercontent.com/benmarwick/2a1bb0133ff568cbe28d/raw/fb53bd97121f7f9ce947837ef1a4c65a73bffb3f/geom_flat_violin.R")
2. 加载数据
使用 read.delim2 函数从 CSV 文件中读取数据。注意参数设置确保正确读取数据格式:
## Load the data
inputData <- read.delim2("示例数据.csv",
header = TRUE,
sep = ',',
quote = '',
check.names = FALSE,
dec = '.')
3. 选择和重排序列
从输入数据框中选择需要的列,并按需进行重排序。这一步保证只有所需的数据被用于绘图:
## Select the columns and reorder the data if needed
inputData <- select(inputData,c("1","2","3","4","5","6","7","8","9"))
4. 数据重塑
使用 gather 将数据从宽格式转换为长格式,以便于 ggplot 使用。此处还移除了值为空字符串的行:
ggplot(plotData, aes(x = condition, y = value, fill = condition, color = condition)) +
ggtitle("Raincloud plot") + # 设置标题
ylab("score") + # 设置y轴标签
xlab("group") + # 设置x轴标签
theme_bw() + # 使用白色背景主题
scale_shape_identity() + # 保持形状不变
theme(plot.title = element_text(size = 20), # 设置标题字体大小
axis.title = element_text(size = 20), # 设置坐标轴标题字体大小
axis.text = element_text(size = 20), # 设置坐标轴文本字体大小
axis.text.x = element_text(angle = 0, hjust = 0.5, vjust = 0)) +
scale_colour_brewer(palette = "Spectral") + # 设置颜色调色板
scale_fill_brewer(palette = "Spectral") + # 填充颜色
geom_point(position = position_jitter(0.1), size = 3, alpha = 1, aes(shape = 16)) + # 添加散点图
geom_flat_violin(position = position_nudge(x = 0.25, y = 0), adjust = 1, alpha = 1, trim = TRUE, scale = "width") + # 添加小提琴图
geom_boxplot(aes(x = as.numeric(condition) + 0.2, y = value), notch = FALSE, width = 0.15, varwidth = FALSE, outlier.shape = NA, alpha = 0.8, colour = "black", show.legend = FALSE) + # 添加箱线图
stat_summary(fun.ymin = mean, fun.ymax = mean, geom = "errorbar", width = 0.1, position = position_nudge(x = 0.2, y = 0), size = 2, color = "black") + # 添加统计摘要
coord_flip() # 翻转坐标轴
整体上,这段代码通过多步骤的方式,从数据读取、处理到最终的可视化,利用 ggplot2 创建一个包含多个元素(散点、小提琴和箱线)的复杂图形。该图形有助于展示不同组别之间的数值分布情况。
图2 云雨图的可视化绘制图(横版)
🔵 代码整体呈现:
## Load the required libraries
library("ggplot2")
library("tidyr")
library("dplyr")
library("RColorBrewer")
source("https://gist.githubusercontent.com/benmarwick/2a1bb0133ff568cbe28d/raw/fb53bd97121f7f9ce947837ef1a4c65a73bffb3f/geom_flat_violin.R")
## Load the data
inputData <- read.delim2("示例数据.csv",
header = TRUE,
sep = ',',
quote = '',
check.names = FALSE,
dec = '.')
## Select the columns and reorder the data if needed
inputData <- select(inputData,c("1","2","3","4","5","6","7","8","9"))
## Reformat the data for ggplot
plotData <- gather(inputData,
condition,
value,
colnames(inputData),
factor_key = TRUE) %>%
filter(value != "")
## And plot the data
ggplot(plotData, aes(x = condition, y = value, fill = condition, color = condition)) +
ggtitle("Raincloud plot") +
ylab("score") +
xlab("group") +
theme_grey() +
scale_shape_identity() +
theme(plot.title = element_text(size = 20),
axis.title = element_text(size = 20),
axis.text = element_text(size = 20),
axis.text.x = element_text(angle = 0,
hjust = 0.5,
vjust = 0)) +
scale_colour_brewer(palette = "Spectral") +
scale_fill_brewer(palette = "Spectral") +
geom_point(position = position_jitter(0.1),
size = 3,
alpha = 1,
aes(shape = 16)) +
geom_flat_violin(position = position_nudge(x = 0.25, y = 0),
adjust = 1,
alpha = 1,
trim = TRUE,
scale = "width") +
geom_boxplot(aes(x = as.numeric(condition) + 0.2, y = value),
notch = FALSE,
width = 0.15,
varwidth = FALSE,
outlier.shape = NA,
alpha = 0.8,
colour = "black",
show.legend = FALSE) +
stat_summary(fun.ymin = mean,
fun.ymax = mean,
geom = "errorbar",
width = 0.15,
position = position_nudge(x = 0.2, y = 0),
size = 2,
color = "black")
结果如图:
图3 云雨图的可视化绘制图(竖版)
一图胜千言!水文图绘改版后致力于分享水文相关的精美图表,为读者提供作图思路和经验,帮助大家制作更漂亮丰富的图表。同时欢迎留言咨询绘图难点,我们会针对性地分享相关绘制经验。另外也期待读者踊跃来稿,分享更好的构图思维和技巧,稿件可发送至邮箱hydro90@126.com, 或者联系微信17339888901投稿。
编辑:张海昕 马孟良|校稿:hydro90编委团