r - 将参数传递给函数 -ggplot 中的刻面网格

标签 r function ggplot2 facet facet-grid

我正在尝试编写一个函数来在网格中绘制图形。我正在使用 ggplot 和 facet 网格。我无法传递小平面网格的参数。我想知道是否有人可以指出我正确的方向。

数据示例:

 Year = as.factor(rep(c("01", "02"), each = 4, times = 1))
 Group = as.factor(rep(c("G1", "G2"), each = 2, times = 2))
 Gender = as.factor(rep(c("Male", "Female"),   times = 4))
 Percentage = as.integer(c("80","20","50","50","45","55","15","85"))
 df1 = data.frame (Year, Group, Gender, Percentage)

没有函数的网格图的代码是:
p = ggplot(data=df1, aes(x=Year, y=Percentage, fill = Gender)) + geom_bar(stat = "identity")
p = p +  facet_grid(~ Group, scales = 'free')  
p

这会产生一个我想要做的情节。但是,当我将其放入函数时:
MyGridPlot <- function (df, x_axis, y_axis, bar_fill, fgrid){
p = ggplot(data=df1, aes(x=x_axis, y=y_axis, fill = bar_fill)) + geom_bar(stat = "identity")
p = p +  facet_grid(~ fgrid, scales = 'free')  
return(p)
}

然后运行:
MyGridPlot(df1, df1Year, df1$Percentage, df1$Gender, df1$Group)

它出现了错误:
Error: At least one layer must contain all faceting variables: `fgrid`.
* Plot is missing `fgrid`
* Layer 1 is missing `fgrid

我试过使用 aes_string ,它适用于 x、y 和填充,但不适用于网格。
MyGridPlot <- function (df, x_axis, y_axis, bar_fill, fgrid){
p = ggplot(data=df1, aes_string(x=x_axis, y=y_axis, fill = bar_fill)) + geom_bar(stat = "identity")
p = p +  facet_grid(~ fgrid, scales = 'free')  
return(p)
}

然后运行:
MyGridPlot(df1, Year, Percentage, Gender, Group)

这会产生相同的错误。如果我删除分面网格,两个函数代码都运行良好,但没有网格:-(

非常感谢帮助这位初学者。

古斯塔沃

最佳答案

您的问题是,在您的函数中,ggplot 正在寻找变量名( x_axisy_axis 等),但您给它的是对象( df1$year ...)。

有几种方法可以解决这个问题。也许最简单的方法是重写函数以使其期望对象。例如:

MyGridPlot <- function(x_axis, y_axis, bar_fill, fgrid){ # Note no df parameter here
  df1 <- data.frame(x_axis = x_axis, y_axis = y_axis, bar_fill = bar_fill, fgrid = fgrid) # Create a data frame from inputs
  p = ggplot(data=df1, aes(x=x_axis, y=y_axis, fill = bar_fill)) + geom_bar(stat = "identity")
  p = p +  facet_grid(~ fgrid, scales = 'free')  
  return(p)
}

MyGridPlot(Year, Percentage, Gender, Group)

或者,您可以使用数据框和变量名称设置函数。如果您以现在的方式处理单个对象,则没有太多理由这样做,但是如果您正在处理数据框,它可能会让您的生活更轻松:
MyGridPlot <- function(df, x_var, y_var, fill_var, grid_var){
  # Need to "tell" R to treat parameters as variable names.
  df <- df %>% mutate(x_var = UQ(enquo(x_var)), y_var = UQ(enquo(y_var)), fill_var = UQ(enquo(fill_var)), grid_var = UQ(enquo(grid_var)))

  p = ggplot(data = df, aes(x = x_var, y = y_var, fill = fill_var)) + geom_bar(stat = "identity")
  p = p +  facet_grid(~grid_var, scales = 'free')  
  return(p)
}

MyGridPlot(df1, Year, Percentage, Gender, Group)

关于r - 将参数传递给函数 -ggplot 中的刻面网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52761532/

相关文章:

r - 如何在多行 block 中将 sjt.df() 输出与 knitr 一起使用?

javascript - 从 1970 年之前的日期数组中获取最高日期

r - 相关性的错误视觉图表示

r - 将多个文本注释添加到多面 ggplot geom_histogram

r - R堆叠百分比条形图,带有二进制因子和标签的百分比(带ggplot)

r - 在 R 中监视对象的方法

r - rmarkdown block 中的条件 `echo`(或eval或include)

javascript - 无法通过.bind(JS)传递数据

c - 为什么我在引用来自不同函数的一行时会出现此编译器错误?

r - ggplot2 堆积条形图 : each bar is one colour, 堆积组使用 alpha 显示