Dario
Dario

Reputation: 371

ggplot2 Variable Name with Spaces and tidyeval Syntax

I am trying to create a function which allows column names to be passed in by the user and I find that the resulting plot is simply one dot in the middle of screen. What needs to change for it to work as intended? My minimalist example is:

library(ggplot2)
weather <- data.frame(Month = month.name[1:5], `Low Temperature` = 20:16,
                      `High Temperature` = seq(30, 22, -2), check.names = FALSE)

xVariable <- "Month"
yVariable <- "High Temperature"
yVariable <- enquo(yVariable)
ggplot(weather, aes(x = xVariable, y = !!yVariable)) + geom_point()

Upvotes: 3

Views: 969

Answers (3)

Lionel Henry
Lionel Henry

Reputation: 6803

Note that enquo() is only for function arguments.

If you have column names as strings, use the .data pronoun:

fn <- function(data, x, y) {
  data %>%
    ggplot(aes(x = .data[[x]], y = .data[[y]])) +
    geom_point() 
}

x <- "disp"
y <- "drat"

fn(mtcars, x, y)

Upvotes: 4

norie
norie

Reputation: 9857

You could use aes_string instead of aes.

library(ggplot2)
weather <- data.frame(Month = month.name[1:5], `Low Temperature` = 20:16,
                      `High Temperature` = seq(30, 22, -2), check.names = FALSE)

xVariable <- "Month"
yVariable <- "`High Temperature`"

ggplot(weather, aes_string(x = xVariable, y = yVariable)) + geom_point()

enter image description here

Upvotes: 2

Kra.P
Kra.P

Reputation: 15123

Because it's quoted text, instead of enquo, use rlang::sym

xVariable <- "Month"
yVariable <- "High Temperature"
fun <- function(dat, xvar, yvar) {
  xvar <- rlang::sym(xvar)
  yvar <- rlang::sym(yvar)
  p1 <-dat %>%
    ggplot(aes(x = !!xvar, y = !!yvar)) +
    geom_point()
  return(p1)
  
}


fun(weather, xVariable, yVariable)

enter image description here

Upvotes: 3

Related Questions