簡體   English   中英

根據 ggplot2 標准功能創建 ggplot2 函數並將參數指定為數據中的變量

[英]Create ggplot2 function and specify arguments as variables in data as per ggplot2 standard functionality

我想創建一個繪圖函數,在其中指定數據集,並以與我在ggplot2中類似的方式將繪圖參數指定為函數參數,即我們在沒有數據集的情況下指定變量名稱,例如hp而不是mtcars$hp

例如:

ggfun <- function(dat, x.var, y.var){

  ggp <- ggplot(data = dat,
                aes(x = x.var,
                    y = y.var)) +
    geom_point()

  return(ggp)
}


ggfun(dat = mtcars, x.var = drat, y.var = hp)

將返回: 精彩的情節

但是它返回:

> ggfun(dat = mtcars, x.var = drat, y.var = hp)
Error in eval(expr, envir, enclos) : object 'drat' not found
In addition: Warning message:
In eval(expr, envir, enclos) : restarting interrupted promise evaluation

我知道使用aes_string而不是aes有效,例如:

ggfun <- function(dat, x.var, y.var){

  ggp <- ggplot(data = dat,
                aes_string(x = x.var,
                    y = y.var)) +
    geom_point()

  return(ggp)
}

ggfun(dat = mtcars, x.var = "drat", y.var = "hp")

但我寧願避免使用字符串形式。

其他嘗試包括ggfun(dat = mtcars, x.var = mtcars$drat, y.var = mtcars$hp) ,它返回正確的圖形但部分違背了練習的目的,並產生標簽“x.var”和“ y.var" 而不是 "drat" 和 "hp"。

任何已知且相當簡單的解決方法?

使用ggplot2的開發版本,我們可以傳遞不帶引號的參數,將其轉換為quosure (使用enquo )並評估它( !!

ggfun <- function(dat, x.var, y.var){
  x.var <- enquo(x.var)
  y.var <- enquo(y.var)
  ggp <- ggplot(data = dat,
                aes(x = !! x.var,
                    y = !! y.var)) +
    geom_point()

  return(ggp)
}

ggfun(dat = mtcars, x.var = drat, y.var = hp)

對於帶引號的字符串,使用sym (來自rlang )將其轉換為符號並進行評估

ggfun <- function(dat, x.var, y.var){
  x.var <- rlang::sym(x.var)
  y.var <- rlang::sym(y.var)
  ggp <- ggplot(data = dat,
                aes(x = !! x.var,
                    y = !! y.var)) +
    geom_point()

  return(ggp)
}

ggfun(dat = mtcars, x.var = "drat", y.var = "hp")

在此處輸入圖像描述


如果我們想傳遞帶引號的或不帶引號的,則將 quosure 更改為字符 ( quo_name ),然后更改為符號 ( sym ) 並評估 ( !! )

ggfun <- function(dat, x.var, y.var){
  x.var <- rlang::sym(quo_name(enquo(x.var)))
  y.var <- rlang::sym(quo_name(enquo(y.var)))
  ggp <- ggplot(data = dat,
                aes(x = !! x.var,
                    y = !! y.var)) +
    geom_point()

  return(ggp)
}

p1 <- ggfun(dat = mtcars, x.var = drat, y.var = hp)
p2 <- ggfun(dat = mtcars, x.var = "drat", y.var = "hp")

all.equal(p1, p2)
#[1] TRUE

rlang 0.4.0 (2019-06-25) 開始,現在有擁抱運算符{{}} 使用擁抱運算符:

library(ggplot2)
data("mtcars")

該運算符同時使用函數參數中的列名和標簽。

scatter_plot <- function(data, x, y, title) {
  ggplot(data, aes({{x}}, {{y}})) +
    geom_point()+
    labs(title= {{title}})
}
scatter_plot(mtcars, drat, hp, "Drat by HP")

可以像往常一樣使用+進一步自定義繪圖。

scatter_plot(mtcars, drat, hp, "Drat by HP with trend") +
  geom_smooth()

其他資源

  • 這篇文章是我遇到該方法的地方。
  • 這個 SO答案提供了一些額外的非常相似的例子,它們使用dplyr和表格進行整潔評估。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM