在具有ggridges的山脊线图中绘制正态分布

时间:2019-06-04 13:51:41

标签: r ggplot2 ggridges

问这个问题让我有些尴尬,但是我花了大部分时间在寻找解决方案,但是我在这里...

我想要的是几个正态分布的简单脊线图,这些分布是根据数据中的给定均值和标准差计算得出的,例如以下示例:

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方面的经验而言,在数据分析方面我并不是一个完全的白痴,但是我渴望学习适当的可视化,但不幸的是,我需要解决我的问题的方法。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

这是使用 Process ( T ) begin If ( T(0)='1' )Then AR <= PC; End If ; end process; process ( T ) begin If ( T(1)='1' )Then IR<=Data; PC<=PC+1; End If ; End process; process ( T ) begin If ( T(2)='1' )Then I<=IR(15); AR<=IR( 11 downto 0 ); End If ; End Process ; 来构造符合那些规格的精确法线的一种方法:

dnorm

enter image description here


类似于sada93的答案,使用dplyr和tidyr:

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)

enter image description here

样本数据:

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()

答案 1 :(得分:0)

您需要使用实际分布值创建一个新的数据框,然后按以下方式使用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()