【问题标题】:ggplot2: how to change render/plot order of elements according to scale gradient?ggplot2:如何根据比例渐变更改元素的渲染/绘图顺序?
【发布时间】:2021-10-19 23:41:18
【问题描述】:

我想知道:

a)什么决定了元素在 ggplot2 图中的呈现顺序?

b)如何根据变量或渐变色标影响元素的绘图顺序?

上下文:我想可视化道路网络数据的连续变量(例如交通流量)。重要的是最后绘制具有高值的线(以便它们出现在具有较低值的线的顶部),以使绘图清晰易读。目前,默认似乎是按随机顺序绘制线条。

下面是一个使用道路长度作为变量的示例,预期的输出将按照其值的顺序绘制道路线,即首先是灰色线,然后是红灰色线,然后是较深的红色线,等等。

示例数据:

library(GISTools)
library(sf)
library(ggplot2)

data(newhaven)

ggplot() +
  geom_sf(data = st_as_sf(roads, "lines"), aes(col = LENGTH)) +
  scale_colour_gradient(low = "grey", high = "red")

这是一个放大图,很好地说明了问题所在:灰色的道路覆盖了红色的道路。但是,我想要实现的是最后绘制红色道路(因为它具有更大的长度值)。

ggplot() +
  geom_sf(data = st_as_sf(roads, "lines"), aes(col = LENGTH, size = 3)) +
  scale_colour_gradient(low = "grey", high = "red") +
  coord_sf(xlim = c(557000, 560000), ylim = c(178000, 180000)) + 
  annotate(geom = "curve", x = 558000, y = 178500, xend = 558850, yend = 179150, curvature = -.3, arrow = arrow(length = unit(3, "mm")))

【问题讨论】:

    标签: r ggplot2 sf


    【解决方案1】:

    一般来说,ggplot 按源数据中出现的顺序添加元素(即“在顶部”)。因此,如果我们按 LENGTH 升序排序,那么最长的道路应该最后打印。

    library(dplyr)
    ggplot() +
      geom_sf(data = st_as_sf(roads, "lines") %>% arrange(LENGTH), 
              aes(col = LENGTH, size = 3)) +
      scale_colour_gradient(low = "grey", high = "red") +
      coord_sf(xlim = c(557000, 560000), ylim = c(178000, 180000)) + 
      annotate(geom = "curve", x = 558000, y = 178500, xend = 558850, yend = 179150, curvature = -.3, arrow = arrow(length = unit(3, "mm")))
    

    【讨论】:

    • 太棒了,这非常有效,您对dplyr 的使用使这变得简单明了。非常感谢!
    猜你喜欢
    • 2018-12-18
    • 2021-10-04
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多