R语言 创建两个分布,每个分布具有不同颜色的不同部分

mgdq6dx1  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(102)

我试图在R中绘制一个类似于G*Power生成的图:
x1c 0d1x的数据
其中,当H0 >= 2时,左侧分布H0被着色为红色,而当H1 < 2时,右侧分布被着色为蓝色。
通过以下方式生成数据:

install.packages("bayestestR")
mean1 <- 0
sd1 <- 1
data1 <- bayestestR::rnorm_perfect(n = 1000, mean1, sd1)

df.data1 <- data.frame(x = data1) %>% mutate(y = dnorm(x))
df.data1$dist <- "H0"

mean2 <- 2.5
sd2 <- 1
data2 <- bayestestR::rnorm_perfect(n = 1000, mean2, sd2)

df.data2 <- data.frame(x = data2) %>% mutate(y = dnorm(x))
df.data2$dist <- "H1"

df.both <- rbind(df.data1, df.data2)

字符串
下面的代码可以生成第一个目标:

ggplot(df.both, aes(x = x, fill = dist)) +
  geom_density(alpha = 0.5) +
  geom_ribbon(data = subset(df.both, dist == "H0"), aes(ymin = 0, ymax = ifelse(x >= 2, y, 0)), fill = "pink", alpha = 0.5) +
  geom_ribbon(data = subset(df.both, dist == "H0"), aes(ymin = 0, ymax = ifelse(x >= 2, y, 0)), fill = "red", alpha = 0.5) +
  labs(x = "x", fill = "Distribution") +
  scale_fill_manual(values = c("H0" = "pink", "H1" = "lightblue")) +
  theme_minimal()



但我能得到的最接近第二个的是通过:

ggplot(df.both, aes(x = x, fill = dist)) +
  geom_density(alpha = 0.5) +
  geom_ribbon(data = subset(df.both, dist == "H1"), aes(ymin = 0, ymax = ifelse(x <= 2, y, 0)), fill = "blue", alpha = 0.5) +
  geom_ribbon(data = subset(df.both, dist == "H1"), aes(ymin = 0, ymax = ifelse(x <= 2, y, 0)), fill = "lightblue", alpha = 0.5) +
  labs(x = "x", fill = "Distribution") +
  scale_fill_manual(values = c("H0" = "pink", "H1" = "lightblue")) +
  theme_minimal()

其中,不正确地,右手边的H1在与左手边的H0重叠的部分之外没有被涂成蓝色,但是在同一条带中,H0被不正确地涂成蓝色。
我不需要使用ggplot2(见鬼,在这一点上,我将使用蜡笔和餐巾纸)-只是一些清晰和可复制的东西。This使用ggplot::stat_function看起来很有希望,但我一直无法弄清楚如何在其他位置(例如,其中平均值= 2.5)创建其他正态分布。
先谢谢你。

sshcrbum

sshcrbum1#

下面是使用stat_function的开始:

library(ggplot2)
ggplot(data.frame(X=c(-3,6)), aes(x=X)) +
  stat_function(fun = \(x) dnorm(x, 0, 1), aes(fill = "H[0]"), geom = "area", alpha = 0.5) + 
  stat_function(fun = \(x) dnorm(x-2.5, 0, 1), aes(fill = "H[1]"), geom = "area", alpha = 0.5) + 
  stat_function(fun = \(x) {y <- dnorm(x, 0, 1); y[x < 2] <- 0; y;}, aes(fill = "quux"), geom = "area")

字符串


的数据
尽管有特殊的颜色和标签。
初始data.frame(X=c(-3,6))的使用主要用于定义图的域(x的范围)。

ekqde3dh

ekqde3dh2#

使用stat_function

ggplot(data.frame(X=c(-3,6)), aes(x=X)) + 
  stat_function(fun = ~dnorm(.x,0, 1), col='red')+ 
  stat_function(fun = ~dnorm(.x, 0, 1)*(.x >= 2), fill='red', 
                geom = 'polygon', n=1000, alpha = 0.5)+ 
  stat_function(fun = ~dnorm(.x,2.5, 1), col='blue')+
  stat_function(fun = ~dnorm(.x, 2.5, 1)*(.x < 2), fill='blue',
                geom = 'polygon', alpha=0.4, n = 1000)

字符串


的数据
使用geom_function + geom_polygon

ggplot(data.frame(X=c(-3,6)), aes(x=X)) + 
  geom_function(fun = ~dnorm(.x,0, 1), col='red')+
  geom_polygon(fun = ~dnorm(.x, 0, 1)*(.x >= 2), fill='red',
               stat = 'function',n=1000, alpha = 0.5) + 
  geom_function(fun = ~dnorm(.x,2.5, 1), col='blue') +
  geom_polygon(fun = ~dnorm(.x, 2.5, 1)*(.x < 2), fill='blue',
               stat = 'function', alpha=0.4, n = 1000)



请注意,您可以单独使用polygonggplot函数是非常相关的。一个人可以用多种方法解决同一个问题

ggplot(data.frame(X=c(-3,6)), aes(x=X)) + 
  geom_polygon(fun = ~dnorm(.x,0, 1), col='red',
               stat = 'function', fill = 'grey93')+
  geom_polygon(fun = ~dnorm(.x, 0, 1)*(.x >= 2), fill='red',
               stat = 'function',n=1000, alpha = 0.5) + 
  geom_polygon(fun = ~dnorm(.x,2.5, 1), col='red',
               stat = 'function', fill = 'grey93')+
  geom_polygon(fun = ~dnorm(.x, 2.5, 1)*(.x < 2), fill='blue',
               stat = 'function', alpha=0.4, n = 1000)

相关问题