【问题标题】:How to use quosure in ggplot to generate plotting function如何在ggplot中使用quosure生成绘图功能
【发布时间】:2019-12-14 06:48:30
【问题描述】:

我有一个数据集,我需要根据不同的列生成多个图,所以我尝试编写一个函数,而不是复制/粘贴,我在其中将数据框和列名传递给函数。我很确定这需要一个 quosure,但我似乎无法让它在 ggplot2 中工作。

理想情况下,我将能够传递数据框、RawData 和列名(在本例中为 B),它会使用 B 列生成条形图,并在图上包含 B 列标签。例如。

RawData = data.frame(A = runif(12, 0, 5), B = LETTERS[seq(1,4)], C = letters[seq(3,1)])

ggplot(RawData, aes(x=A,y=B))+
  geom_bar(stat="identity",position="dodge")+
  xlab("Group")+ylab("B")

我写的函数实际上是这个......

PlotFn  = function(df, VarName) {
  VarName = quo(VarName)
  ggplot(df, aes(x=A,y=!!VarName))+
  geom_bar(stat="identity",position="dodge")+
  xlab("Group")+ylab(as_label(!!VarName))
}

PlotFn(RawData, B)

哪个会引发错误:

错误:只能在 quasiquotation 上下文中取消引用。

# 不好: 列表(!!myquosure)

# 好: dplyr::mutate(data, !!myquosure)

理想情况下,我可以让我的绘图功能运行

PlotFn(RawData, B)

PlotFn(RawData, C)

并给出适当标记的条形图,就像这里的那样。

【问题讨论】:

标签: r ggplot2 dplyr


【解决方案1】:

您无需取消引用 (!!) VarName

library(rlang)
library(tidyverse)

RawData = data.frame(A = runif(12, 0, 5), 
                     B = LETTERS[seq(1,4)], 
                     C = letters[seq(3,1)])

PlotFn <- function(df, .VarName) {
  VarName <- enquo(.VarName)
  ggplot(df, aes(x = A, y = !!VarName)) +
    geom_bar(stat = "identity", position = "dodge") +
    ylab(as_label(VarName)) +
    xlab("Group")
}
PlotFn(RawData, C)

我个人更喜欢.data[[]]这样的

PlotFn2 <- function(df, .VarName) {
  ggplot(df, aes(x = A, y = .data[[.VarName]])) +
    geom_col(position = "dodge") +
    ylab(.VarName) +
    xlab("Group")
}

plot_list <- c("B", "C") %>% 
  map(~ PlotFn2(RawData, .x))
plot_list
#> [[1]]

#> 
#> [[2]]

reprex package (v0.3.0) 于 2019 年 8 月 6 日创建

【讨论】:

  • 另一个option 您可以添加到您的答案中是PlotFn &lt;- function(df, .VarName) { ggplot(df, aes(x = A, y = {{ .VarName. }})) }
  • @TimTeaFan:谢谢提醒!我一直忘记rlang的新功能
  • @Tung,谢谢,这很令人困惑,不知怎的,我无法让它按照我想象的方式进行。您使用 rlang 说 .VarName 对吗?我只是尝试使用PlotFn = function(df, VarName) { VarName = enquo(VarName) ggplot(df, aes(x=A,y=!!VarName))+ geom_bar(stat="identity",position="dodge")+ xlab("Group")+ylab(as_label(VarName)) } 运行,它可以工作,但不需要 rlang,我说对了吗?
  • @EBrewe:不,你不需要rlang。仅当您使用 curly-curly {{ }} 作为上面提到的 TimTeaFan 时才需要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多