在 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)
它是否回答了您的问题?
(加载库)
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)
它是否回答了您的问题?