r-使用ggplot2,aes_string和重新排序使绘图功能

时间:2018-12-07 19:52:50

标签: r function ggplot2 dplyr

我正在尝试创建一个函数,该函数将在内部使用 // Execute validation rules foreach ($this->_field_data as $field => &$row) { // Don't try to validate if we have no rules set if (empty($row['rules'])) { continue; } $this->_execute($row, $row['rules'], $row['postdata']); // here is the modification if(count($this->_error_array) > 0) return true; // error found } ggplot2aes_string,但到目前为止还没有运气。

基本上,如果我们有一个像下面这样的样本数据集:

reorder

我希望函数接受以下参数:数据集,一个过滤变量和两个用于绘制的变量。

这是我设法做到的:

library(ggplot2)
library(dplyr)

set.seed(123)
dt <- data.frame(
          id = c(1,1,1,2,2),
          a = c("b", "d", "c", "a", "b"),
          b = sample(1:10, 5, replace = F),
          cat = c(1,1,2,2,2)) %>%
    mutate(a = as.factor(a)) %>% 
    as_tibble()

不幸的是,运行它时返回错误:

myplot <- function(df, filtval, var1, var2) {
    data <- df %>% filter(id == filtval)

    ggplot(data) + 
        geom_point(
            aes_string(
                x = reorder(var1, var2),
                y = var2)
    )
}

这是我希望函数执行的操作:

myplot(dt, 1, "a", "b")
Warning message:
    In mean.default(X[[i]], ...) :
    argument is not numeric or logical: returning NA

2 个答案:

答案 0 :(得分:3)

对于最新版本的ggplot,应将aes!!sym()结合使用,以将字符串转换为符号。

myplot <- function(df, filtval, var1, var2) {
  data <- df %>% filter(id == filtval)

  ggplot(data) + 
    geom_point(
      aes(
        x = reorder(!!sym(var1), !!sym(var2)),
        y = !!sym(var2))
    )
}

答案 1 :(得分:1)

与Flick先生(见下文)讨论后,不应使用此方法:

myplot <- function(df, filtval, var1, var2) {
  data <- df %>% filter(id == filtval)
  data$new_order <- reorder(data[[var1]], data[[var2]])

  ggplot(data) + 
    geom_point(mapping=
      aes_string(
        x = "new_order",
        y = var2)
    )
}

取而代之的是:)