使用ggplot2绘制世界地图:如何展示各国全部transportation_type对应的颜色分布
解决ggplot2世界地图仅显示单一交通类型的问题
问题根源
你遇到的问题主要有两个关键点:
- 变量名笔误:代码里定义了
world1但绘图时调用了w_d1,这会导致运行错误(你能显示driving大概率是实际运行时临时修正了,但这个细节需要统一)。 - 核心逻辑问题:当用
left_join把地图坐标数据和多交通类型的mapData连接后,同一个国家的每个地理坐标点会重复对应所有该国家的交通类型。直接用geom_polygon绘制时,同一个多边形会被多次渲染,最终只保留最后绘制的那个交通类型的颜色(也就是你看到的仅显示driving)。
最优解决方案
最清晰直观的方式是使用分面(facet),为每个交通类型单独生成一张地图,这样能完整展示每种方式的分布。如果一定要在同一张图里展示,可以用透明度叠加,但分面的可读性更强。
修改后的完整代码
library(ggplot2) library(dplyr) library(maps) # 加载世界地图坐标数据 world <- map_data("world") # 模拟你的mapData(实际使用时替换为你的数据集读取代码,比如read.csv("your_data.csv")) mapData <- data.frame( region = c("Albania", "Albania", "Argentina", "Argentina", "Australia", "Australia", "Australia", "Austria"), transportation_type = c("driving", "walking", "driving", "walking", "driving", "transit", "walking", "driving"), country = c("Albania", "Albania", "Argentina", "Argentina", "Australia", "Australia", "Australia", "Austria") ) # 正确连接地图数据与交通类型数据 world_joined <- left_join(world, mapData, by = "region") # 使用分面展示每个交通类型的分布地图 ggplot(world_joined, aes(x = long, y = lat, group = group)) + geom_polygon(aes(fill = transportation_type), color = "grey") + # 按交通类型分面,每个类型一张图 facet_wrap(~transportation_type) + # 应用罗宾逊投影,优化世界地图的视觉效果 coord_map("robinson") + # 美化主题,隐藏冗余元素 theme_minimal() + labs(title = "全球交通方式分布", fill = "交通类型") + theme( axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank() )
可选:单图叠加展示方案
如果需要在同一张图里展示所有交通类型,可以通过设置不同透明度叠加绘制,但注意颜色混合可能影响可读性:
ggplot(world_joined, aes(x = long, y = lat, group = group)) + # 按交通类型分层绘制,设置不同透明度 geom_polygon(data = subset(world_joined, transportation_type == "driving"), aes(fill = "driving"), color = "grey", alpha = 0.3) + geom_polygon(data = subset(world_joined, transportation_type == "walking"), aes(fill = "walking"), color = "grey", alpha = 0.3) + geom_polygon(data = subset(world_joined, transportation_type == "transit"), aes(fill = "transit"), color = "grey", alpha = 0.3) + # 自定义颜色映射 scale_fill_manual(values = c("driving" = "#E69F00", "walking" = "#56B4E9", "transit" = "#009E73")) + coord_map("robinson") + theme_minimal() + labs(title = "全球交通方式叠加分布", fill = "交通类型") + theme(axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank())
内容的提问来源于stack exchange,提问作者Cloudmugu
相关产品推荐
相关产品推荐

