pus*_*t88 3 visualization r ggplot2 r-sf beeswarm
它描述了分布在一个区域中的少量物品(学校)。对于输入,我有一个区域地图,每个区域都有一个数字。我想将其分布在该地区周围的许多地方。如果它们不会跨区域边界扩散,那就更好了,但是仅将它们分布就足够了。在区域内一些良好的排斥点可能有效。
蜂巢图可以做的非常相似,可以在地图上完成。奖励问题-实际上,我一直在寻求动画效果,但是只能想到非常复杂的方法来实现,因此随着总和的增加,会增加新的积分。
下面的代码在地图上将点放置在质心中,并将数字作为大小。(我无法将地图正确导出为单个文件,因此坐标有些混乱,但是原理是相同的。)
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
Run Code Online (Sandbox Code Playgroud)
谢谢!
正如我在评论中指出的那样,当我读入文件时,它的设置crs为lat / lon(epsg: 4326),而几何列则不同crs。我猜想是正确crs的espg: 3301,并在此基础上进行,这似乎很好。
st_crs(schools_geo) <- 3301
Run Code Online (Sandbox Code Playgroud)
我们可以使用st_sample来获取多边形中与“值”列相关的点的样本:
# we can set type = 'hexagonal', 'regular' or 'random'
school_pts <- schools_geo %>% st_sample(size = .$value, type = 'hexagonal')
schools_geo %>%
ggplot()+
geom_sf()+
geom_sf(data=school_pts, size = .8)+
theme_bw()
Run Code Online (Sandbox Code Playgroud)
这产生了以下图,由于事实st_sample将点散布到多边形的范围内,因此我认为它看起来很混乱。
像在您发布的示例中那样,使点在每个多边形中更居中似乎更好。为此,我们可以根据要在其中绘制点的数量来重新缩放多边形。在下面的代码中,如果多边形在(1)内具有最少的点,则将其缩小90%,如果多边形在(1)中具有最多的点,则将其缩小20%。
# put values on scale between 0 and 1
scale_fact <- (max(schools_geo$value) - schools_geo$value) / (max(schools_geo$value) - min(schools_geo$value))
# re-scale between 0.2 and 0.9
scale_fact <- scale_fact * (0.9 - 0.2) + 0.2
# reverse the scale
scale_fact <- max(scale_fact) + min(scale_fact) - scale_fact
# apply the scale factor
schools_centroid <- st_geometry(st_centroid(schools_geo))
schools_geo_rescaled <- (st_geometry(schools_geo) - schools_centroid) * scale_fact + schools_centroid
school_pts <- schools_geo_rescaled %>%
st_sf(crs = 3301) %>%
bind_cols(value = schools_geo$value) %>%
st_sample(size = .$value, type = 'hexagonal')
# plot
schools_geo %>%
ggplot()+
geom_sf()+
geom_sf(data=school_pts, size = .8)+
theme_bw()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |