我一直试图用ggplot 2在直方图上叠加一条正态曲线。
我的公式:
data <- read.csv (path...)
ggplot(data, aes(V2)) +
geom_histogram(alpha=0.3, fill='white', colour='black', binwidth=.04)
我尝试了几种方法:
+ stat_function(fun=dnorm)
......没有改变任何事情
+ stat_density(geom = "line", colour = "red")
...在x轴上显示了一条红色直线。
+ geom_density()
不适用于我,因为我希望将频率值保留在y轴上,并且不需要密度值。
有什么建议吗?
找到解决方案!
第一个月
5条答案
按热度按时间p1tboqfb1#
我想我明白了:
drkbr07n2#
这一问题已得到here和部分here的回答。
密度曲线下的面积等于1,直方图下的面积等于条形的宽度乘以其高度之和,即条柱宽度乘以非缺失观测值的总数。要在同一图形上拟合这两个数据,需要重新调整其中一个数据的比例以使其面积匹配。
如果希望y轴具有频率计数,则有许多选项:
首先模拟一些数据。
选项1:绘制直方图和密度曲线作为密度,然后重新调整y轴
这可能是绘制单个直方图最简单的方法。使用卡洛斯建议的方法,将直方图和密度曲线都绘制为密度
然后重新调整y轴。
选项2:使用stat_function重新缩放密度曲线
按照PatrickT的回答整理代码。
选项3:使用geom_line创建外部数据集和绘图。
与上面的选项不同,这个选项使用facets。(编辑后提供
dplyr
而不是基于plyr
的解决方案)注意,汇总的数据集被用作主要数据集,原始数据仅用于直方图。选项4:创建外部函数以动态编辑数据
也许有点过了头,但可能对某人有用?
6tdlim6h3#
这是对JWilliman的答案的扩展评论。我发现J的答案非常有用。在尝试的过程中,我发现了一种简化代码的方法。我不是说这是一种更好的方法,但我认为我应该提到它。
请注意,JWilliman的答案提供了y轴上的计数和"hack",以缩放相应的密度正态近似(否则将覆盖总面积1,因此具有低得多的峰值)。
此评论的要点:
stat_function
内部的语法更简单,通过将所需参数传递给美学函数,例如这避免了将
args =
传递给stat_function
,因此更加用户友好。好吧,这不是很不同,但希望有人会觉得有趣。bakd9h0s4#
这段代码应该可以做到:
注意:我使用的是qplot,但您可以使用功能更丰富的ggplot。
vuktfyat5#
以下是tidyverse的知情版本:
设置
一些数据
准备数据
我们将对整个样本使用"总计"直方图,为此,我们需要从数据中删除分组信息。
下面是一个包含汇总数据的数据集:
∮画出来∮