r - 使用 ggplot2、aes_string 和重新排序制作绘图功能

adl*_*adl 2 r function ggplot2 dplyr

我试图让将要使用的功能ggplot2中,aes_stringreorder但至今没有运气。

基本上,如果我们有一个如下所示的示例数据集:

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()
Run Code Online (Sandbox Code Playgroud)

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

这就是我设法做的:

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

    ggplot(data) + 
        geom_point(
            aes_string(
                x = reorder(var1, var2),
                y = var2)
    )
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

data <- dt %>% filter(id == 1)
ggplot(data) + 
    geom_col(aes(x = reorder(a, - b), y = b))
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 6

使用最新版本的 ggplot,您应该使用aeswith!!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))
    )
}
Run Code Online (Sandbox Code Playgroud)

  • 但重新排序纯粹是一种视觉偏好。没有理由只为情节更新数据。创建其他一些随机列对我来说没有多大意义。但实际上两种方式都有效,所以这是个人喜好。此外,Hadley 已宣布打算 [从长远来看弃用 `aes_string`](https://www.tidyverse.org/articles/2018/07/ggplot2-tidy-evaluation/)。 (2认同)