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

复刻带密度估计的直方图:坐标轴匹配难题

解决对数轴上直方图与密度曲线对齐问题

当你用scale_x_log10()时,直方图的..density..是基于原始数据计算的,而密度曲线默认也是基于原始数据,对数轴的缩放会打破两者的对齐关系。这里给你两种实用的解决方法:

方法一:先对数据做对数转换再绘图

先把minutes转换为对数形式,直接在转换后的数据上生成直方图和密度曲线,最后把轴标签还原为原始分钟数:

# 新增对数转换后的列
Teach_Back_1_FED3$log_minutes <- log10(Teach_Back_1_FED3$minutes)

# 绘图
Interpellet <- ggplot(Teach_Back_1_FED3, aes(x = log_minutes)) +
  geom_histogram(aes(y = ..density..), fill = 'blue', bins = 30) + # 可根据数据调整bins数量
  geom_density(color = "darkred") +
  scale_x_continuous(
    labels = function(x) 10^x, # 把对数刻度转成原始分钟数
    breaks = log10(c(1, 2, 5, 10, 20, 50)) # 自定义轴断点,匹配你的数据范围
  ) +
  labs(
    x = 'Minutes Between Pellets', 
    y = 'Density Estimation', 
    title = 'Interpellet Intervals'
  )

print(Interpellet)

方法二:在对数轴上调整密度计算的雅可比因子

对数变量变换后,概率密度需要乘以变量本身(雅可比行列式)才能正确对应对数刻度的轴。直接修改直方图和密度曲线的y值:

Interpellet <- ggplot(Teach_Back_1_FED3, aes(x = minutes)) +
  geom_histogram(aes(y = ..density.. * ..x..), fill = 'blue') + # 乘以x修正密度
  geom_density(aes(y = ..density.. * x), color = "darkred") + # 密度曲线同样修正
  scale_x_log10() +
  labs(
    x = 'Minutes Between Pellets', 
    y = 'Density Estimation', 
    title = 'Interpellet Intervals'
  )

print(Interpellet)

额外注意事项

  • 确保minutes列没有0值,否则log10()会报错,可提前过滤:Teach_Back_1_FED3 <- subset(Teach_Back_1_FED3, minutes > 0)
  • 调整bins参数(方法一)或binwidth(方法二),让直方图的粒度和密度曲线更匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:58:26