复刻带密度估计的直方图:坐标轴匹配难题
解决对数轴上直方图与密度曲线对齐问题
当你用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
相关产品推荐
相关产品推荐

