我有一个密集的散点图,我想控制所绘制点的顺序,因为使用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"))
表示应首先使用g
值1
绘制所有点,然后使用g
值special
等绘制所有点。将数据帧分解为分开一个并使用图层,然后手动指定图例是一个巨大的痛苦,只是为了控制绘制的点的顺序。在简单的第一次调用中,ggplot还会为您处理颜色非常好。感谢。
ps我正在使用rpy2制作这些图,但我显示了R,因为翻译(通常)直接到rpy2,但rpy2解决方案会更好。
答案 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))
但是,在许多情况下,如您在问题中所建议的那样,使用不同的图层会更容易。在这种情况下,您仍然可以使用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)