如何在R语言中同一张图叠加小提琴图与曲线?
在R中自动适配曲线范围叠加小提琴图与曲线
问题说明
需要在同一张图中叠加小提琴图和曲线,已实现基础叠加效果,但需自动调整参数适配曲线的数值范围,同时必须保留trim=FALSE参数。
解决方案
通过线性缩放分类变量到曲线的数值区间替代手动设置diviseur,实现自动适配。核心是将分类标签转换为数值后,映射到曲线dE_old的取值范围,让小提琴图的位置自动匹配曲线的纵轴尺度(coord_flip后)。
完整代码
library(ggplot2) library(scales) # 用于数值缩放函数 # 生成示例数据 temps <- data.frame( "LvlTemp"= c(rep("low", 10), rep("medium", 15), rep("high", 20)), "Value" = c(runif(10, 0, 30), runif(15, 5, 40), runif(20, 15, 40)) ) df_E_old <- data.frame("Temp"=0:40, "dE_old"=sqrt(0:40)) # 设置分类变量顺序 temps$LvlTemp <- factor(temps$LvlTemp, levels = c("low", "medium", "high")) # 自动计算缩放规则:将分类变量的数值映射到dE_old的取值范围 temps$num_Lvl <- as.numeric(temps$LvlTemp) range_dE <- range(df_E_old$dE_old) temps$scaled_Lvl <- rescale(temps$num_Lvl, to = range_dE) # 绘制叠加图 ggplot() + # 绘制曲线 geom_path(data = df_E_old, aes(x = dE_old, y = Temp), color = "black", linewidth = 1) + # 绘制小提琴图,保留trim=FALSE参数 geom_violin(data = temps, aes(x = scaled_Lvl, y = Value, fill = LvlTemp, color = LvlTemp), alpha = 0.5, trim = FALSE) + coord_flip() + xlab("Development rate") + ylab("Temperature (°C)") + theme_minimal() + theme(legend.position = "none") + scale_color_manual(values = c("blue", "purple", "red")) + scale_fill_manual(values = c("blue", "purple", "red")) + # 可选:将纵轴刻度替换为分类标签,提升可读性 scale_y_continuous(breaks = temps$scaled_Lvl, labels = levels(temps$LvlTemp))
关键细节
- 自动缩放逻辑:
scales::rescale()将分类变量对应的数值(1、2、3)线性映射到dE_old的最小值(0)到最大值(≈6.32)区间,无需手动调整diviseur。 - 保留
trim=FALSE:直接在geom_violin中设置该参数,确保小提琴图显示完整的尾部形态。 - 可选优化:通过
scale_y_continuous将纵轴的数值刻度替换为分类标签(low/medium/high),让图表更易读。
内容的提问来源于stack exchange,提问作者Ccile
相关产品推荐
相关产品推荐

