ggplot2:如何根据比例梯度更改 render/plot 元素顺序?
ggplot2: how to change render/plot order of elements according to scale gradient?
我想知道:
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")))
一般来说,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")))
我想知道:
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")))
一般来说,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")))