使用yearmon变量绘制ggplot柱状图时条形方向异常问题咨询
问题描述
尝试用R的ggplot绘制柱状图,计划将lubridate包的yearmon类型变量设为x轴,数值变量Cases设为y轴。执行代码后生成的图表中,条形从y轴起始而非x轴;但使用原始日期变量Discharge.Month作为x轴时,图表显示正常。且一年前编写的该脚本可正常生成图表,现出现异常。
数据处理代码
# 为Health数据框创建yearmon变量 Discharge.Date <- ym(Health$Discharge.Month) Health <- mutate(Vizient, Discharge.Date, .before = Hospital) Health$Discharge.Date <- as.yearmon(Health$Discharge.Date, "%Y-%m")
# 筛选特定医院"xyz"的数据 xyz <- filter(Vizient, Hospital == "xyz") xyz1 <- as.data.frame(xyz)
绘图代码
ggplot(xyz1, aes(x=Discharge.Date, y=Cases)) + geom_bar(stat = "identity") + scale_x_yearmon() + xlab("Discharge Month") + ggtitle("xyz Monthly ACS Cases") + theme(plot.title = element_text(hjust = 0.5))
问题原因及解决办法
核心原因:数据处理中的变量名混淆
代码存在明显的变量名错误:
- 初始基于
Health数据框生成Discharge.Date,但后续mutate操作却调用了Vizient数据框,最终将结果赋值给Health。这导致Health被替换为Vizient添加Discharge.Date后的版本,而后续筛选的是原始Vizient数据框——该数据框中并未包含你生成的Discharge.Date变量,或变量处于未正确处理的状态。
解决步骤
修正数据处理的变量一致性
统一变量名,确保在Health数据框上完成所有处理,再从中筛选目标医院数据:# 修正:基于Health数据框添加yearmon变量(用管道操作更清晰) Health <- Health %>% mutate(Discharge.Date = ym(Discharge.Month) %>% as.yearmon(), .before = Hospital) # 从处理好的Health中筛选目标医院数据 xyz1 <- Health %>% filter(Hospital == "xyz") %>% as.data.frame()注:
ym()会直接解析YYYY-MM格式的日期,后续转yearmon无需重复指定格式,避免冗余操作。兼容yearmon格式的版本变化
若修正变量后问题仍存在,可能是scales包版本更新导致scale_x_yearmon()行为变化,可尝试两种方案:- 将yearmon转为日期型后绘图:
ggplot(xyz1, aes(x = as.Date(Discharge.Date), y = Cases)) + geom_bar(stat = "identity") + scale_x_date(date_labels = "%Y-%m", date_breaks = "1 month") + xlab("Discharge Month") + ggtitle("xyz Monthly ACS Cases") + theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 45, hjust = 1)) - 指定
scale_x_yearmon()的格式参数:ggplot(xyz1, aes(x=Discharge.Date, y=Cases)) + geom_bar(stat = "identity") + scale_x_yearmon(format = "%Y-%m") + xlab("Discharge Month") + ggtitle("xyz Monthly ACS Cases") + theme(plot.title = element_text(hjust = 0.5))
- 将yearmon转为日期型后绘图:
验证数据完整性
检查xyz1中的Discharge.Date是否存在缺失值或异常值:summary(xyz1$Discharge.Date) table(xyz1$Discharge.Date)若存在缺失值,过滤后再绘图:
xyz1 <- xyz1 %>% drop_na(Discharge.Date)
内容的提问来源于stack exchange,提问作者Bhargav Vemulapalli
相关产品推荐
相关产品推荐

