【问题标题】:Generating multiple plots containing functions in ggplot2在ggplot2中生成多个包含函数的图
【发布时间】:2018-06-27 23:55:27
【问题描述】:

我正在尝试使用包 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用于生成正态分布曲线

【问题讨论】:

  • 我认为这个问题与绘图无关,而与您定义函数的方式有关。 dnorm_C 仅使用 x 作为参数,但它也使用 msd。您可能需要force 他们,但更好的做法是明确地传递它们 - 略读您的问题我不确定您要使用什么值(显然 R 也不确定)。关于这个主题的好读物是functional operators section of Advanced Rdnorm_one_sd_C 更糟糕,它使用了一个常量e,我在任何地方都没有看到它的定义。
  • @Gregor,感谢您的回复。我已经用dnorm_one_sd_C 更新了您遇到的问题。如果问题出在功能上,能否提供一个可行的示例,以便我解决我遇到的问题。
  • 问题不在于“你不解释 e 是什么”,问题是你的函数使用了像 emsd 这样没有通过的变量作为论据。我的建议是你应该将dnorm_one_sd_C &lt;- function(x) 重写为dnorm_one_sd_C &lt;- function(x, m, sd) 并将dnorm_one_sd_U &lt;- function(x) 重写为dnorm_one_sd_U &lt;- function(x, m, sd, e)。如果您想了解为什么这是一个问题并且需要此建议,请阅读我在第一条评论中发布的链接——这里解释得太复杂了。

标签: r plot ggplot2


【解决方案1】:

已解决

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

即:

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

【讨论】:

    猜你喜欢
    • 2015-07-10
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2017-03-03
    • 2012-07-15
    相关资源
    最近更新 更多