我目前正在研究空间密度的可视化。然而,我面临着一个问题,即密度图无法充分表示采样点很少的区域,特别是在本例中像犹他州这样数据点稀疏的地区。
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
函数来调整配色方案,但密度图无法提供足够的视觉对比度来区分采样点密度不同的区域。我想增强可视化效果,以便即使采样点很少的区域也能清晰辨别。
我正在寻求有关如何调整配色方案或应用替代可视化技术的建议,这些技术可以更好地突出密度变化,特别是在像犹他州这样数据点稀疏的地区。
任何建议或指导将不胜感激。谢谢!
我无法重现您的示例(未找到
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
还有许多使用自适应平滑的替代方案,这可能更适合您的数据。再次,请参阅帮助文件以进行交叉引用。