Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R可视化:地图上的合理排斥点(蜂群?)_R_Ggplot2_Visualization_Sf_Beeswarm - Fatal编程技术网

R可视化:地图上的合理排斥点(蜂群?)

R可视化:地图上的合理排斥点(蜂群?),r,ggplot2,visualization,sf,beeswarm,R,Ggplot2,Visualization,Sf,Beeswarm,我试着复制一张类似这样的地图 它描绘了分布在一个地区的少量项目(学校)。作为输入,我有一张区域地图,每个区域都有一个编号。我想把这一点放在这个区域的很多地方。如果它们不会跨越区域边界扩散,那就更好了,但仅仅分布它们就足够了。区域内的一些漂亮的排斥点可能会起作用 蜂群图也有类似的功能,这可以在地图上实现吗。奖金问题-事实上,我一直在寻找动画,但只能想到非常复杂的方法来做到这一点,所以新的点是增加总nrs的时间 下面的代码将点放置在地图的质心中,并将数字作为大小。(我无法将地图正确导出为单个文件,因

我试着复制一张类似这样的地图

它描绘了分布在一个地区的少量项目(学校)。作为输入,我有一张区域地图,每个区域都有一个编号。我想把这一点放在这个区域的很多地方。如果它们不会跨越区域边界扩散,那就更好了,但仅仅分布它们就足够了。区域内的一些漂亮的排斥点可能会起作用

蜂群图也有类似的功能,这可以在地图上实现吗。奖金问题-事实上,我一直在寻找动画,但只能想到非常复杂的方法来做到这一点,所以新的点是增加总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)