R ggplot:仅当满足某些条件时才打印图层

R ggplot:仅当满足某些条件时才打印图层,r,ggplot2,R,Ggplot2,ggplot本身是否有过滤方法?就是说我想这样做 p <- ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, species)) + geom_point(size = 4, shape = 4) + geom_point(size = 1, shape = 5 # do this only for data that meets some condition. E.g. Species == "setosa")

ggplot
本身是否有过滤方法?就是说我想这样做

p <- ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, species)) +
     geom_point(size = 4, shape = 4) +
     geom_point(size = 1, shape = 5 # do this only for data that meets some condition. E.g. Species == "setosa") 
基本上,我有一个图表,其中某些东西只有在满足特定标准的情况下才能显示,而现在,我正在使用上面的技巧来完成这项工作,它让我夜不能寐,我的灵魂慢慢地死于我所造成的混乱。不用说,任何帮助都将不胜感激

编辑

恐怕我的例子太简单了。基本上,给定
ggplot(data=…)
,如何添加这些层,都使用绑定到ggplot obj的数据:

  • 绘制曲线
  • 在满足条件#1的点上绘制点。这些点应该是红色的。不符合条件的点不会绘制点(不是hack-like point size设置为零或alpha设置为0)
  • 向满足条件#2的点添加标签 克里特拉1号和2号可以是任何东西。例如,仅标记异常点。仅用红色绘制特定范围以外的点等

    我不想

  • 绑定新数据集ala
    ggplot(数据=子集(虹膜,物种==“setosa”),…)
    ggplot(数据=过滤器(虹膜,物种==“setosa”)
  • 使用缩放技巧(如设置scale=manual,任何不符合标准的都会得到NULL/NA等)。例如,如果我有1000个点,但只有1个点符合给定标准,我希望它只将其绘图逻辑应用于该点,而不是查看并设置所有1000个点的样式

  • 显然,层现在接受一个函数作为数据参数,所以您可以使用它

    pick <- function(condition){
      function(d) d %>% filter_(condition)
    }
    
    ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, species)) +
      geom_point(size = 4, shape = 4) +
      geom_point(data = pick(~Species == "setosa"), colour = "red") +
      geom_point(data = pick(~Species == "versicolor"), shape = 5)
    
    pick%过滤器(条件)
    }
    ggplot(鸢尾,aes(x=萼片宽度,y=萼片长度,种))+
    几何点(尺寸=4,形状=4)+
    几何点(数据=拾取(~Species==“setosa”),颜色=“红色”)+
    几何点(数据=拾取(~物种=“花色”),形状=5)
    
    典型的选择通常是在层内使你的状态成为一种美学,可能是在你自己设置比例的时候。例如,
    geom_点(aes(color=Species==“setosa”)+scale_color_手册(values=c(“黑色”、“红色”))
    。另一种选择是使用你的数据子集,比如
    geom_点(data=subset(鸢尾,种类=“刚毛”),大小=1,形状=5)
    @lukeA
    子集
    解决方案与
    过滤器
    解决方案有何不同?@DavidRobinson请查看我的编辑。从某种意义上说,这看起来仍然像是一种黑客行为,我并没有告诉ggplot仅对满足特定标准的数据应用特定的东西,而是我只是将数据分成两组并将其样式化em不一样。你所谓的黑客可能基本上是一种方式。如果它工作得很好,你为什么需要其他选择?:)完美。正是我想要的。谢谢巴蒂斯特!非常好的答案,特别是因为ggplot2 v2+不再支持非官方的(即未记录的)
    subset
    参数为每个层筛选数据。请参阅。鉴于过滤器已被弃用,今后可能需要执行以下操作:
    pick%filter(!!enquo(条件))}
    。如果使用这一习惯用法,则必须从对
    pick
    调用中的列的引用中删除波浪号。是否有一种方法可以在不使用
    pick
    例程的情况下执行此操作?
    pick <- function(condition){
      function(d) d %>% filter_(condition)
    }
    
    ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, species)) +
      geom_point(size = 4, shape = 4) +
      geom_point(data = pick(~Species == "setosa"), colour = "red") +
      geom_point(data = pick(~Species == "versicolor"), shape = 5)