【发布时间】:2019-09-08 15:08:11
【问题描述】:
它描绘了分布在一个区域内的少量项目(学校)。对于输入,我有一个区域地图,每个区域都有一个数字。我想把它放在该地区周围的许多点上。如果它们不跨越区域边界扩散会更好,但简单地分布它们就足够了。区域内一些不错的排斥点可能会起作用。
Beeswarm plots 做了一些非常相似的事情,这可以在地图上完成吗?额外的问题 - 事实上我一直在寻找动画,但只能想出非常复杂的方法来做到这一点,以便随着时间的增加和 nrs 添加新点。
下面的代码将点放在地图上的质心中,并将数字作为大小。 (我无法将地图正确导出为单个文件,所以坐标有点乱,但原理是一样的。)
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
p<- schools_geo %>%
ggplot()+
geom_sf(data=schools_geo)+
geom_sf(data=st_centroid(schools_geo),aes(size=value))+
theme_bw()
p
谢谢!
【问题讨论】:
-
您的
places数据被读取为 lon/lat,但您的几何列看起来像不同的 crs。数据应该是什么crs? -
我不确定,但您找到了解决方案。我一直在使用一些非常旧的 .shp shapefile,但没有找到很好的保存方法。事实上,crs 最初表示没有 EPSG 代码,即使它显示正确。按照您的建议,使用
st_crs() <- 3301从 geojson 重新读取,也修复了一些其他错误。Although coordinates are longitude/latitude, st_intersects assumes that they are planar,Error in CPL_geos_is_empty(st_geometry(x)) : Evaluation error: IllegalArgumentException: Points of LinearRing do not form a closed linestring.但真的不知道发生了什么,非常感谢修复。
标签: r ggplot2 visualization sf beeswarm