在 R 中更改 geom_sf 中重叠因子值的视觉顺序

Change Visual Order of Overlapping Factor Values in geom_sf in R

(加载库)

library(tidyverse)
library(sf)

假设我们有两个点在相同的位置 (x,y) 但具有不同的值 (z):

x<-c(1,1)
y<-c(1,1)
z<-c(0,1)

我知道 geom_point 会根据数据集的顺序更改显示值的顺序(在顶部):

ggplot(data=points, aes(x=x,y=y))+geom_point(aes(color=z),size=20)
ggplot(data=points%>%arrange(desc(z)), aes(x=x,y=y))+geom_point(aes(color=z),size=20)

order 1 order 2

如果 "z" 是一个因素,这仍然有效。

如果我将点放入 sf 对象并使用 geom_sf 绘制它们,如果 "z" 是数字,它就可以工作。

ggplot(data=points%>%st_as_sf(x=.,coords=c("x","y"),crs=4326) )+geom_sf(aes(color=z),size=20)

ggplot(data=points%>%st_as_sf(x=.,coords=c("x","y"),crs=4326) %>%arrange(desc(z)))+geom_sf(aes(color=z),size=20)

sf num order 1 sf num order 2

但是,使用 geom_sf 和因子 (z),当我重新排序数据集时没有任何变化。

ggplot(data=points%>%st_as_sf(x=.,coords=c("x","y"),crs=4326) %>%mutate(z=factor(z)))+geom_sf(aes(color=z),size=20)

ggplot(data=points%>%st_as_sf(x=.,coords=c("x","y"),crs=4326) %>%mutate(z=factor(z))%>%
arrange(desc(z)))+geom_sf(aes(color=z),size=20)

sf factor order 1 sf factor order 2

如何在上一个示例中强制重新排序?

非常感谢!

在您的最后一个示例中,您可以通过在将 z 设置为因子并将 z 的唯一值作为因子水平之前重新排列 z 的顺序来强制重新排序,如下所示:

library(tidyverse)
library(sf)

points%>%
  st_as_sf(x=.,coords=c("x","y"),crs=4326) %>%
  arrange(desc(z)) %>%
  mutate(z=factor(z, levels = unique(z))) %>% str()

Classes ‘sf’ and 'data.frame':  2 obs. of  2 variables:
 $ z       : Factor w/ 2 levels "1","0": 1 2
 $ geometry:sfc_POINT of length 2; first list element:  'XY' num  1 1
 - attr(*, "sf_column")= chr "geometry"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA
  ..- attr(*, "names")= chr "z"

str 输出中,您可以看到现在因子水平组织得很好(1 在 0 之前)如果我们绘制它,您会得到预期的图:

library(tidyverse)
library(sf)
ggplot(data=points%>%
         st_as_sf(x=.,coords=c("x","y"),crs=4326) %>%
         arrange(desc(z)) %>%
         mutate(z=factor(z, levels = unique(z))))+
  geom_sf(aes(color=z),size=20)

它是否回答了您的问题?