在R中将正态曲线叠加到直方图上

我已经设法在网上find如何覆盖正常曲线到直方图R,但我想保留直方图的正常“频率”y轴。 请参阅下面的两个代码段,并注意第二个如何将y轴replace为“密度”。 我怎么能把这个y轴保持为“频率”,就像它在第一个图中一样。

作为奖金:我想在密度曲线上标记SD区域(高达3 SD)。 我该怎么做? 我尝试了abline ,但是这条线延伸到了图的顶部,看起来很丑。

 g = d$mydata hist(g) 

在这里输入图像描述

 g = d$mydata m<-mean(g) std<-sqrt(var(g)) hist(g, density=20, breaks=20, prob=TRUE, xlab="x-variable", ylim=c(0, 2), main="normal curve over histogram") curve(dnorm(x, mean=m, sd=std), col="darkblue", lwd=2, add=TRUE, yaxt="n") 

在这里输入图像描述

看看上面的图片,y轴是“密度”。 我想要得到那个“频率”。

以下是我find的一个简单的方法:

 h <- hist(g, breaks = 10, density = 10, col = "lightgray", xlab = "Accuracy", main = "Overall") xfit <- seq(min(g), max(g), length = 40) yfit <- dnorm(xfit, mean = mean(g), sd = sd(g)) yfit <- yfit * diff(h$mids[1:2]) * length(g) lines(xfit, yfit, col = "black", lwd = 2) 

你只需要find正确的乘数,这可以很容易地从hist对象中计算出来。

 myhist <- hist(mtcars$mpg) multiplier <- myhist$counts / myhist$density mydensity <- density(mtcars$mpg) mydensity$y <- mydensity$y * multiplier[1] plot(myhist) lines(mydensity) 

在这里输入图像描述

一个更完整的版本,在距平均值(包括平均值)的每个标准偏差处具有正常的密度和线条:

 myhist <- hist(mtcars$mpg) multiplier <- myhist$counts / myhist$density mydensity <- density(mtcars$mpg) mydensity$y <- mydensity$y * multiplier[1] plot(myhist) lines(mydensity) myx <- seq(min(mtcars$mpg), max(mtcars$mpg), length.out= 100) mymean <- mean(mtcars$mpg) mysd <- sd(mtcars$mpg) normal <- dnorm(x = myx, mean = mymean, sd = mysd) lines(myx, normal * multiplier[1], col = "blue", lwd = 2) sd_x <- seq(mymean - 3 * mysd, mymean + 3 * mysd, by = mysd) sd_y <- dnorm(x = sd_x, mean = mymean, sd = mysd) * multiplier[1] segments(x0 = sd_x, y0= 0, x1 = sd_x, y1 = sd_y, col = "firebrick4", lwd = 2)