我已经设法在网上找到如何将正常曲线叠加到R中的直方图,但我想保留直方图的正常"频率"y轴.请参阅下面的两个代码段,并注意在第二个代码段中,y轴被替换为"density".如何将y轴保持为"频率",就像在第一个图中一样.
作为奖励:我想在密度曲线上标记SD区域(最多3 SD).我怎样才能做到这一点?我试过了abline,但是这条线延伸到了图形的顶部,看起来很丑陋.
g = d$mydata
hist(g)
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

看看上面的图像中,y轴是"密度".我想把它变成"频率".
绘制具有对于非标准化数据总和为1的密度曲线的直方图是非常困难的.关于此问题已有很多问题,但他们的解决方案都不适用于我的数据.需要有一个简单的解决方案.我找不到一个有效的简单解决方案的答案.
一些例子:
解决方案仅适用于标准化的正常数据 ggplot2:使用密度曲线叠加直方图
具有离散数据且无密度曲线 ggplot2密度直方图,宽度= .5,vline和居中条位置
在我的数据上,密度不总和为1 在ggplot2中创建密度直方图?
我的数据ggplot2密度直方图与自定义bin边缘不总和为1
这里用例子详细解释,但密度不是1,我的数据 "密度"曲线覆盖在直方图上,其中垂直轴是频率(即计数)或相对频率?
-
一些示例代码:
#Example code
set.seed(1)
t = data.frame(r = runif(100))
#first we try the obvious simple solution that should work
ggplot(t, aes(r)) +
geom_histogram() +
geom_density()
Run Code Online (Sandbox Code Playgroud)
所以,显然密度不等于1.
#maybe geom_histogram needs a ..density.. ?
ggplot(t, aes(r)) +
geom_histogram(aes(y = ..density..)) +
geom_density()
Run Code Online (Sandbox Code Playgroud)
它确实改变了一些东西,但不正确.
#maybe geom_density needs a ..density.. too ?
ggplot(t, aes(r)) +
geom_histogram(aes(y = ..density..)) +
geom_density(aes(y = ..density..))
Run Code Online (Sandbox Code Playgroud)
那里没有变化.
#maybe binwidth …Run Code Online (Sandbox Code Playgroud) 当垂直轴是频率或相对频率时,是否有一种方法可以叠加类似于密度曲线的东西?(不是实际的密度函数,因为该区域不需要整合到1).以下问题类似:
ggplot2:具有正常曲线的直方图,以及用户自我回答..count..的内容geom_density().然而这似乎不寻常.
以下代码产生过度膨胀的"密度"线.
df1 <- data.frame(v = rnorm(164, mean = 9, sd = 1.5))
b1 <- seq(4.5, 12, by = 0.1)
hist.1a <- ggplot(df1, aes(v)) +
stat_bin(aes(y = ..count..), color = "black", fill = "blue",
breaks = b1) +
geom_density(aes(y = ..count..))
hist.1a
Run Code Online (Sandbox Code Playgroud)

由于我上次尝试问这个问题时对数学感到困惑,所以再试一次。我想将直方图与平滑分布拟合相结合。我希望 y 轴以百分比表示。
我找不到得到这个结果的好方法。上次,我设法找到一种方法将 缩放geom_bar到与 相同的比例geom_density,但这与我想要的相反。
我当前的代码产生这个输出:
ggplot2::ggplot(iris, aes(Sepal.Length)) +
geom_bar(stat="bin", aes(y=..density..)) +
geom_density()
Run Code Online (Sandbox Code Playgroud)
密度和 bar y 值匹配,但缩放是无意义的。我想要 y 轴上的百分比,而不是密度。
一些新的尝试。我们从一个修改为显示百分比而不是计数的条形图开始:
gg = ggplot2::ggplot(iris, aes(Sepal.Length)) +
geom_bar(aes(y = ..count../sum(..count..))) +
scale_y_continuous(name = "%", labels=scales::percent)
Run Code Online (Sandbox Code Playgroud)
然后我们尝试向其添加一个 geom_density 并以某种方式使其正确缩放:
gg + geom_density()
Run Code Online (Sandbox Code Playgroud)
gg + geom_density(aes(y=..count..))
Run Code Online (Sandbox Code Playgroud)
gg + geom_density(aes(y=..scaled..))
Run Code Online (Sandbox Code Playgroud)
gg + geom_density(aes(y=..density..))
Run Code Online (Sandbox Code Playgroud)
和第一个一样。
gg + geom_density(aes(y = ..count../sum(..count..)))
Run Code Online (Sandbox Code Playgroud)
gg + geom_density(aes(y = ..count../n))
Run Code Online (Sandbox Code Playgroud)
似乎下降了大约 10 倍......
gg + geom_density(aes(y = ..count../n/10))
Run Code Online (Sandbox Code Playgroud)
与...一样:
gg + geom_density(aes(y …Run Code Online (Sandbox Code Playgroud) 我想将 ggplot 直方图(y 轴 = 计数)与经验密度曲线和正态密度曲线叠加。我试过:
library(ggplot2)
set.seed(1234)
v <- as_tibble(rnorm(1000, 10, 2.5))
ggplot(v, aes(x = value)) +
geom_histogram(aes(y = ..density..),
bins = 40, colour = "black", fill = "white") +
geom_line(aes(y = ..density.., color = 'Empirical'), stat = 'density') +
stat_function(fun = dnorm, aes(color = 'Normal'),
args = list(mean = 10, sd = 2.5)) +
scale_colour_manual(name = "Colors", values = c("red", "blue"))
Run Code Online (Sandbox Code Playgroud)
但这具有 y 尺度的密度,并且我希望频率作为 y 轴。
我的第二次试验生成了以频率(计数)为 y 轴但仅以经验密度为基础的图。
library(ggplot2)
set.seed(1234)
v <- as_tibble(rnorm(1000, 10, 2.5))
b <- …Run Code Online (Sandbox Code Playgroud) 我想为具有正态分布的名为“Dist”的向量绘制直方图,并用总体参数覆盖正态曲线。我在 stackoverflow 中找到了几篇关于同一主题的帖子,但没有找到我收到的错误消息。
plot1 <-ggplot(data = dist) +
geom_histogram(mapping = aes(x = dist), fill="steelblue", colour="black", binwidth = 1) +
ggtitle("Frequences")
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几件事来向先前的图添加正态曲线:
首先,将一个函数添加到直方图块代码中,并具有所需的值:
stat_function(fun = dnorm, args = list(mean = mu2, sd = sd2))
Run Code Online (Sandbox Code Playgroud)
但是这段代码不会向情节添加任何内容。结果是一样的,只是直方图。
而且,创建一条曲线并将其添加到绘图中。
#Create the curve data
x <- seq(8, 24, length.out=100)
y <- with(dist, data.frame(x = x, y = dnorm(x, mean(mu2), sd(sd2))))
#add the curve to the base plot
plot1 + geom_line(data = y, aes(x = x, y = y), color = "red")
Run Code Online (Sandbox Code Playgroud)
这给了我下一条错误消息:
删除了 100 行包含缺失值 …