【问题标题】:ggplot: adding normal distribution curve using stat_function to existing histogram and distribution layersggplot:使用 stat_function 将正态分布曲线添加到现有的直方图和分布层
【发布时间】:2016-08-03 01:20:59
【问题描述】:

我需要完成的任务: 1. 绘制 x=data/y=density histogram - 完成 2. 绘制给定数据集的分布曲线 - 完成 3. 为这个数据集绘制完美的正态分布曲线(红线) - 问题 我假设问题出在 2nd stat_function 中。

代码无需任何准备即可运行:

data <- data.frame(c(runif(30,1,50)),c(runif(30,50,1)))
g.data <- data[,1]

graph <- ggplot(data, aes(g.data))
graph <- graph +
geom_histogram(aes(y = ..density..), binwidth = 2, fill = 'pink') +
labs(x = 'Data', y ='Density') +
stat_function(fun = dnorm, args = list(mean = mean(g.data, na.rm = T),
sd = sd(g.data, na.rm =T)), colour ='black', size =1) +
theme(legend.position = 'none') +
stat_function(fun = dnorm, colour = "red", args = list(mean = mean(g.data)))
graph

这是我得到的

这是我大约需要的,完美的规范。分布

【问题讨论】:

  • 我会说第一张图中的红色曲线是正常密度,平均值约为 22,sd = 1。你得到了你想要的。目前还不清楚您还需要什么。
  • 这是一个很好的观点,锋利的边缘让我有点困惑。将两条曲线转换为均值 = 0 的 z-score-way 可能更有意义,那么两条曲线之间的差异会更加清晰。
  • dataframe的第二部分不需要,c(runif(30,50,1))),它创建了NaN的列

标签: r ggplot2 distribution


【解决方案1】:

正态分布有 2 个参数:均值和标准差。在这里,您仅提供 dnorm 的平均值,因此假定为 sd = 1

您提供的代码的更正版本是:

data <- data.frame(c(runif(30,1,50)))
ggplot(data, aes(data[,1])) +
    geom_histogram(aes(y = ..density..), binwidth = 2, fill = 'pink') +
    labs(x = 'Data', y = 'Density') +
    stat_function(fun = dnorm, 
        args = list(mean = mean(data[,1], na.rm = TRUE), 
                    sd = sd(data[,1], na.rm = TRUE)), 
        colour = 'black', size = 1) 

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 2016-09-16
    • 2017-03-02
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多