首页 > 解决方案 > 在ggplot2中生成多个包含函数的图

问题描述

我正在尝试使用 ggplot2 和 ggpubr 包在 R 中制作复合图。除了每个图都有特定于该数据集的正态分布曲线外,我在制作复合图时没有问题。当我生成复合图时,两个图都具有相同的曲线,即最后一个数据集的曲线。

如何生成复合图,每个图都有自己的特定正态分布曲线?

代码和输出图

## PLOT 1 ##

results_matrix_C <- data.frame(matrix(rnorm(20), nrow=20))
colnames(results_matrix_C) <- c("X")

m <- mean(results_matrix_C$X)
sd <- sd(results_matrix_C$X)
dnorm_C <- function(x){
  norm_C <- dnorm(x, m, sd)
  return(norm_C)
}

e = 1
dnorm_one_sd_C <- function(x){
  norm_one_sd_C <- dnorm(x, m, sd)
  # Have NA values outside interval x in [e]:
  norm_one_sd_C[x <= e] <- NA
  return(norm_one_sd_C)
}


C <- ggplot(results_matrix_C, aes(x = results_matrix_C$X)) +
  geom_histogram(aes(y=..density..), bins = 10, colour = "black", fill = "white") +
  stat_function(fun = dnorm_one_sd_C, geom = "area", fill = "#CE9A05", color = "#CE9A05", alpha = 0.25, size = 1) +
  stat_function(fun = dnorm_C, colour = "#CE0539", size = 1) +
  theme_classic()

在此处输入图像描述

## PLOT 2 ##

results_matrix_U <- data.frame(matrix(rnorm(20)+1, nrow=20))
colnames(results_matrix_U) <- c("X")

m <- mean(results_matrix_U$X)
sd <- sd(results_matrix_U$X)
dnorm_U <- function(x){
  norm_U <- dnorm(x, m, sd)
  return(norm_U)
}

e = 2
dnorm_one_sd_U <- function(x){
  norm_one_sd_U <- dnorm(x, m, sd)
  # Have NA values outside interval x in [e]:
  norm_one_sd_U[x <= e] <- NA
  return(norm_one_sd_U)
}


U <- ggplot(results_matrix_U, aes(x = results_matrix_U$X)) +
  geom_histogram(aes(y=..density..), bins = 10, colour = "black", fill = "white") +
  stat_function(fun = dnorm_one_sd_U, geom = "area", fill = "#CE9A05", color = "#CE9A05", alpha = 0.25, size = 1) +
  stat_function(fun = dnorm_U, colour = "#CE0539", size = 1) +
  theme_classic()

在此处输入图像描述

library(ggpubr)

ggarrange(C, U,
          nrow = 1, ncol = 2)

在此处输入图像描述

正如您在复合图中看到的那样,第一个图采用了第二个图的正态分布曲线,而不是我的初始图(图 1)中的正态分布曲线。

更新

变量“e”是指与分布曲线相关的阴影区域。m = 数据集的平均值 sd = 数据集的标准差 m 和 sd 用于生成正态分布曲线

标签: rplotggplot2

解决方案


解决了

通过将函数完全插入 ggplot2 代码的 stat_function 部分,这已经奏效

IE:

## PLOT 1 ##

results_matrix_C <- data.frame(matrix(rnorm(20), nrow=20))
colnames(results_matrix_C) <- c("X")

mean <- mean(results_matrix_C$X)
sd <- sd(results_matrix_C$X)
e = 1


C <- ggplot(results_matrix_C, aes(x = results_matrix_C$X)) +
  geom_histogram(aes(y=..density..), bins = 10, colour = "black", fill = "white") +
  stat_function( 
    fun = function(x, mean, sd, e){ 
      norm_one_sd_C <- dnorm(x, mean, sd)
      norm_one_sd_C[x <= e] <- NA
  return(norm_one_sd_C)}, 
    args = c(mean = mean, sd = sd, e = e), geom = "area", fill = "#CE9A05", color = "#CE9A05", alpha = 0.25, size = 1) +
  stat_function( 
    fun = function(x, mean, sd){ 
      dnorm(x = x, mean = mean, sd = sd)}, 
    args = c(mean = mean, sd = sd), colour = "#CE0539", size = 1) +
  theme_classic()

在此处输入图像描述

## PLOT 2 ##

results_matrix_U <- data.frame(matrix(rnorm(20)+1, nrow=20))
colnames(results_matrix_U) <- c("X")

mean <- mean(results_matrix_U$X)
sd <- sd(results_matrix_U$X)
e = 2


U <- ggplot(results_matrix_U, aes(x = results_matrix_U$X)) +
  geom_histogram(aes(y=..density..), bins = 10, colour = "black", fill = "white") +
  stat_function( 
    fun = function(x, mean, sd, e){ 
      norm_one_sd_U <- dnorm(x, mean, sd)
      norm_one_sd_U[x <= e] <- NA
  return(norm_one_sd_U)}, 
    args = c(mean = mean, sd = sd, e = e), geom = "area", fill = "#CE9A05", color = "#CE9A05", alpha = 0.25, size = 1) +
  stat_function( 
    fun = function(x, mean, sd){ 
      dnorm(x = x, mean = mean, sd = sd)}, 
    args = c(mean = mean, sd = sd), colour = "#CE0539", size = 1) +
  theme_classic()

在此处输入图像描述

library(ggpubr)

ggarrange(C, U,
          nrow = 1, ncol = 2)

在此处输入图像描述


推荐阅读