使用 ggridges 在脊线图中绘制正态分布
Plotting normal distributions in a ridgeline plot with ggridges
我有点不好意思问这个问题,但我花了一天的大部分时间来寻找解决方案,但现在我...
我的目标是绘制几个正态分布的简单脊线图,这些正态分布是根据我数据中的给定均值和 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 的经验而言,在数据分析方面我不是一个完全的白痴,但我很想学习适当的可视化,但不幸的是我需要解决我的问题。
非常感谢您的帮助!
您需要使用实际分布值创建一个新数据框,然后按如下方式使用 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()
编辑 -- 添加了精确的理论答案。
下面是使用 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")
我有点不好意思问这个问题,但我花了一天的大部分时间来寻找解决方案,但现在我...
我的目标是绘制几个正态分布的简单脊线图,这些正态分布是根据我数据中的给定均值和 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 的经验而言,在数据分析方面我不是一个完全的白痴,但我很想学习适当的可视化,但不幸的是我需要解决我的问题。
非常感谢您的帮助!
您需要使用实际分布值创建一个新数据框,然后按如下方式使用 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()
编辑 -- 添加了精确的理论答案。
下面是使用 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")