如何使用R在地图上可视化各选区脱欧/留欧得票差值
英国脱欧公投选区得票差可视化修复方案
原代码核心错误
- 未计算脱欧/留欧得票差值,错误将两个变量同时传入
fill映射,不符合ggplot2映射规则,后者传入的remain_hanretty不会被识别为填充映射参数 - 混淆
fill(面填充)和colour(线条/点颜色)美学标度,后续设置的scale_colour_brewer、scale_color_gradient仅控制选区边框颜色,完全不会作用于选区填充色 - 同时加载两个互相冲突的颜色标度,且未使用适配正负值的发散配色逻辑,无法实现"留欧-持平-脱欧"的三色渐变效果
- 数据处理阶段的
group_by步骤无实际聚合作用,属于冗余代码 - 错将适用于离散变量的
scale_colour_brewer用在连续数值的填充映射上,无法正常渲染配色
修正后可直接运行的代码
library(tidyverse) library(sf) library(parlitools) # 读取处理数据,剔除北爱尔兰 data_gb <- bes_2019 %>% filter(region != "Northern Ireland") # 提取所需字段,计算得票差值:正值=脱欧派得票占优,负值=留欧派得票占优 voting <- data_gb %>% select(constituency_name, region, ons_const_id, leave_hanretty, remain_hanretty) %>% mutate(vote_diff = leave_hanretty - remain_hanretty) # 关联选区边界空间数据 voting <- cons_outline %>% inner_join(voting, by = c("pcon19cd" = "ons_const_id")) # 绘图 voting %>% ggplot() + geom_sf(aes(fill = vote_diff), colour = "#eeeeee", size = 0.01) + coord_sf(crs = 27700, datum = NA) + # 发散配色设置:中点对应差值0(两派持平),调用BrBG棕-蓝发散色板适配连续值 scale_fill_distiller( palette = "BrBG", direction = 1, midpoint = 0, name = "得票差值\n(脱欧-留欧)" ) + theme_minimal()
如果需要自定义配色,可将scale_fill_distiller替换为scale_fill_gradient2,手动指定低(留欧)、中(持平)、高(脱欧)对应的色值即可。
效果参考
- 原代码实际运行输出:

- 目标实现效果:

内容的提问来源于stack exchange,提问作者Liz
相关产品推荐
相关产品推荐

