使用 ggplot2 在直方图上绘制正态曲线:代码在 0 处生成直线
Plotting normal curve over histogram using ggplot2: Code produces straight line at 0
这个论坛已经对我生成代码提供了很多帮助,我希望它 return 一个特定变量的直方图叠加在其经验正态曲线上。我使用 ggplot2 和 stat_function 来编写代码。
不幸的是,代码生成了一个具有正确直方图的图,但正态曲线是零点的直线(以下代码生成的图中的红线)。
对于这个最小的示例,我使用了 mtcars 数据集 - 在我的原始数据集中观察到了 ggplot 和 stat_function 相同的行为。
这是编写并使用的代码:
library(ggplot2)
mtcars
hist_staff <- ggplot(mtcars, aes(x = mtcars$mpg)) +
geom_histogram(binwidth = 2, colour = "black", aes(fill = ..count..)) +
scale_fill_gradient("Count", low = "#DCDCDC", high = "#7C7C7C") +
stat_function(fun = dnorm, colour = "red")
print(hist_staff)
我也试过指定 dnorm:
stat_function(fun = dnorm(mtcars$mpg, mean = mean(mtcars$mpg), sd = sd(mtcars$mpg))
这也没有解决 - 一条错误消息 returned 指出参数不是数字。
希望大家帮帮我!非常感谢!
最好的,Jannik
你的曲线和直方图在不同的 y 尺度上,你没有查看 stat_function
上的帮助页面,否则你会把参数放在 list
中,因为它清楚地显示了在这个例子中。您在最初的 ggplot
调用中也没有正确执行 aes
。我真诚地建议多学习教程和书籍(或者至少是帮助页面),而不是在 SO 上零碎地学习 ggplot。
解决 stat_function
arg 问题和 ggplot``aes
问题后,您需要解决 y 轴比例差异问题。为此,您需要切换直方图的 y 以使用来自底层 stat_bin
计算数据框的密度:
library(ggplot2)
gg <- ggplot(mtcars, aes(x=mpg))
gg <- gg + geom_histogram(binwidth=2, colour="black",
aes(y=..density.., fill=..count..))
gg <- gg + scale_fill_gradient("Count", low="#DCDCDC", high="#7C7C7C")
gg <- gg + stat_function(fun=dnorm,
color="red",
args=list(mean=mean(mtcars$mpg),
sd=sd(mtcars$mpg)))
gg
这个论坛已经对我生成代码提供了很多帮助,我希望它 return 一个特定变量的直方图叠加在其经验正态曲线上。我使用 ggplot2 和 stat_function 来编写代码。 不幸的是,代码生成了一个具有正确直方图的图,但正态曲线是零点的直线(以下代码生成的图中的红线)。
对于这个最小的示例,我使用了 mtcars 数据集 - 在我的原始数据集中观察到了 ggplot 和 stat_function 相同的行为。
这是编写并使用的代码:
library(ggplot2)
mtcars
hist_staff <- ggplot(mtcars, aes(x = mtcars$mpg)) +
geom_histogram(binwidth = 2, colour = "black", aes(fill = ..count..)) +
scale_fill_gradient("Count", low = "#DCDCDC", high = "#7C7C7C") +
stat_function(fun = dnorm, colour = "red")
print(hist_staff)
我也试过指定 dnorm:
stat_function(fun = dnorm(mtcars$mpg, mean = mean(mtcars$mpg), sd = sd(mtcars$mpg))
这也没有解决 - 一条错误消息 returned 指出参数不是数字。
希望大家帮帮我!非常感谢!
最好的,Jannik
你的曲线和直方图在不同的 y 尺度上,你没有查看 stat_function
上的帮助页面,否则你会把参数放在 list
中,因为它清楚地显示了在这个例子中。您在最初的 ggplot
调用中也没有正确执行 aes
。我真诚地建议多学习教程和书籍(或者至少是帮助页面),而不是在 SO 上零碎地学习 ggplot。
解决 stat_function
arg 问题和 ggplot``aes
问题后,您需要解决 y 轴比例差异问题。为此,您需要切换直方图的 y 以使用来自底层 stat_bin
计算数据框的密度:
library(ggplot2)
gg <- ggplot(mtcars, aes(x=mpg))
gg <- gg + geom_histogram(binwidth=2, colour="black",
aes(y=..density.., fill=..count..))
gg <- gg + scale_fill_gradient("Count", low="#DCDCDC", high="#7C7C7C")
gg <- gg + stat_function(fun=dnorm,
color="red",
args=list(mean=mean(mtcars$mpg),
sd=sd(mtcars$mpg)))
gg