【问题标题】:Change the x axis from days of the year to months将 x 轴从一年中的几天更改为月份
【发布时间】:2021-08-15 15:31:07
【问题描述】:

我有一张图表,显示了多年来不同年份的趋势:

问题是 x 轴由向量 days<-seq(1:366) 表示,但我需要在 x 轴上比较月份。数据框太大,但结构是:

 x    y      group
 1 215.4335  2012
 2 214.1977  2012
 3 212.9618  2012
 4 211.7260  2012
 5 210.4901  2012
 6 209.2543  2012

我的代码是:

ggplot(data_ggp, aes(x, y, col = group)) +            
  geom_line()+
  labs(x = " ", y = " ") +
  scale_color_discrete(name = "Trends")+
  theme_bw() +
  theme(panel.grid.major = element_blank(),panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.text.x = element_text(size = 8.5))

如何用月份而不是一年中的日子来表示我的 x 轴?感谢您的帮助!

【问题讨论】:

  • 如何处理闰年(366天)?例如; 2012 年和 2016 年的第 60 天是 2 月,而其他年份的第 60 天是 3 月
  • 这就是为什么使用从 1 到 366 的序列并在非闰年的年份将 2 月 29 日留空的原因。但是那么x轴就不好了。

标签: r ggplot2 time-series


【解决方案1】:

要获取月份名称,您需要在某处使用Dates。两种选择:将您的数据更改为正确的日期,或者在 breaks=labels= 参数函数中伪造它。我将演示后者。

set.seed(42)
fakedat <- data.frame(x=1:365, y=cumsum(runif(365,0,10)))
head(fakedat)
#   x        y
# 1 1  9.14806
# 2 2 18.51881
# 3 3 21.38021
# 4 4 29.68469
# 5 5 36.10214
# 6 6 41.29310

library(ggplot2)
ggplot(fakedat, aes(x, y)) +
  geom_line()

breakfunc <- function(x) {
  origin <- as.Date("2021-01-01")
  days <- origin + x
  origin <- as.POSIXlt(origin)
  dayseq <- as.POSIXlt(seq(days[1], days[2], by = "day"))
  with(dayseq, yday[mday == 1] + 365*(year[mday == 1] - origin$year ))
}

labelfunc <- function(x) {
  origin <- as.Date("2021-01-01")
  format(origin + x, format = "%b")
}

ggplot(fakedat, aes(x, y)) +
  geom_line() +
  scale_x_continuous(breaks=breakfunc, labels=labelfunc)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2020-01-03
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多