Передача аргумента в сетку фасетов в функции -ggplot - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь написать функцию для построения графиков в сетке.Я использую ggplot и фасетную сетку.Я не могу передать аргумент для сетки фасетов.Интересно, кто-нибудь может указать мне правильное направление?

Пример данных:

 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 и fill, но не для сетки.

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)

Это приводит к той же ошибке.Если я удаляю сетку фасетов, код обеих функций работает хорошо, но без сетки: - (

Большое спасибо за помощь этому новичку.

Густаво

1 Ответ

0 голосов
/ 11 октября 2018

Ваша проблема в том, что в вашей функции 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)
...