ggplot:仅在满足特定条件时绘制图层

时间:2016-03-04 21:25:26

标签: 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") 

我知道我可以使用hacks,例如Species != "setosa"设置size = 0或重置如下所示的数据,但是这些都是黑客攻击。

p <- ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, species)) +
     geom_point(size = 4, shape = 4) +
     geom_point(data = iris %>% filter(Species == "setosa"), colour = "red") +
     geom_point(data = iris %>% filter(Species == "versicolor"), shape = 5)

基本上,我有一个图表,只有满足某个标准时才会显示某些事物,而现在,我正在使用上面的黑客来完成这个并且它让我夜不能寐,我的灵魂慢慢死去我创造的烂摊子。不用说,非常感谢任何帮助!

修改

我担心我的例子可能过于简单化了。基本上,给定ggplot(data = ...),我如何使用绑定到ggplot obj的数据添加这些图层

  1. 情节曲线
  2. 在符合条件#1的点上绘制点。这些点是红色的。不符合标准的点不会得到一个点(不是像点大小设置为零或alpha设置为0的黑客)
  3. 为符合条件#2的点添加标签。
  4. Critera#1和#2可以是任何东西。例如。仅标记异常点。仅用红色绘制超出特定范围的那些点等。

    想要

    1. 绑定新数据集ala ggplot(data=subset(iris, Species=="setosa"),...)ggplot(data=filter(iris,Species=="setosa")
    2. 使用缩放黑客(如设置scale = manual以及任何不符合条件的内容获取NULL / NA等)。例如,如果我有1000分并且只有1分满足给定的标准,我希望它只将它的绘图逻辑应用于那一点而不是查看,并设置所有1000点

1 个答案:

答案 0 :(得分:7)

显然,图层现在接受一个函数作为数据参数,因此您可以使用

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)