【问题标题】:Plotting normal distributions in a ridgeline plot with ggridges使用 ggridges 在山脊线图中绘制正态分布
【发布时间】:2019-10-20 01:43:00
【问题描述】:

我有点不好意思问这个问题,但我花了一天的大部分时间试图找到解决方案,但是我在这里......

我的目标是绘制几个正态分布的简单脊线图,这些正态分布是根据我的数据中的给定均值和 SD 计算得出的,如下例所示:

case_number    caseMean    caseSD
case1          0           1
case2          1           2
case3          3           3

我发现的所有示例都使用了一系列测量,例如内布拉斯加州林肯的温度示例: Example of ridgeline plot https://cran.r-project.org/web/packages/ggridges/vignettes/introduction.html 我无法让他们工作。

就我使用 R 的经验而言,在数据分析方面我并不是一个完全的白痴,但我渴望学习适当的可视化,但不幸的是,我需要解决我的问题。

非常感谢您的帮助!

【问题讨论】:

    标签: r ggplot2 ggridges ridgeline-plot


    【解决方案1】:

    编辑——添加了精确的理论答案。

    这是一种使用dnorm 构造符合这些规范的精确正态曲线的方法:

    library(tidyverse); library(ggridges)
    n = 100
    df3 <- df %>%
      mutate(low  = caseMean - 3 * caseSD, high = caseMean + 3 * caseSD) %>%
      uncount(n, .id = "row") %>%
      mutate(x    = (1 - row/n) * low + row/n * high, 
             norm = dnorm(x, caseMean, caseSD))
    ggplot(df3, aes(x, case_number, height = norm)) +
      geom_ridgeline(scale = 3)
    


    类似于 Sada93 的回答,使用 dplyr 和 tidyr:

    library(tidyverse); library(ggridges)
    n = 50000
    df2 <- df %>% 
      uncount(n) %>%
      mutate(value = rnorm(n(), caseMean, caseSD))
    ggplot(df2, aes(x = value, y = case_number)) + geom_density_ridges()
    

    样本数据:

    df <- read.table(
      header = T, 
      stringsAsFactors = F,
      text = "case_number    caseMean    caseSD
    case1          0           1
    case2          1           2
    case3          3           3")
    

    【讨论】:

    • 这就是我所希望的一切,非常感谢你们!
    【解决方案2】:

    您需要使用实际分布值创建一个新的数据框,然后按如下方式使用 ggridges,

    library(ggplot2)
    library(ggridges)
    
    data = data.frame(case = c("case1","case2","case3"),caseMean = c(0,1,3),caseSD = c(1,2,3))
    
    #Create 100 rows for each mean and SD
    
    data_plot = data.frame(case = character(),value = numeric())
    n = 100
    for(i in 1:nrow(data)){
    
      case = data$case[i]
      mean = data$caseMean[i]
      sd = data$caseSD[i]
    
      val = rnorm(n,mean,sd)
    
      data_plot = rbind(data_plot,
                        data.frame(case = rep(case,n),
                                   value = val))
    }
    
    ggplot(data = data_plot,aes(x = value,y = case))+geom_density_ridges()
    
    

    【讨论】:

    • 非常感谢您的建议!对于我现在的需求,这已经足够了,尽管我必须为每个模拟正态分布的情况增加数据点的数量,这在我的旧机器上需要一些时间。也许有人有额外的建议,这就是我现在将其保留的原因。再次,非常感谢!
    猜你喜欢
    • 2019-07-28
    • 2020-10-08
    • 2016-08-03
    • 2019-11-04
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多