【问题标题】:Combine with() and ggplot2结合()和ggplot2
【发布时间】:2020-03-27 22:06:34
【问题描述】:

我使用 base R 中的 'with()' 函数,我想知道它是否可以与 'ggplot2' 结合使用。如果我使用基图,我会这样做:

df <- data.frame(a= 1:10, b= 1:10)

with(df, plot(a, b))

ggplot 的模拟方法失败:

library(ggplot2)
with(df, {ggplot(aes(a, b)) + geom_point()})

我猜这是因为 'with()' 只是将 'plot(a, b)' 替换为 'plot(df$a, df$b)' 但如果我们不提供 'ggplot()' 则不起作用一个数据参数(至少不是这样)。这是正确的还是我们可以以某种方式将“with”和“ggplot2”一起使用?


一些cmets问我为什么要这样做,这就是为什么。我正在编写一个包含 with() 的非常通用的函数,并将各种函数放入 with(),例如 mean()、sd() amd 等等。 ggplot() 只是我想通过我的函数成功放入的另一个函数,其中包括知道如何将 ggplot() 放入 with()。到目前为止,我的函数可以输出数据帧和其他对象,现在我知道如何通过我的函数放置 ggplot 对象。为了简单起见,我没有在我的问题中包含这个。

【问题讨论】:

  • 我不明白你为什么要在这里使用with()ggplot 已经有一个参数供您传入值来自的 data.frame。你认为你可以用with() 做什么而你不能单独用ggplot() 做什么?
  • 如果您担心 tidyverse 软件包的稳定性,那么您应该使用renvpackrat 之类的解决方案来维持稳定的环境,而不是限制自己使用with
  • 另外,如果你担心包的稳定性,ggplot2 (ggplot(data, aes(x, y))) 的主要 API 多年来一直没有改变,几乎肯定不会改变。 R 开发的现代习语依赖于 ggplot 使用的评估风格,完全取代了 with() 的使用,我已经 6 或 7 年没有使用过。
  • @MrFlick 我编写了一个包含 with() 的函数,并且可以通过它放置许多对象。因此,例如,我可以通过我的函数放置一个 data.frame 并获得所需的输出数据。这对于 ggplot 是不可能的,因为输出不是数据框而是绘图。好消息是现在我的函数可以输出各种对象,包括 ggplot。
  • @Richard 如果我们直接讨论这个问题,你可能是对的,但实际上我正在构建一个包含 with() 的非常通用的函数。该函数可以输出各种对象,到目前为止效果很好。我不知道您建议的替代方案是否适用于我的情况。

标签: r ggplot2


【解决方案1】:

您的代码不起作用,因为ggplot() 的第一个参数是data。您需要明确说明您要使用参数mapping

df <- data.frame(a= 1:10, b= 1:10)
with(df, ggplot(mapping = aes(a, b)) + geom_point())

或者你可以这样做

df <- data.frame(a= 1:10, b= 1:10)
with(df, ggplot() + geom_point(aes(a, b))

第二种方法有效,因为geom_* 的第一个参数是mapping

【讨论】:

    【解决方案2】:
    library(ggplot2)
    ggplot(df, aes(a, b)) + geom_point()
    

    【讨论】:

    • 谢谢。请查看我的编辑:我的问题现在更明确地与 with() 函数有关。
    【解决方案3】:

    您可以使用qplot(),其设计类似于基本plot() 语法,并且它的data 参数不是必需的。

    library(ggplot2)
    with(df, { qplot(a, b) + geom_point() })
    

    【讨论】:

      【解决方案4】:

      我们可以使用%&gt;%

      library(dplyr)
      library(ggplot2)
      df %>%
          ggplot(aes(a, b)) + 
                 geom_point()
      

      【讨论】:

      • 谢谢我知道 dplyr 解决方案,但我想避免使用它,因为我害怕包中的更改。因此,我尝试使用更多的基本函数,这些函数应该随着时间的推移更加稳定。目前我已经习惯了 with()。
      猜你喜欢
      • 2013-07-25
      • 2017-11-29
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      相关资源
      最近更新 更多