【问题标题】:Density curve on histogram is flat直方图上的密度曲线是平坦的
【发布时间】:2021-04-19 16:47:11
【问题描述】:

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

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")

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

【问题讨论】:

  • 您的坐标轴范围是否适合您的数据范围?
  • 一个简单的检查方法是删除xlim = c(0,250), ylim = c(0,50),并让hist设置范围。
  • 我的数据有正确的范围,在尝试删除 xlim 等后,它没有影响线路。线本身仍然在 x 轴上保持平坦,而不是跟随直方图

标签: r histogram curve


【解决方案1】:

与直方图不同,密度函数在整个空间上的积分等于 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)

【讨论】:

    【解决方案2】:

    您需要设置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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-04
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多