如何绘制含缺失值(NA)的柱状图?Comtrade数据可视化问题
问题解决:Comtrade数据可视化中NA值导致国家条形消失的问题
问题描述
使用comtradr包从联合国Comtrade数据库拉取数据并可视化,完成数据抓取与重塑后,印度、美国的部分数据行存在NA值,导致这两个国家的条形从柱状图中消失。尝试在geom_bar参数中添加na.rm=TRUE未解决问题,还收到两条「Removed 2 rows containing missing values (position_stack)」的警告。
原因分析
问题出在数据聚合阶段而非绘图阶段:aggregate()函数遇到分组内的NA值时,会直接返回该分组的NA结果,最终生成的df_import2和df_export2中,印度、美国的Count字段为NA。ggplot绘制时会自动移除含NA的行,而geom_bar中的na.rm=TRUE仅处理绘图层的NA,无法解决源头数据的NA问题。
解决方案
在数据聚合时直接忽略分组内的NA值,通过mean(..., na.rm=TRUE)计算有效平均值。同时用tidyverse语法简化代码逻辑,具体修改如下:
修改后的完整代码
# Notes.------------------------------------------------------------------------ options(scipen=999) # Packages.--------------------------------------------------------------------- library(tidyverse) library(comtradr) library(patchwork) # Extract export data with query.----------------------------------------------- df_a <- ct_search( reporters = c("China", "USA", "India", "Germany"), partners = "World", trade_direction = trade_list, freq = "annual", commod_codes = "2501", type = "goods" ) df_b <- ct_search( reporters = c("Australia", "Canada", "Chile", "Mexico"), partners = "World", trade_direction = trade_list, freq = "annual", commod_codes = "2501", type = "goods" ) df_c <- ct_search( reporters = c("Russian Federation", "Brazil"), partners = "World", trade_direction = trade_list, freq = "annual", commod_codes = "2501", type = "goods" ) # Select relevant columns & join datasets.--------------------------------------- df <- bind_rows(df_a, df_b, df_c) %>% select(year, qty, reporter, trade_flow) # 数据聚合时忽略NA值,计算有效平均值 df_import2 <- df %>% filter(trade_flow == "Import") %>% group_by(reporter) %>% summarise(Count = mean(qty, na.rm = TRUE) / 1000) %>% rename(Country = reporter) df_export2 <- df %>% filter(trade_flow == "Export") %>% group_by(reporter) %>% summarise(Count = mean(qty, na.rm = TRUE) / 1000) %>% rename(Country = reporter) # Build plots from extracted data.---------------------------------------------- import_plot <- ggplot(data = df_import2, aes(x = reorder(Country, Count), y = Count)) + geom_bar(stat = "identity", fill = "lightblue") + coord_flip() + theme_bw() export_plot <- ggplot(data = df_export2, aes(x = reorder(Country, Count), y = Count)) + geom_bar(stat = "identity", fill = "#de4048") + coord_flip() + theme_bw() import_plot / export_plot
关键修改说明
- 在
summarise()计算平均值时加入na.rm=TRUE,确保分组内存在NA值时仍能生成有效均值,避免返回NA结果。 - 用
group_by()+summarise()替代aggregate(),代码更简洁易读,符合tidyverse工作流。 - 绘图时无需再添加
na.rm=TRUE,因为数据已无NA值,警告会自动消失,印度、美国的条形将正常显示。
内容的提问来源于stack exchange,提问作者Jay Bee
相关产品推荐
相关产品推荐

