使用 ggplot2 和 sf 包可视化空间密度的困难

问题描述 投票:0回答:1

我目前正在研究空间密度的可视化。然而,我面临着一个问题,即密度图无法充分表示采样点很少的区域,特别是在本例中像犹他州这样数据点稀疏的地区。

sf_points <- data.frame(
  lat = c(39.52, 39.62, 40.03, 40.00, 39.93, 39.94, 40.12, 40.54, 35.78, 35.77),
  lon = c(-116.32, -116.00, -116.42, -116.40, -116.41, -116.41, -116.59, -116.56, -111.89, -111.51)
)

这是我的方法:


library(sf)
library(dplyr)
library(ggplot2)
library(spatstat)

sf_points<-dfst_as_sf%>%
   (coords = c("lon", "lat"), crs = 4326) %>%
    st_transform(32650)

ppp_points <- as.ppp(sf_points)
Window(ppp_points) <- as.owin(usa_map)

par(mar = rep(0, 4))
plot(ppp_points, main = "")


density_spatstat <- density(ppp_points, dimyx = 256)

density_stars <- stars::st_as_stars(density_spatstat)

density_sf <- st_as_sf(density_stars) %>%
  st_set_crs(32650)



然后绘图


ggplot(usa_map) +
  geom_sf(data = density_sf, aes(fill = v), col = NA) +
theme_bw() +
  ggthemes::theme_map()+ geom_sf(data = st_boundary(usa_map))+
  coord_sf(crs = st_crs("+proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m +no_defs"), datum = NA)+scale_fill_viridis_c(option = "c")


尽管使用

scale_fill_viridis_c
函数来调整配色方案,但密度图无法提供足够的视觉对比度来区分采样点密度不同的区域。我想增强可视化效果,以便即使采样点很少的区域也能清晰辨别。

我正在寻求有关如何调整配色方案或应用替代可视化技术的建议,这些技术可以更好地突出密度变化,特别是在像犹他州这样数据点稀疏的地区。

任何建议或指导将不胜感激。谢谢!

ggmap kernel-density spatstat
1个回答
0
投票

我无法重现您的示例(未找到

usa_map
,并且代码中某处存在语法错误)

您没有确切地说图形输出有什么问题(除了它“没有提供足够的对比度”)。

对结果影响最大的输入参数是平滑带宽

sigma
。这应该在对
density()
的调用中指定。您的代码未指定
sigma
,因此代码使用默认值
sigma
,这在这种情况下可能不合适。该调用被分派到
density.ppp
包中的方法
spatstat.explore
。我建议您阅读
density.ppp
的帮助文件以获取指导。

对于非常稀疏的数据,算法可能会由于数值伪影而产生一些负值(但极小)的像素值。如果图形代码需要非负像素值,这可能会影响图形显示:它可能会将负值渲染为空白。您可以通过键入

range(density_spatstat)
summary(density_spatstat)
any(density_spatstat < 0)
检查是否确实返回了任何小的负值。您可以在对
positive=TRUE
的调用中设置
density
来删除此类值。请参阅帮助文件
density.ppp

density.ppp
还有许多使用自适应平滑的替代方案,这可能更适合您的数据。再次,请参阅帮助文件以进行交叉引用。

© www.soinside.com 2019 - 2024. All rights reserved.