5

我有一个密集的散点图,我想控制被绘制点的顺序,因为使用 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 解决方案会更好。

4

1 回答 1

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

在此处输入图像描述

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

在此处输入图像描述

于 2013-06-02T06:29:54.580 回答