使用dplyr / ggplot

时间:2018-05-31 02:10:11

标签: r function ggplot2 parameter-passing

我经常发现编写使用数据集的不同子集创建绘图的函数很有用。例如,获取以下数据:

id <- seq(1:640)
con1 <- rep(c('hi', 'lo'), each = 320, times = 1)
con2 <- rep(c('up', 'down'), each = 160, times = 2)
con3 <- rep(c('fork', 'knife'), each = 80, times = 4)
con4 <- rep(c('carrot', 'broccoli'), each = 40, times = 8)
likert <- sample(c(1:5), 640, replace = T)

dat <- as.data.frame(cbind(id, con1, con2, con3, con4, likert))

我想有一个函数可以为我指定的con1:4变量的任意组合创建一个facetted图。我想要的简化版本如下:

groupVar <- 'con1'

plotFunction <- function(groupVar) {

  plot <- ggplot(data = dat) +
    geom_bar(aes(x = factor(likert))) +
    facet_wrap(~eval(parse(text = groupVar))) +
    ggtitle(paste('Preferences grouped by ',groupVar)) + 
    theme_bw()

  return(plot)

}

plotFunction(groupVar = groupVar)

这适用于传递单个变量,但不适用于我想绘制交互的情况。例如,将groupVar设置为&#39; con1 * con2&#39;不会产生所需的结果 - 即,我将从手动指定

得到的图
facet_wrap(~con1*con2)

我理解(毫无疑问,在一个相当肤浅的层面上)为什么这不起作用,但是我们无法找到解决方案。我的解决方法是为每个交互创建新的变量,这样我就可以将交互作为单个变量传递给facet_wrap - 例如con1 * con2交互:

dat <- dat %>%
  mutate(con1_con2 = paste(con1, con2, sep = '_'))

groupVar <- 'con1_con2'

plotFunction(groupVar = groupVar) 

给出了期望的结果。

如果我能通过groupVar变量(或其他方法)将交互传递给函数,我将不胜感激,因此无需创建新变量。

1 个答案:

答案 0 :(得分:2)

您可以使用字符向量参数语法而不是~公式语法(docs):

groupVar <- c('con1','con2')

plotFunction <- function(groupVar) {

  plot <- ggplot(data = dat) +
    geom_bar(aes(x = factor(likert))) +
    facet_wrap(groupVar) +
    ggtitle(paste('Preferences grouped by ', paste0(groupVar, collapse="*"))) + 
    theme_bw()

  return(plot)

}

plotFunction(groupVar = groupVar)

enter image description here

请记住同时更新ggtitle粘贴命令。