我有一个密集的散点图,我想控制被绘制点的顺序,因为使用 analpha
不起作用 - 基本上,我想在“顶部”绘制少数点。听起来,在 ggplot2 中控制点的“z 顺序”的唯一方法是使用图层。我有以下内容:
df <- data.frame(x=rnorm(10000),y=rnorm(10000))
df$g <- c("1")
df[500,]$g <- c("special")
df[600,]$g <- c("special2")
ggplot(df) + geom_point(aes(x=x, y=y, colour=g))
这为g
列中的值显示了一个很好的图例。在这里,值为“special”、“special2”的点恰好被绘制在其余点之上,但很多时候这是不正确的,在这种情况下,我尝试将数据帧分解为层,将每一层绘制为一个以确保我得到点的顺序:
df1 <- df[df$g == "special",]
df2 <- df[df$g == "special2",]
df3 <- df[df$g == "1",]
# plot layer by layer
p <- ggplot() + geom_point(aes_string(x=x,y=y), data=df1, color="red")
p <- p + geom_point(aes_string(x=x, y=y), data=df2, color="green")
p <- p + geom_point(aes_string(x=x, y=y), data=df3, color="blue")
这可行,但与第一种情况不同的是,没有显示图例,其中 df 仅用colour=g
. 我怎样才能让图例显示?
而且,有没有更简单的方法来做到这一点?原来的调用是完美的,除了分层问题。有没有办法告诉 ggplot 顺序,例如
ggplot(df) + geom_point(aes(x=x, y=y, colour=g), order=c("1", "special", "special2"))
表示它应该首先绘制所有具有g
值的点1
,然后是所有具有g
值的点special
,等等。将数据框分解为单独的一个并使用图层,然后手动指定图例只是为了控制绘制点的顺序是一个巨大的痛苦. 在简单的第一次调用中,ggplot 还为您处理颜色,这非常好。谢谢。
ps 我正在使用 rpy2 制作这些图,但我展示了 R,因为翻译(通常)对 rpy2 来说很简单,但 rpy2 解决方案会更好。