能否基于含国家感染率的简单数据框在RStudio中创建气泡地图?
完全可以基于现有数据在RStudio中生成符合要求的气泡世界地图
实现核心思路
不需要复杂的地理数据准备,只要把你手头的国家感染率数据,和对应国家的中心点经纬度做匹配,在简易世界底图上叠加大小随感染率动态调整的圆形气泡即可,最终效果会自动实现你要的“英国对应最大气泡、挪威对应最小气泡”的比例效果。
可直接复现的操作流程
- 第一步:安装需要的工具包
在R控制台依次执行安装命令,覆盖绘图、地理数据加载、数据匹配的功能:install.packages(c("ggplot2", "maps", "dplyr", "rnaturalearth", "sf")) - 第二步:导入你提供的示例感染率数据
直接构造和你示例完全一致的数据框即可,后续可以替换成你自己的全量数据:# 你的示例感染率数据 infection_df <- data.frame( country = c("Sweden", "Norway", "USA", "UK"), infection = c(1332, 24, 24224, 53534) ) - 第三步:匹配每个国家的中心经纬度坐标
加载内置的全球国家地理数据集,提取每个国家的中心点经纬度,做好国名匹配映射,和感染率数据拼接:# 加载全球国家简易地理边界 world_sf <- rnaturalearth::ne_countries(scale = "small", returnclass = "sf") # 计算每个国家的中心经纬度 country_lonlat <- world_sf %>% dplyr::mutate( lon = sf::st_coordinates(sf::st_centroid(geometry))[, 1], lat = sf::st_coordinates(sf::st_centroid(geometry))[, 2], country_name = name_long ) %>% dplyr::select(country_name, lon, lat) %>% as.data.frame() # 统一国名匹配规则,解决国名表述差异 country_lonlat$country_name[country_lonlat$country_name == "United States of America"] <- "USA" country_lonlat$country_name[country_lonlat$country_name == "United Kingdom"] <- "UK" # 拼接感染率数据和坐标数据 plot_ready_data <- merge( x = infection_df, y = country_lonlat, by.x = "country", by.y = "country_name" ) - 第四步:绘制气泡世界地图
先加载浅灰色的世界轮廓做底图,再叠加气泡图层,把气泡大小参数绑定到感染率数值上:ggplot() + # 简易世界轮廓底图 borders(fill = "gray92", colour = "gray80", linewidth = 0.2) + # 绘制动态大小的感染率气泡 geom_point( data = plot_ready_data, aes(x = lon, y = lat, size = infection), colour = "#d62828", alpha = 0.6 ) + # 调整气泡的显示范围:最小尺寸对应最低感染数(挪威的24),最大尺寸对应最高感染数(英国的53534) scale_size_continuous(range = c(1, 11), name = "感染数") + # 清理地图多余元素 theme_void()
实操注意点:
- 国名匹配是最容易踩坑的环节,比如你数据里写的"UK"、"USA"这类简称,要提前和地理数据集里的标准国名做映射,不然会出现部分国家的气泡缺失
scale_size_continuous里的range参数可以根据需要调整,只要两个端点的比例和感染数的比例对应,就能实现数值越大气泡越大的视觉效果,不会出现小数值看不见、大数值溢出的问题
内容的提问来源于stack exchange,提问作者user14892366
相关产品推荐
相关产品推荐

