ggplot:仅在满足某些条件时绘制图层

adi*_*aya 2 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") 
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用hacks,如设置size = 0,如果Species != "setosa"或重置数据,如下所示,但有所有hacks.

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)
Run Code Online (Sandbox Code Playgroud)

基本上,我有一个图表,只有在符合某个标准的情况下才能显示某些东西,而现在,我正在使用上面的黑客来完成这个并且它让我夜不能寐,我的灵魂慢慢地从混乱中消失我已经创造了.毋庸置疑,非常感谢任何帮助!

编辑

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

  1. 绘制曲线
  2. 在满足标准#1的点上绘制点.这些点是红色的.不符合标准的点不会得到一个点(不是像点大小设置为零或alpha设置为0的黑客)
  3. 将标签添加到符合条件#2的点.

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点的样式

bap*_*ste 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)
Run Code Online (Sandbox Code Playgroud)

  • 假定不推荐使用filter_,将来可能需要执行以下操作:`pick &lt;-function(condition){function(d)d%&gt;%filter(!! enquo(condition))}`。如果使用了成语,则必须在对`pick`的调用中从对列的引用中删除波浪号。 (2认同)

Joh*_*sNE 7

您可以使用公式符号通过匿名函数过滤数据~

library(ggplot2)
library(dplyr)

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, species)) +
    geom_point(size = 4, shape = 4) +
    geom_point(data = ~filter(.x, Species == "setosa"), colour = "red") +
    geom_point(data = ~filter(.x, Species == "versicolor"), shape = 5)
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2021 年 11 月 15 日创建(v2.0.0)