在R中按邮政编码绘制美国地图点:调整阿拉斯加夏威夷嵌入位置
解决方案
1. 对齐阿拉斯加、夏威夷的点与地图位置
fifty_states数据集里的阿拉斯加(AK)和夏威夷(HI)已经做了缩放移位处理,所以你的邮编点数据也得同步转换坐标,才能让点落在对应的嵌入区域:
先写个坐标转换函数,对AK和HI的经纬度做缩放和位移:
transform_ak_hi <- function(df) { df %>% mutate( lng = case_when( state == "AK" ~ lng * 0.3 + 180, # AK缩放0.3倍,右移到本土右下角 state == "HI" ~ lng + 50, # HI右移 TRUE ~ lng ), lat = case_when( state == "AK" ~ lat * 0.3 + 20, # AK下移 state == "HI" ~ lat + 10, # HI上移 TRUE ~ lat ) ) }
然后把这个函数应用到你的数据上再绘图,同时加上coord_map()保证投影匹配:
loc_full2 %>% filter(cns2 != 0) %>% transform_ak_hi() %>% ggplot() + geom_polygon(data = fifty_states, aes(x = long, y = lat, group = group), color = "black", fill = "white") + geom_point(aes(x = lng, y = lat, size = cns2), alpha = .3, col = "grey10") + # 处理图例和整数刻度的部分 scale_size_continuous( name = "# CNM", range = c(2, 10), # 强制生成整数刻度 breaks = function(x) seq(floor(x[1]), ceiling(x[2]), by = 1), labels = function(x) as.integer(x) ) + coord_map() + theme_void()
如果AK/HI的位置还是不对,微调transform_ak_hi里的缩放倍数和位移值就行,比如调整AK的+180改成+175,或者缩放倍数改成0.25,直到和目标图对齐。
2. 把图例刻度改成整数
上面的scale_size_continuous里已经包含了处理逻辑:
breaks参数根据数据的最小/最大值生成连续的整数断点labels把断点转为整数格式,避免小数
如果你的cns2数值范围固定,也可以直接写死断点,比如breaks = c(1,3,5,7,9),更精准。
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

