首页 文章

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

提问于
浏览
3

我有一个密集的散点图,我想控制所绘制点的顺序,因为使用 alpha 不起作用 - 基本上,我想要绘制一些点"on top" . 听起来在ggplot2中控制这个点的唯一方法就是使用图层 . 我有以下内容:

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

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

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

1 回答

  • 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

相关问题