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

使用ggplot2将分布面积缩放至非1指定值,实现两个子组分布面积总和为1的方法

解决ggplot2中手动调整分布密度总面积的问题

我明白你遇到的困扰了——默认情况下stat_density()会自动把每个分布的面积归一化为1,所以直接用weight参数没办法实现让两个子图的分布面积分别为0.6和0.4(总和为1)的需求。weight参数其实是用来调整单个样本观测的权重,而非整个分布的总面积比例,这就是它没生效的原因。

咱们换个思路,先手动计算密度并缩放面积,再用ggplot绘制,具体步骤如下:

步骤1:手动计算并缩放密度值

先用R基础包的density()函数算出原始密度,再将密度的y值乘以目标权重(这样就能让整个分布的总面积等于该权重值,因为原始密度的面积是1),最后把结果整理成数据框供ggplot使用。

步骤2:修改后的完整代码

# 处理dorsal组数据,设置总面积为0.6
density_dorsal <- density(x_dorsal_17$x)
df_dorsal <- data.frame(x = density_dorsal$x, y = density_dorsal$y * 0.6)

# 绘制dorsal组的密度图
x_dorsal <- ggplot(df_dorsal, aes(x = x, y = y)) +
  geom_line(size = 1) +
  scale_x_continuous(limits = c(-850, 850), breaks = seq(from = -850, to = 850, by = 850)) +
  theme_classic()

# 处理ventral组数据,设置总面积为0.4
density_ventral <- density(x_ventral_17$x)
df_ventral <- data.frame(x = density_ventral$x, y = density_ventral$y * 0.4)

# 绘制ventral组的密度图
x_ventral <- ggplot(df_ventral, aes(x = x, y = y)) +
  geom_line(size = 1) +
  scale_x_continuous(limits = c(-850, 850), breaks = seq(from = -850, to = 850, by = 850)) +
  theme_classic()

原理说明

density()函数返回的y值是概率密度,其积分(也就是曲线下的面积)默认是1。我们将每个y值乘以目标权重后,新的分布面积就会等于该权重——比如乘以0.6后,dorsal组的分布面积就是0.6,ventral组乘以0.4后面积是0.4,两者总和正好是1,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:07:44