【问题标题】:ggplot - x-axis shows data beyond specified range for longer time periodsggplot - x 轴显示超出指定范围的较长时间段的数据
【发布时间】:2020-02-19 00:59:49
【问题描述】:

以下是一家公司按两个同类群组划分的净收入示例数据:

data <- data.frame(dates = rep(seq(as.Date("2000/1/1"), by = "month", length.out = 48), each = 2),
                   revenue = rep(seq(10000, by = 1000, length.out = 48), each = 2) * rnorm(96, mean = 1, sd = 0.1),
                   cohort = c("Group 1", "Group 2"))

我可以显示一年的数据,它会返回我期望的结果:

start = "2000-01-01"
end = "2000-12-01"

ggplot(data, aes(fill = cohort, x = dates, y = revenue)) +
    geom_bar(stat = "identity", position = position_dodge(width = NULL)) +
    xlab("Month") + 
    ylab("Net Revenue") +
    geom_text(aes(label = round(revenue, 0)), vjust = -0.5, size = 3, position = position_dodge(width = 25)) + 
    scale_x_date(date_breaks = "1 month", limits = as.Date(c(start, end))) +
    ggtitle("Monthly Revenue by Group") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 60, hjust = 1), plot.title = element_text(hjust = 0.5)) +
    scale_fill_manual(values=c("#00BFC4", "#F8766D"))

但如果我将日期范围扩大到两年或更长时间并重新运行图表,它会在 x 轴两侧显示额外的月份,尽管在 y 轴上没有显示任何信息。

start = "2000-01-01"
end = "2001-12-01"
#rerun the ggplot code from above

请注意 1999-12-01 和 2002-01-01 的不存在数据点。为什么会出现这些以及如何删除它们?

【问题讨论】:

    标签: r ggplot2 graph


    【解决方案1】:

    许多(全部?)scale_* 函数将expand= 作为参数。在 R 图中(包括基数和 ggplot2)中很常见,将轴稍微扩展一点(我相信每端 4%),我认为这样就不会使任何线/点都被“框”挤压边界。

    如果你包含expand=c(0,0),你会得到你想要的。

    (顺便说一句:您的括号不匹配。已在此处修复。)

    ggplot(data, aes(fill = cohort, x = dates, y = revenue)) +
        geom_bar(stat = "identity", position = position_dodge(width = NULL)) +
        xlab("Month") + 
        ylab("Net Revenue") +
        geom_text(aes(label = round(revenue, 0)), vjust = -0.5, size = 3, position = position_dodge(width = 25)) + 
        scale_x_date(date_breaks = "1 month", limits = as.Date(c(start, end)), expand = c(0, 0)) +
        ggtitle("Monthly Revenue by Group") +
        theme_minimal() +
        theme(axis.text.x = element_text(angle = 60, hjust = 1), plot.title = element_text(hjust = 0.5)) +
        scale_fill_manual(values=c("#00BFC4", "#F8766D"))
    

    【讨论】:

    • (默认扩展取决于比例;连续比例为 5%,离散为 0.6 个单位,至少在 ggplot 中。)
    • 我怀疑我脑子里的 4% 只是基于基本图形。谢谢!
    【解决方案2】:

    我不确定到底是什么问题,但是如果您从 x 轴上的“日期”类更改为任何其他类,它似乎可以按预期工作。在将特定范围内的数据传递给ggplot 之前,还会对其进行过滤。

    例如在这种情况下将日期更改为月-年格式,

    library(dplyr)
    library(ggplot2)
    
    start = as.Date("2000-01-01")
    end = as.Date("2001-12-01")
    all_fac <- c(outer(month.abb, 2000:2001, paste, sep = "-"))
    
    data %>%
      filter(between(dates, start, end)) %>% 
      mutate(dates = factor(format(dates, "%b-%Y"),levels = all_fac)) %>% 
      ggplot() + aes(fill = cohort, x = dates, y = revenue) +
      geom_bar(stat = "identity", position = "dodge") +
      xlab("Month") + 
      ylab("Net Revenue") +
      geom_text(aes(label = round(revenue, 0))) + 
      ggtitle("Monthly Revenue by Group") +
      theme_minimal() +
      theme(axis.text.x = element_text(angle = 60, hjust = 1), plot.title = 
      element_text(hjust = 0.5)) +
      scale_fill_manual(values=c("#00BFC4", "#F8766D"))
    

    请美化/更改条上的标签。

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多