【问题标题】:ggplot date scales shifts one month forwardggplot 日期刻度向前移动一个月
【发布时间】:2017-08-15 20:45:16
【问题描述】:

我确信这很容易,但我无法从其他帖子中找到解决方案。

如果我运行这个:

test <- data.frame(dates = as.Date(c("2016-10-31","2016-11-30", "2016-12-31", "2017-01-31")), 
                   values = c(1, 2, 3, 4))
ggplot(test, aes(x = dates, y = values)) +
  geom_bar(position="stack", stat = "identity") + 
  scale_x_date(breaks = date_breaks("1 months"),labels = date_format("%b-%y"))

我明白了:

如您所见,X 轴上的所有日期都向前移动到下个月。 我尝试按照其他地方的建议使用 scales 包,但它没有改变任何东西。

我可以通过调整日期来解决这个问题:

test$dates <- as.Date(format(test$dates, "%Y-%m-1"))

提供这个(不使用scale_x_date 位):

但我确信有一种优雅的方法可以规避这个问题。

【问题讨论】:

  • 日期不会向前移动,休息时间正好在新月的开始,您的条形图是在此之前 1 天绘制的。如果您仔细观察,您会发现这些条并不完全位于休息点上方,它们会稍微移动到每个休息点的左侧。
  • 看起来是真的。不幸的是,它并没有解决问题。同样奇怪的是(请参阅更新的 OP),基于“1/m/y”的图表将标签放在中间。所以我不确定你的分析。

标签: r date ggplot2


【解决方案1】:

我自己在制作月度时间序列图表时遇到了这个问题。我的解决方案:将日期向量添加到“breaks =”部分。

scale_x_date(breaks = test$dates, labels = date_format("%b-%y"))

注意:当我尝试“data_breaks”(如您的代码)时,我无法让它在许多不同的排列下工作。日期向量仅适用于“breaks”,不适用于“data_breaks”

  ggplot(test, aes(x = dates, y = values)) +
      geom_bar(position="stack", stat = "identity") + 
      scale_x_date(breaks = test$dates, labels = date_format("%b-%y"))

附:这是我第一次尝试在这里回答问题。我知道这个问题很老了,但希望这会对某人有所帮助!

【讨论】:

    【解决方案2】:

    当您将dates 转换为as.POSIXct 并使用scale_x_datetime 而不是scale_x_date 时,标签是正确的(虽然不知道为什么):

    ggplot(test, aes(x = as.POSIXct(dates), y = values)) +
      geom_bar(position="stack", stat = "identity") + 
      scale_x_datetime(breaks = date_breaks("1 months"), labels = date_format("%b-%y"))
    

    【讨论】:

    • 真的很困惑为什么会这样,因为条形图仍然稍微提前于休息时间,所以休息时间仍然在下个月的开始,但取上个月的标签。
    • 更有趣的是:它对我没有任何作用。将as.POSIXct() 应用于日期,然后按照建议使用scale_x_datetime,我不断得到相同的图表(x 标签的更改)。这与 TZ 有什么关系吗?
    • 可能,老实说,R 中的日期和时区对我来说永远是个谜,所以恐怕我帮不上忙:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2016-12-28
    • 2023-04-07
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多