如何将ggdist包中左侧半小提琴图旋转至对应箱线图左侧?
解决雨云图半小提琴分组左右摆放问题
首先需要把宽格式的数据转换为长格式,这样才能按分组(Q/A)分别控制半小提琴的方向,具体实现代码如下:
library(tidyverse) library(ggdist) # 原数据 set.seed(123) df <- data.frame( ID = 1:50, Q = rnorm(50), A = rnorm(50,1) ) # 转长格式 df_long <- df %>% pivot_longer(cols = c(Q, A), names_to = "Group", values_to = "Value") # 绘制雨云图 ggplot(df_long, aes(x = Group, y = Value)) + # 半小提琴图:按分组设置左右方向 geom_half_violin( aes(fill = Group), side = ifelse(df_long$Group == "Q", "left", "right"), scale = "width", position = position_nudge(x = c(-0.15, 0.15)[match(df_long$Group, c("Q", "A"))]), alpha = 0.7 ) + # 箱线图 geom_boxplot( width = 0.2, outlier.shape = NA, alpha = 0.5 ) + # 散点(雨云的点部分) geom_jitter( aes(color = Group), width = 0.05, size = 1, alpha = 0.6 ) + theme_minimal() + labs(x = "分组", y = "数值") + scale_fill_brewer(palette = "Set2") + scale_color_brewer(palette = "Set2")
关键说明
- 宽转长是核心:原数据中Q和A是独立列,转成长格式后才能通过
Group列区分两组,实现分方向控制。 - 用
side参数替代justification:geom_half_violin的justification参数不支持按分组传入多个值,这是你之前出错的原因。改用side参数,按分组分别设置"left"和"right"即可实现左右摆放。 - 位置微调:通过
position_nudge让半小提琴和箱线图错开,避免重叠,提升图表可读性。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

