ggplot2
将逐层创建绘图,并且在每一层内,绘图顺序由geom
类型定义。默认是按照它们出现在data
.
有不同之处,请注明。例如
geom_line
连接观察值,按 x 值排序。
和
geom_path
按数据顺序连接观察结果
也有关于排序的已知问题,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
参数已被弃用。使用 egbase::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))