【问题标题】:Overlaying normal distribution plots叠加正态分布图
【发布时间】:2019-05-03 12:23:03
【问题描述】:

我有两条 ND 曲线要相互绘制 - 我该怎么做?

#meand and SDs of Gen 1 and 7

mean_gen1 <- 1.241
SD_gen1 <- 1.005
mean_gen7 <- 1.287 
SD_gen7 <- 1.386 

x_gen1 <- seq(-4, 4, length = 1000) * SD_gen1 + mean_gen1
 x_gen7 <- seq(-4, 4, length = 1000) * SD_gen7 + mean_gen7
 y_gen1 <- pnorm(x_gen1, mean_gen1, SD_gen1)
y_gen7 <- pnorm(x_gen7, mean_gen7, SD_gen7)

#plots

gen1_plot <- plot(x_gen1, y_gen1, type="n", xlab = "Height (Meters)", ylab = "", main = "Distribution of Pokemon Heights GEN1", axes = TRUE)+ lines(x_gen1, y_gen1)


gen7_plot <- plot(x_gen7, y_gen7, type="n", xlab = "Height (Meters)", ylab = "", main = "Distribution of Pokemon Heights GEN7", axes = TRUE)+ lines(x_gen7, y_gen7)

【问题讨论】:

    标签: r ggplot2 plot overlay normal-distribution


    【解决方案1】:

    我认为您的绘图不会保存在 gen1_plotgen7_plot 变量中。但一般的基本 R 绘图语法是将您的 gen7 plot() 调用替换为 lines(),如下所示:

    plot(x_gen1, y_gen1, type="l", 
         xlab = "Height (Meters)", 
         ylab = "", 
         main = "Distribution of Pokemon Heights", 
         axes = TRUE)
    lines(x_gen7, y_gen7, col = 2)
    

    看起来像这样:

    由于您的问题被标记为 ggplot2,我还将为 ggplot 提供一个选项:

    library(ggplot2)
    # Put all the data you have in one data.frame
    df <- data.frame(x = c(x_gen1, x_gen7),
                     y = c(y_gen1, y_gen7),
                     gen = rep(c("gen1", "gen7"), c(length(x_gen1), length(x_gen7))))
    
    # Plot away
    ggplot(df, aes(x, y, colour = gen)) +
      geom_line() +
      scale_x_continuous(name = "Height (Meters)") +
      ggtitle("Distribution of Pokemon Heights")
    

    看起来像这样:

    【讨论】:

    • 太好了 - 谢谢。我最终得到了一个正态分布图(钟形曲线) 我想在每个图中添加一条平均虚线 - 我试过 abline,但这并没有在每条曲线的末端停止,它只是继续图的顶部。有什么建议吗?
    • 我会去添加你想要的开始和结束 x 和 y 位置到一个新的 4 列 data.frame 并使用 + geom_segment(data = that_dataframe, aes(xstart, ystart, xend = xend, yend = yend), linetype = 2),用于 ggplot 版本。但不确定基本 R 版本。
    • 这两个图都适用吗,作为两条单独的线?
    • 是的,如果你愿意做类似that_dataframe = data.frame(xstart = c(mean_gen1, mean_gen7), ystart = 0, xend = c(mean_gen1, mean_gen7), yend = 0.5)) 的事情。但是您的第一篇文章中的方法彼此非常接近,因此它可能显示为 1 行,而实际上有 2 行。