ggplot2 将逐层创建绘图,并且在每一层内,绘图顺序由geom 类型定义。默认是按照它们在data 中出现的顺序进行绘制。
如果有不同,请注明。例如
geom_line
连接观察,按 x 值排序。
和
geom_path
按数据顺序连接观察结果
还有known issues regarding the ordering of factors,注意包作者Hadley的回复很有意思
绘图的显示应该与数据框的顺序保持不变 - 其他任何东西都是错误。
记住这句话,图层是按指定的顺序绘制的,所以过度绘制可能是个问题,尤其是在创建密集散点图时。因此,如果您想要一个一致的图(而不是依赖于数据框中的顺序的图),您需要多考虑一下。
创建第二层
如果您希望某些值出现在其他值之上,您可以使用subset 参数来创建第二层,以便之后确定绘制。您需要显式加载 plyr 包,以便 .() 可以工作。
set.seed(1234)
df <- data.frame(x=rnorm(500))
df$y = rnorm(500)*0.1 + df$x
df$label <- c("a")
df$label[50] <- "point"
df$size <- 2
library(plyr)
ggplot(df) + geom_point(aes(x = x, y = y, color = label, size = size)) +
geom_point(aes(x = x, y = y, color = label, size = size),
subset = .(label == 'point'))
更新
在ggplot2_2.0.0 中,不推荐使用subset 参数。使用例如base::subset 选择在 data 参数中指定的相关数据。并且无需加载plyr:
ggplot(df) +
geom_point(aes(x = x, y = y, color = label, size = size)) +
geom_point(data = subset(df, label == 'point'),
aes(x = x, y = y, color = label, size = size))
或者使用alpha
另一种避免过度绘制问题的方法是设置点的alpha(透明度)。这不会像上面显式的第二层方法那样有效,但是,如果明智地使用scale_alpha_manual,您应该能够得到一些工作。
例如
# set alpha = 1 (no transparency) for your point(s) of interest
# and a low value otherwise
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size,alpha = label)) +
scale_alpha_manual(guide='none', values = list(a = 0.2, point = 1))