首页 > 解决方案 > ggplot2:如何根据比例渐变更改元素的渲染/绘图顺序?

问题描述

我想知道:

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

放大纽黑文道路数据

标签: rggplot2sf

解决方案


通常,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")))

在此处输入图像描述


推荐阅读