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

5 r ggplot2 rpy2

我有一个密集的散点图,我想在其中控制绘制点的顺序,因为使用 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))
Run Code Online (Sandbox Code Playgroud)

这为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")
Run Code Online (Sandbox Code Playgroud)

这有效,但与第一种情况不同,没有显示图例,其中 df 仅用colour=g. 我怎样才能让图例显示?

而且,有没有更简单的方法来做到这一点?除了分层问题,原始调用是完美的。有没有办法告诉 ggplot 订单,例如

ggplot(df) + geom_point(aes(x=x, y=y, colour=g), order=c("1", "special", "special2"))
Run Code Online (Sandbox Code Playgroud)

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

ps 我正在使用 rpy2 来制作这些图,但我展示了 R,因为翻译(通常)对 rpy2 来说很简单,但 rpy2 解决方案会更好。

And*_*rie 6

的顺序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))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但是,在许多情况下,正如您在问题中所建议的那样,使用不同的层会更容易。在这种情况下,您仍然可以使用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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明