在函数-ggplot 中将参数传递给构面网格
Passing argument to facet grid in function -ggplot
我正在尝试编写一个函数来在网格中绘制图形。我正在使用 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)
这会产生同样的错误。如果我删除小平面网格,两个功能代码 运行s 很好,虽然没有网格:-(
非常感谢帮助这个初学者。
古斯塔沃
你的问题是在你的函数中,ggplot 正在寻找变量名(x_axis
、y_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)
我正在尝试编写一个函数来在网格中绘制图形。我正在使用 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)
这会产生同样的错误。如果我删除小平面网格,两个功能代码 运行s 很好,虽然没有网格:-(
非常感谢帮助这个初学者。
古斯塔沃
你的问题是在你的函数中,ggplot 正在寻找变量名(x_axis
、y_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)