R可视化:geom_quasirandom搭配geom_flag绘制国旗标注报错解决
问题描述
- 场景:R语言初学者使用
ggflags库做国旗标注绘图,运行完整可复现代码可生成整合密度图、箱线图、准随机蜂群图的组合可视化图表,每个5年统计周期内的2个紫色点对应全球人口最多的两个国家:中国、印度。 - 核心需求:将上述两个紫色点替换为中、印两国对应的国旗图标,同时在每个国旗旁附加对应国家代码标注。
- 已尝试操作与报错:调用
ggflags库的geom_flag函数搭配geom_quasirandom生成的散点使用,取消geom_flag相关代码注释后触发固定报错:
Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘grobify’ for signature ‘"NULL"’
- 备选需求:若无法实现国旗替换效果,需为中国、印度设置两种可区分的颜色,且仅通过单次调用
ComboGraph(country_data['isMostPopulous'],'none')函数即可自动添加对应图例。 - 附加材料:问题附完整可复现代码与联合国官方数据源下载地址。
解决方案
国旗标注方案(修复grobify报错)
触发该报错有两个核心原因:
geom_flag要求传入的国家编码为ISO 3166-1 alpha-2 小写格式,且传入数据集不能存在编码缺失值。若将country映射写在全局ggplotaes中,非中印的普通数据点无对应国旗编码,会传入NULL值触发报错。- CRAN上架的旧版
ggflags与ggplot2 3.5.0及以上版本存在兼容性问题,也会触发同类报错。
按以下步骤调整即可实现国旗替换效果:
- 若调整字段后仍报错,先安装最新版
ggflags:
remotes::install_github("rensa/ggflags")
- 提前单独筛选中印两国的数据子集,匹配正确的国旗编码,不要将全量数据传入
geom_flag层:
top2_pop <- country_data |> dplyr::filter(isMostPopulous == TRUE) |> dplyr::mutate(flag_code = dplyr::case_when( country == "China" ~ "cn", country == "India" ~ "in" ))
- 注释掉原代码中绘制中印紫色点的
geom_quasirandom层,新增国旗和标注图层,注意geom_flag的position参数必须和原蜂群图的偏移参数完全一致,保证点位对齐:
ComboGraph(country_data['isMostPopulous'],'none') + ggflags::geom_flag( data = top2_pop, aes(x = period, y = value, country = flag_code), size = 7, position = ggbeeswarm::position_quasirandom(width = 0.2) # 和原蜂群图width参数保持一致 ) + geom_text( data = top2_pop, aes(x = period, y = value, label = toupper(flag_code)), size = 3, nudge_x = 0.12, nudge_y = 0.01 )
备选:中印分色+自动图例方案
如果不需要国旗标注,仅需区分中印点位且自动生成图例,不需要修改ComboGraph函数内部逻辑,只要在原绘图流程中修改中印点位的映射即可:
将原代码中绘制紫色点的geom_quasirandom层替换为以下写法,仅筛选中印数据传入,将color映射到国家字段:
ggbeeswarm::geom_quasirandom( data = ~.x |> dplyr::filter(isMostPopulous == TRUE), aes(x = period, y = value, color = country), size = 3, width = 0.2 ) + ggplot2::scale_color_manual( values = c("China" = "#E60012", "India" = "#FF9933"), name = "全球人口TOP2国家" )
调整后单次调用ComboGraph(country_data['isMostPopulous'],'none')即可自动生成对应颜色的图例,无需额外传参。
内容的提问来源于stack exchange,提问作者Thuc Dao
相关产品推荐
相关产品推荐

