Malaria Atlas Project绘图自定义问题:autoplot报错与图层叠加故障
问题解决与可修改源码
1. 解决autoplot(raster)参数被忽略问题
默认的autoplot.raster方法不支持legend_title这类自定义参数,必须使用MAP包的autoplot.MAPraster方法,调用前要确保传入的是MAPraster对象(普通栅格可通过as.MAPraster()转换)。
2. 修复autoplot.MAPraster源码的subset错误
原源码中object[object$raster_name == rastername,]的错误,是因为object是S4对象,不能直接用数据框索引方式。以下是修复后的可修改源码,改用槽提取数据:
autoplot.MAPraster <- function(object, rastername = NULL, legend_title = "Value", fill_scale = ggplot2::scale_fill_viridis_c(), ...) { # 处理默认栅格名称 if (is.null(rastername)) { rastername <- names(object@rasters)[1] } # 提取对应栅格数据(修复subset错误) raster_data <- object@rasters[[rastername]] %>% raster::as.data.frame(xy = TRUE) %>% dplyr::rename(value = !!rastername) # 构建ggplot图形 p <- ggplot2::ggplot() + ggplot2::geom_raster(data = raster_data, ggplot2::aes(x = x, y = y, fill = value)) + fill_scale + ggplot2::labs(fill = legend_title) + ggplot2::coord_equal() + ggplot2::theme_minimal() return(p) }
3. 叠加MDG行政边界的group错误解决
用getShp获取的shape建议转成sf对象,用geom_sf替代geom_polygon,避免group列缺失问题;若坚持用geom_polygon,需先将shape转成带group列的数据框。
完整示例代码
library(malariaAtlas) library(ggplot2) library(sf) library(dplyr) # 获取MAP栅格数据(示例) raster_data <- getRaster(surface = "Plasmodium falciparum PR2-10", extent = getShp(country = "Madagascar", admin_level = 0)) map_raster <- as.MAPraster(raster_data) # 获取MDG一级行政边界 mdg_admin1 <- getShp(country = "Madagascar", admin_level = 1) # 调用修改后的autoplot.MAPraster p <- autoplot(map_raster, legend_title = "P. falciparum PR2-10", fill_scale = scale_fill_viridis_c(option = "magma")) # 推荐:用geom_sf叠加边界 p + geom_sf(data = mdg_admin1, color = "white", fill = NA, linewidth = 0.5) # 备选:用geom_polygon叠加(需转数据框) mdg_admin1_df <- ggplot2::fortify(mdg_admin1) p + geom_polygon(data = mdg_admin1_df, aes(x = long, y = lat, group = group), color = "white", fill = NA, linewidth = 0.5)
关键说明
- 修复后的源码直接提取
MAPraster对象的rasters槽数据,避免了原代码的索引错误。 geom_sf处理空间数据更稳定,无需手动维护group列,是优先推荐的方式。- 修改后的
autoplot.MAPraster支持直接传入legend_title、自定义填充比例尺等参数,不会出现参数被忽略的警告。
内容的提问来源于stack exchange,提问作者Excelsior
相关产品推荐
相关产品推荐

