You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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变量,或变量处于未正确处理的状态。

解决步骤

  1. 修正数据处理的变量一致性
    统一变量名,确保在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无需重复指定格式,避免冗余操作。

  2. 兼容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))
      
  3. 验证数据完整性
    检查xyz1中的Discharge.Date是否存在缺失值或异常值:

    summary(xyz1$Discharge.Date)
    table(xyz1$Discharge.Date)
    

    若存在缺失值,过滤后再绘图:

    xyz1 <- xyz1 %>% drop_na(Discharge.Date)
    

内容的提问来源于stack exchange,提问作者Bhargav Vemulapalli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:49:56