使用ggplot2与map_data('state')绘制美国州地图变形的解决方法
美国地图绘制比例错误修正方案
问题描述
我尝试使用ggplot2和usa <- map_data('state')绘制美国各州地图,虽然用coord_fixed()固定了宽高比,但地图仍呈现过宽过扁的错误形态,该如何修正?
当前代码:
ggplot(data = hiv_data, mapping = aes(x= long, y= lat, group = group, fill = delta)) + geom_polygon(color="blue") + scale_fill_gradient2( limits=range(5,-175), low = "blue", high = "white" ) + theme_classic() + labs( x = "", y = "", title = "Change in HIV per 100000 from 2008 to 2020" ) + theme( axis.text.x = element_blank(), axis.text.y=element_blank(), axis.line = element_blank(), axis.ticks = element_blank() ) + coord_fixed()
错误原因
map_data('state')返回的是经纬度坐标,coord_fixed()默认使用1:1的宽高比,但地球是球体,同一经度差的实际距离会随纬度变化,美国本土的纬度范围下,经度方向的距离比纬度方向短,直接用默认比例会导致地图拉伸变形。
修正方案
方案1:使用专业地图投影(推荐)
用coord_map()替代coord_fixed(),它支持多种地图投影,其中**阿尔伯斯投影(albers)**非常适合美国本土区域,能自动校正比例:
ggplot(data = hiv_data, mapping = aes(x= long, y= lat, group = group, fill = delta)) + geom_polygon(color="blue") + scale_fill_gradient2( limits = c(-175, 5), # 替换range(5,-175),直接写范围更清晰 low = "blue", high = "white" ) + theme_classic() + labs( x = "", y = "", title = "2008至2020年每10万人HIV感染率变化" ) + theme( axis.text.x = element_blank(), axis.text.y = element_blank(), axis.line = element_blank(), axis.ticks = element_blank() ) + coord_map(projection = "albers", lat0 = 39, lat1 = 45) # 设置阿尔伯斯投影的标准纬度
方案2:手动调整宽高比
如果坚持用coord_fixed(),可以根据美国本土的经纬度范围手动设置ratio参数,通常设置为1.3左右能得到比较自然的比例:
ggplot(data = hiv_data, mapping = aes(x= long, y= lat, group = group, fill = delta)) + geom_polygon(color="blue") + scale_fill_gradient2( limits = c(-175, 5), low = "blue", high = "white" ) + theme_classic() + labs( x = "", y = "", title = "2008至2020年每10万人HIV感染率变化" ) + theme( axis.text.x = element_blank(), axis.text.y = element_blank(), axis.line = element_blank(), axis.ticks = element_blank() ) + coord_fixed(ratio = 1.3) # 手动调整宽高比
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

