R可视化:地图上的合理排斥点(蜂群?)
我试着复制一张类似这样的地图 它描绘了分布在一个地区的少量项目(学校)。作为输入,我有一张区域地图,每个区域都有一个编号。我想把这一点放在这个区域的很多地方。如果它们不会跨越区域边界扩散,那就更好了,但仅仅分布它们就足够了。区域内的一些漂亮的排斥点可能会起作用 蜂群图也有类似的功能,这可以在地图上实现吗。奖金问题-事实上,我一直在寻找动画,但只能想到非常复杂的方法来做到这一点,所以新的点是增加总nrs的时间 下面的代码将点放置在地图的质心中,并将数字作为大小。(我无法将地图正确导出为单个文件,因此坐标有点混乱,但原理是一样的。)R可视化:地图上的合理排斥点(蜂群?),r,ggplot2,visualization,sf,beeswarm,R,Ggplot2,Visualization,Sf,Beeswarm,我试着复制一张类似这样的地图 它描绘了分布在一个地区的少量项目(学校)。作为输入,我有一张区域地图,每个区域都有一个编号。我想把这一点放在这个区域的很多地方。如果它们不会跨越区域边界扩散,那就更好了,但仅仅分布它们就足够了。区域内的一些漂亮的排斥点可能会起作用 蜂群图也有类似的功能,这可以在地图上实现吗。奖金问题-事实上,我一直在寻找动画,但只能想到非常复杂的方法来做到这一点,所以新的点是增加总nrs的时间 下面的代码将点放置在地图的质心中,并将数字作为大小。(我无法将地图正确导出为单个文件,因
places=st\u read(“https://gist.githubusercontent.com/peeter-t2/9646a4169e993948fa97f6f503a0688b/raw/cb4e910bf153e51e3727dc9d1c73dd9ef86d2556/kih1897m.geojson,stringsAsFactors=FALSE)
学校这不是一个容易的问题。我决定简化它,只选择一个领域,而不是全部。从理论上讲,该解决方案适用于您的所有区域
我们首先导入我们的库
library(rgdal)
library(sf)
library(readr)
library(ggplot2)
我们使用建议的数据:
places <- st_read("https://gist.githubusercontent.com/peeter-t2/9646a4169e993948fa97f6f503a0688b/raw/cb4e910bf153e51e3727dc9d1c73dd9ef86d2556/kih1897m.geojson", stringsAsFactors = FALSE)
schools <- read_tsv("https://gist.github.com/peeter-t2/34467636b3c1017e89f33284d7907b42/raw/6ea7dd6c005ef8577b36f5e84338afcb6c76b707/school_nums.tsv")
schools_geo <- merge(places,schools,by.x="KIHELKOND",by.y="Kihelkond") #94 matches
最后,我们希望只保留您想要的点数,这是您的示例中相当于值(学校数)的nbr
nbr <- 20
plot(st_geometry(one))
plot(st_geometry(st_centroid(tmp[order(tmp$area, decreasing = T),][1:nbr,])),
pch = 16, col = 'red', add = TRUE)
nbr正如我在评论中指出的,当我在文件中读取时,它将crs
设置为lat/lon(epsg:4326
),而几何体列是不同的crs
。我已经猜到正确的crs
是espg:3301
,并在这个基础上继续进行,似乎效果不错
st\U crs(学校地理位置)%
ggplot()+
geom_sf()+
geom_sf(数据=学校分数,大小=0.8)+
主题_bw()
这产生了下面的图,我认为它看起来很混乱,因为st_sample
将点扩展到多边形的范围
让点在每个多边形中更加居中可能会更好,如您发布的示例所示。要做到这一点,我们可以根据要在多边形中绘制的点的数量重新缩放多边形。在下面的代码中,如果多边形的内部点最少(1),则将多边形缩小90%,如果多边形的内部点最多(27),则将多边形缩小20%
#将值放在0和1之间的刻度上
缩放\u事实上,您的位置
数据被读取为lon/lat,但您的几何列看起来像一个不同的crs。数据应该是什么crs?我不确定,但你找到了解决方案。我一直在使用一些非常旧的.shp形状文件,但没有找到保存它的方法。事实上,crs最初表示没有EPSG代码,即使它显示正确。用st_crs()重新阅读geojson,这真是太棒了,太漂亮了。我应该玩一下缩放。目前,狭窄的区域将它们聚集在一起,而较宽的区域将它们分布得很广,而在这两者之间,它的工作方式正好相反。知道为什么会这样吗?但这确实是一个非常聪明的解决方案!PS对上面的crs进行了评论。是的,在绘图中玩转缩放和点的大小。间距差异的原因是st_sample
将填充给定的空间。如果在一个小空间中有很多点,它们会分布得更近。其中一些可以通过调整缩放方式来改进,但有些只是数据(小空间中有很多点)。@puslet88也感谢编辑,不知何故,我遗漏了几行!谢谢!这确实是一个巧妙的解决办法@克里斯在上面写了一篇非常优雅的文章,所以我接受了。我可能会考虑将两者结合起来,以获得更好的效果。st_sample()是一个很好的函数!我完全同意st_sample()
是正确的解决方案。
one <- places$geometry[[1]]
grid <- st_make_grid(one, n = c(10, 10))
area <- st_area(grid)
grid <- st_as_sf(data.frame(ID=c(1:length(area)),
area=area,
geometry=grid))
tmp <- st_intersection(grid, one)
tmp$area <- st_area(tmp)
plot(st_geometry(tmp['area']))
plot(st_geometry(st_centroid(tmp['area'])),
pch = 16, col = 'red', add = TRUE)
nbr <- 20
plot(st_geometry(one))
plot(st_geometry(st_centroid(tmp[order(tmp$area, decreasing = T),][1:nbr,])),
pch = 16, col = 'red', add = TRUE)