控制点的z顺序并组合ggplot2 / rpy2中多个图层的图例

时间:2013-06-02 05:53:01

标签: r ggplot2 rpy2

我有一个密集的散点图,我想控制所绘制点的顺序,因为使用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列中值的精彩图例。在这里,值“特殊”,“特殊2”的点碰巧被绘制在其余点的顶部,但很多时候这不是真的,在这种情况下,我尝试将数据帧分解为多个层,绘制每个层一个一,以确保我得到点的顺序:

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"))

表示应首先使用g1绘制所有点,然后使用gspecial等绘制所有点。将数据帧分解为分开一个并使用图层,然后手动指定图例是一个巨大的痛苦,只是为了控制绘制的点的顺序。在简单的第一次调用中,ggplot还会为您处理颜色非常好。感谢。

ps我正在使用rpy2制作这些图,但我显示了R,因为翻译(通常)直接到rpy2,但rpy2解决方案会更好。

1 个答案:

答案 0 :(得分:4)

geom_point的顺序取决于您的数据顺序。换句话说,数据框底部的数据点将最后绘制。

这指向一个简单的解决方案:在绘制之前对数据框进行排序:

df <- df[order(df$g), ]
df$size <- df$g != 1
ggplot(df) + geom_point(aes(x=x, y=y, colour=g, size=size))

enter image description here

但是,在许多情况下,如您在问题中所建议的那样,使用不同的图层会更容易。在这种情况下,您仍然可以使用aes参数指定色阶:

ggplot() + 
  geom_point(data=df[df$g==1, ], aes(x=x, y=y, colour=g), size=1) +
  geom_point(data=df[df$g!=1, ], aes(x=x, y=y, colour=g), size=5)

enter image description here