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

如何调整ggplot密度图的Y轴范围,匹配箱线图尺度?

解决ggplot2箱线图+密度图Y轴尺度不一致问题

问题核心是箱线图Y轴对应原始数据数值,而密度图默认Y轴是密度值(0-1区间),两者尺度完全不匹配,coord_cartesian仅能缩放显示范围,无法解决本质问题。以下是两种有效调整方法:

方法1:直接将密度图Y轴映射为计数(推荐)

利用stat_density的..count..统计量,把密度值转换为对应的数据计数,和箱线图Y轴尺度对齐:

library(ggplot2)

# 替换成你的数据集(dput导出的结构)
df <- your_dataset_here

ggplot(df, aes(x = 你的分组变量, y = 你的数值变量)) +
  # 绘制箱线图
  geom_boxplot(width = 0.5) +
  # 绘制密度图,将Y轴映射为计数,调整位置避免和箱线图重叠
  stat_density(
    aes(y = ..count.., group = 你的分组变量),
    position = position_nudge(x = 0.3), # 向右偏移0.3个单位,可按需调整
    geom = "line",
    color = "#2E86AB"
  ) +
  # 现在可以正常设置Y轴范围
  ylim(0, 300) # 替换成你需要的范围

方法2:手动计算密度计数后绘制

如果需要更精细的控制,可先手动计算每个分组的密度计数,再用geom_line绘制:

library(ggplot2)
library(dplyr)
library(tidyr)

# 替换成你的数据集和变量名
df <- your_dataset_here
group_var <- "你的分组变量"
value_var <- "你的数值变量"

# 计算每个分组的密度计数
density_data <- df %>%
  group_by(!!sym(group_var)) %>%
  summarize(
    dens = list(density(!!sym(value_var), from = 0, to = 300)),
    .groups = "drop"
  ) %>%
  unnest_wider(dens) %>%
  unnest(c(x, y)) %>%
  mutate(count = y * nrow(df)/n_distinct(!!sym(group_var))) # 转换为计数

# 绘图
ggplot() +
  geom_boxplot(data = df, aes(x = !!sym(group_var), y = !!sym(value_var)), width = 0.5) +
  geom_line(data = density_data, aes(x = as.numeric(!!sym(group_var)) + 0.3, y = count, color = !!sym(group_var))) +
  ylim(0, 300)

关键说明

  • 不要用coord_cartesian(ylim = c(0, 600))强制缩放,因为密度图原始Y值(密度)远小于箱线图的Y值,缩放后只会让密度线贴在底部,显示异常。
  • 调整position_nudge的x值可以控制密度图和箱线图的间距,避免重叠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:02:22