【发布时间】:2016-03-04 21:25:25
【问题描述】:
有没有一种过滤方法在 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")
我知道我可以使用一些技巧,例如设置 size = 0 if Species != "setosa" 或重置数据,如下所示,但所有技巧都是。
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 的点上绘制点。这些点将是红色的。不符合标准的点不会被绘制(不是像点大小设置为零或 alpha 设置为 0 的 hack)
- 为满足条件 #2 的点添加标签。
标准#1 和#2 可以是任何东西。例如。仅标注异常点。仅将超出特定范围的点绘制为红色,等等。
我不想想要
- 绑定一个新的数据集ala
ggplot(data=subset(iris, Species=="setosa"),...)或ggplot(data=filter(iris,Species=="setosa")。 - 使用缩放技巧(例如设置 scale=manual 并且任何不符合条件的都将获得 NULL/NA 等)。例如,如果我有 1000 个点并且只有 1 个点符合给定标准,我希望它只将其绘制逻辑应用于该点,而不是查看和设置所有 1000 个点的样式
【问题讨论】:
-
典型的选择通常是使您的条件成为图层中的美学,可能同时您自己设置比例。例如。
geom_point(aes(colour = Species == "setosa")) + scale_color_manual(values = c("black", "red")). -
另一种方法是使用数据的子集,例如
geom_point(data=subset(iris, Species=="setosa"), size = 1, shape = 5)。 -
@lukeA
subset解决方案与filter解决方案有何不同? -
@DavidRobinson 请查看我的编辑。从某种意义上说,这仍然看起来像一个 hack,因为我没有告诉 ggplot 仅将特定事物应用于满足特定标准的数据,而是我只是将数据分成两组并以不同的方式设置它们。
-
你所说的黑客可能基本上是要走的路。如果它运作良好,你为什么需要其他选择? :)