【发布时间】:2013-05-28 15:00:19
【问题描述】:
我有一个密集的散点图,我想控制绘制点的顺序,因为使用 alpha 不起作用 - 基本上,我希望将少数点绘制在“顶部” .听起来,在 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 解决方案会更好。
【问题讨论】: