直方图上的密度曲线平坦

问题描述

我正在尝试绘制一条遵循数据直方图趋势的曲线,我环顾四周并尝试了其他人的代码,但我仍然得到一条平坦的线。这是我的代码

hist(Ferr,xlab = "Ferritin plasma Concentration",ylab = "Frequency",main = "Histogram of Ferritin 
plasma Concentration",xlim = c(0,250),ylim = c(0,50),cex.axis=0.8,cex.lab=0.8,cex.main = 1)
curve(dnorm(x,mean = mean(Ferr),sd = sd(Ferr)),col="blue",add=TRUE)
lines(density(Ferr),col="red")

如果有人能帮我看看我哪里出错了,那就太好了。

解决方法

与直方图不同,密度函数在整个空间上的积分等于 1 :

sum(density(x)*dx) = 1

要将密度函数缩放到直方图,您可以将其乘以直方图 bin 的最大值,然后除以点之间的距离。

我们以mtcars$mpg为例:

Ferr <- mtcars$mpg
d <- density(Ferr)
dx <- diff(d$x)[1] 

sum(d$y)*dx
[1] 1.000851

h <- hist(Ferr)
lines(x=d$x,y=max(h$counts)*d$y/dx)

enter image description here

,

您需要设置 freq = FALSE(并删除对 ylimxlim 的约束并将 "Frequency" 更改为 "Density"):

hist(Ferr,freq= FALSE,xlab = "Ferritin Plasma Concentration",ylab = "Density",main = "Histogram of Ferritin Plasma Concentration",cex.axis=0.8,cex.lab=0.8,cex.main = 1)
curve(dnorm(x,mean = mean(Ferr),sd = sd(Ferr)),col="blue",add=TRUE)
lines(density(Ferr),col="red")

玩具数据:

Ferr <-  rnorm(1000)

enter image description here