You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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))

关键细节

  1. 自动缩放逻辑:scales::rescale()将分类变量对应的数值(1、2、3)线性映射到dE_old的最小值(0)到最大值(≈6.32)区间,无需手动调整diviseur。
  2. 保留trim=FALSE:直接在geom_violin中设置该参数,确保小提琴图显示完整的尾部形态。
  3. 可选优化:通过scale_y_continuous将纵轴的数值刻度替换为分类标签(low/medium/high),让图表更易读。

内容的提问来源于stack exchange,提问作者Ccile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:57:22