R Studio使用ggplot2绘制多国新冠新增病例图Y轴数值异常求助
问题原因
你遇到的Y轴数值异常问题,90%以上的概率是new_cases字段的类型异常导致:
- 合并多个国家数据集时,不同子集的
new_cases列类型不统一(比如部分是因子、部分是数值,或者部分字段带千分位逗号等非数字字符),rbind操作会强制把整列转为字符/因子类型,ggplot读取这类字段做Y轴时,会自动解析为因子对应的底层整数编码,最终出现远超实际值的异常范围。 - 第二个常见诱因是列名大小写不匹配:样例数据中国家列名为大写开头的
Location,但绘图代码的aes参数中用的是小写location,R大小写敏感,分组识别失败会导致绘图逻辑异常。
排查步骤
先运行以下代码确认问题点:
# 查看数据集各列的类型,确认new_cases是否为numeric/integer类型 str(new_cases) # 查看new_cases列的实际最大值,确认数据本身是否存在异常值 max(new_cases$new_cases, na.rm = TRUE)
修复方案
步骤1:合并数据集前统一各子集的列名和字段类型
# 统一每个国家子集的列名和字段类型 process_country_df <- function(df) { # 国家列统一改为小写location,避免大小写问题 colnames(df)[colnames(df) %in% c("Location", "country")] <- "location" # 新增病例列统一转为数值型,有非数字字符会自动转为NA df$new_cases <- as.numeric(as.character(df$new_cases)) return(df) } China_Covid_newcases <- process_country_df(China_Covid_newcases) Italy_Covid_newcases <- process_country_df(Italy_Covid_newcases) France_Covid_newcases <- process_country_df(France_Covid_newcases) Singapore_Covid_newcases <- process_country_df(Singapore_Covid_newcases) Sweden_Covid_newcases <- process_country_df(Sweden_Covid_newcases) # 再合并数据集 new_cases_allcountries <- rbind(China_Covid_newcases, Italy_Covid_newcases, France_Covid_newcases, Singapore_Covid_newcases, Sweden_Covid_newcases)
步骤2:优化日期过滤和绘图逻辑
# 日期转换、过滤逻辑 new_cases_allcountries$date <- as.Date(new_cases_allcountries$date, format = "%m-%d-%y") new_cases <- new_cases_allcountries %>% filter(date >= as.Date('2020-03-14') & date <= as.Date('2020-12-01'), # 过滤掉NA和异常负值 !is.na(new_cases), new_cases >= 0) # 绘图时明确指定分组,避免识别异常 New_Cases_Graph <- ggplot(new_cases, aes(x = date, y = new_cases, colour = location, group = location)) + geom_line() + # 可选:手动设置Y轴从0开始,上限自动适配数据最大值 scale_y_continuous(limits = c(0, NA)) New_Cases_Graph
内容的提问来源于stack exchange,提问作者Gracen Pace
相关产品推荐
相关产品推荐

