基于ggplot2绘制捷克共和国新冠活跃病例气泡地图的技术实现问题
解决捷克共和国新冠病例气泡地图的两个问题
我来帮你搞定这两个棘手的点:气泡大小不随病例数变化,以及把基础地图和气泡图层合并到一起。
问题1:气泡大小不随活跃病例数变化
你之前的代码只给气泡映射了填充色(fill = InitialInfections),但没把气泡大小和病例数关联起来。要让大小跟着病例数走,需要在aes()里加上size = InitialInfections,同时还可以优化气泡样式让它更清晰:
- 用
shape = 21:这是带填充色和边框的圆形,能同时区分气泡内部颜色和边缘,避免和地图混在一起 - 加
alpha = 0.7:让气泡半透明,不会完全遮挡地图的区域边界
问题2:合并基础地图和气泡图层
不需要分开创建两个ggplot对象,直接在基础地图的代码后面叠加气泡图层就行。因为两者都是基于WGS84坐标系(EPSG:4326),不会出现错位问题。
修改后的完整代码
library(sf) library(ggplot2) library(maps) library(rstudioapi) library(dplyr) library(viridis) # 设置工作目录(仅RStudio适用) setwd(dirname(rstudioapi::getActiveDocumentContext()$path)) getwd() # 读取并处理数据 my_df <- read.csv("CZE_InitialSeedData.csv", header = T) # 确保病例数是数值型(如果你的数据里是字符格式的话) my_df$InitialInfections <- as.numeric(my_df$InitialInfections) # 转换为sf对象,指定经纬度列和坐标系 my_sf <- st_as_sf(my_df, coords = c('Lon', 'Lat'), crs = 4326) # 绘制基础地图 + 气泡图层 worldmap <- map_data("world") worldmap2 <- dplyr::filter(worldmap, region == "Czech Republic") ggplot(worldmap2) + # 绘制捷克共和国基础地图 geom_polygon(aes(long, lat, group = group), col = "black", fill = "white", size = 1) + # 添加气泡图层:同时映射大小和填充色到活跃病例数 geom_sf(data = my_sf, aes(size = InitialInfections, fill = InitialInfections), shape = 21, alpha = 0.7, color = "black") + # 自定义气泡大小范围(可根据你的数据调整数值) scale_size_continuous(name = "Active Cases", range = c(2, 10)) + # 自定义填充色渐变 scale_fill_continuous(name = "Active Cases", low = "pink", high = "red", na.value = "grey50") + # 图表标题和标签 labs(title = "COVID-19 in the Czech Republic", subtitle = "As of July 1, 2021", x = "Longitude", y = "Latitude", caption = "(Source: Ministerstvo zdravotnictví České republiky)") + # 调整图例样式 theme(legend.position = "bottom", legend.text.align = 1, legend.title.align = 0.5) + # 强制使用统一坐标系,避免错位 coord_sf(crs = 4326)
关键修改说明
- 气泡大小映射:在
geom_sf的aes()里添加了size = InitialInfections,让气泡大小随病例数动态变化 - 气泡样式优化:
shape = 21带边框的圆形+半透明效果,让气泡既突出又不遮挡地图 - 图层合并:直接在基础地图的
ggplot对象后叠加geom_sf图层,无需分开创建两个图表 - 数据校验:增加了
as.numeric()确保病例数是数值型,避免映射失效 - 坐标系统一:用
coord_sf(crs = 4326)强制地图和气泡使用相同坐标系,防止错位
如果运行后还有问题,可以检查:
- 你的
Lon/Lat列是否是正确的经纬度数值 InitialInfections列是否有缺失值或非数值内容(可以用summary(my_df$InitialInfections)查看)
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

