【问题标题】:dplyr and ggplot piping is not working as expecteddplyr 和 ggplot 管道未按预期工作
【发布时间】:2017-05-17 12:49:50
【问题描述】:

我找不到以下两个问题的解决方案:

首先我试试这个:

library(tidyverse)
gg <- mtcars %>% 
      mutate(group=ifelse(gear==3,1,2)) %>%      
      ggplot(aes(x=carb, y=drat)) + geom_point(shape=group)

Error in layer(data = data, mapping = mapping, stat = stat, geom = 
GeomPoint,:object 'group' not found

这显然是行不通的。但是使用类似.$group 的东西也不成功。值得注意的是,我必须从aes() 指定外部形状

第二个问题是这样的。我无法在管道中调用已保存的 ggplot (gg)。

gg <- mtcars %>% 
      mutate(group=ifelse(gear==3,1,2)) %>%      
      ggplot(aes(x=carb, y=drat)) + geom_point()


    mtcars %>% 
        filter(vs == 0) %>% 
        gg + geom_point(aes(x=carb, y=drat), size = 4)  

Error in gg(.) : could not find function "gg"

感谢您的帮助!

编辑

找了很久才找到解决办法here。必须在 {} 中设置完整的 ggplot 术语。

mtcars %>% 
   mutate(group=ifelse(gear==3,1,2)) %>% {     
   ggplot(.,aes(carb,drat)) +
       geom_point(shape=.$group)}

【问题讨论】:

  • 试试geom_point(aes(shape=factor(group))),第二部分你需要{},就像mtcars %&gt;% filter(vs == 0) %&gt;% {gg + geom_point(data = ., aes(x=carb, y=drat), size = 4)}一样
  • 在第一部分我需要这个ggplot(mtcars, aes(x=carb, y=drat)) + geom_point(shape=ifelse(mtcars$gear==3,1,2))。为第二部分点赞!
  • 我以前从未见过{}ggplot 的把戏。很好的解决方案
  • @docendodiscimus 如果必须在 aes() 之外设置变量,则 ggplot 无法使用管道?
  • 我想知道为什么这个问题有两票赞成结束?

标签: r ggplot2 dplyr


【解决方案1】:

如果您将shape 定义包装在aes() 中,您可以获得所需的行为。要在aes() 之外使用shape,您可以将其传递给单个值(即shape=1)。另请注意,group 被转换为离散变量,geom_point 在将连续变量传递给shape 时会引发错误。

library(tidyverse)

gg <- mtcars %>% 
  mutate(group=ifelse(gear==3,1,2)) %>%      
  ggplot(aes(x=carb, y=drat)) + 
  geom_point(aes(shape=as.factor(group)))

gg

其次,%&gt;% 运算符,当被称为lhs %&gt;% rhs 时,假定rhs 是一个函数。因此,如错误所示,您将 gg 作为函数调用。将绘图作为数据帧上的函数调用(即gg(mtcars))不是有效的操作。

有关如何使用{} 完成从 magrittr 管道向现有ggplot 对象添加层的问题,请参阅@docendo discimus 评论。

【讨论】:

  • 但我想要这个:ggplot(mtcars, aes(x=carb, y=drat)) + geom_point(shape=ifelse(mtcars$gear==3,1,2))。所以我不能在这两种情况下都使用管道?
  • 您的第一个代码块完成了对ggplot 的调用,但您不能预定义绘图然后将其作为函数调用。如果您想在不同的数据帧上调用用于生成gg 的代码,那么您可以在管道中使用之前将其包装在一个函数中
  • 谢谢。但尽管如此,我需要将形状设置在aes() 之外。那么管道似乎不可能。
猜你喜欢
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2018-11-16
  • 1970-01-01
  • 2018-03-29
  • 2021-09-17
相关资源
最近更新 更多