同一图上多个直方图的正态密度曲线
Normal density curves on multiple histograms on a same plot
我有一个数据框,例如:
sample1 <- seq(120,197, length.out = 60)
sample2 <- seq(113, 167, length.out = 60)
sample3 <- seq(90,180, length.out = 60)
sample4 <-seq(100, 160, length.out = 60)
df <- as.data.frame(cbind(sample1, sample2, sample3, sample4))
我现在需要为这四个变量创建直方图,使它们 共享相同的 y 轴 ,并且还需要叠加 正态密度曲线 在每个直方图上。 facet_wrap() 只要 y 轴相同就可以了。
今天早些时候,我以为我已经在论坛专家的指导下解决了这个问题,但后来意识到该解决方案只是覆盖了一条密度曲线,而不是正态分布曲线。我已经尝试了一些带有 ggplot 的选项以及基本绘图函数,但是当有多个变量时,对于单个变量来说似乎是一项简单的任务就不太可能实现了??
关于如何解决这个问题有什么想法吗?
谢谢
这是一种可能的方法,使用 tidyverse
library(tidyverse)
# example data
sample1 <- seq(120, 197, length.out = 60)
sample2 <- seq(113, 167, length.out = 60)
sample3 <- seq(90, 180, length.out = 60)
sample4 <- seq(100, 160, length.out = 60)
df <- data.frame(sample1, sample2, sample3, sample4)
# update your original dataframe to a nested dataframe by adding simulated values from normal distribution
df2 = df %>%
gather() %>% # reshape data
group_nest(key) %>% # for each key (i.e. sample)
mutate(norm = map(data, ~rnorm(10000, mean(.x$value), sd(.x$value)))) # simulate 10K observations from the corresponding normal distribution
ggplot()+
# plot histogram using info from nested column data (i.e. original observations)
geom_histogram(data = df2 %>% unnest(data), aes(value, fill=key, ..density..), alpha=0.3)+
# plot density using info from nested column norm (i.e. simulated normal observations)
geom_density(data = df2 %>% unnest(norm), aes(norm, col=key))+
# separate plots by key (i.e. sample)
facet_wrap(~key)
我有一个数据框,例如:
sample1 <- seq(120,197, length.out = 60)
sample2 <- seq(113, 167, length.out = 60)
sample3 <- seq(90,180, length.out = 60)
sample4 <-seq(100, 160, length.out = 60)
df <- as.data.frame(cbind(sample1, sample2, sample3, sample4))
我现在需要为这四个变量创建直方图,使它们 共享相同的 y 轴 ,并且还需要叠加 正态密度曲线 在每个直方图上。 facet_wrap() 只要 y 轴相同就可以了。
今天早些时候,我以为我已经在论坛专家的指导下解决了这个问题,但后来意识到该解决方案只是覆盖了一条密度曲线,而不是正态分布曲线。我已经尝试了一些带有 ggplot 的选项以及基本绘图函数,但是当有多个变量时,对于单个变量来说似乎是一项简单的任务就不太可能实现了??
关于如何解决这个问题有什么想法吗?
谢谢
这是一种可能的方法,使用 tidyverse
library(tidyverse)
# example data
sample1 <- seq(120, 197, length.out = 60)
sample2 <- seq(113, 167, length.out = 60)
sample3 <- seq(90, 180, length.out = 60)
sample4 <- seq(100, 160, length.out = 60)
df <- data.frame(sample1, sample2, sample3, sample4)
# update your original dataframe to a nested dataframe by adding simulated values from normal distribution
df2 = df %>%
gather() %>% # reshape data
group_nest(key) %>% # for each key (i.e. sample)
mutate(norm = map(data, ~rnorm(10000, mean(.x$value), sd(.x$value)))) # simulate 10K observations from the corresponding normal distribution
ggplot()+
# plot histogram using info from nested column data (i.e. original observations)
geom_histogram(data = df2 %>% unnest(data), aes(value, fill=key, ..density..), alpha=0.3)+
# plot density using info from nested column norm (i.e. simulated normal observations)
geom_density(data = df2 %>% unnest(norm), aes(norm, col=key))+
# separate plots by key (i.e. sample)
facet_wrap(~key)