【问题标题】:controlling z-order of points and combining legends from multiple layers in ggplot2/rpy2控制点的 z 顺序并在 ggplot2/rpy2 中组合来自多个图层的图例
【发布时间】:2013-05-28 15:00:19
【问题描述】:

我有一个密集的散点图,我想控制绘制点的顺序,因为使用 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 列中的值显示一个很好的图例。在这里,值为“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 解决方案会更好。

【问题讨论】:

    标签: r ggplot2 rpy2


    【解决方案1】:

    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-11-23
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多