使用季度日期格式缩放x轴

时间:2018-05-24 10:12:02

标签: r ggplot2

我使用ggplot库在R中创建了一个图:

library(ggplot2)
ggplot(df, aes(x = yQ, y = value, group =1)) +
geom_line(aes(color = variable), size = 1) +
   scale_color_manual(values = c("#00AFBB", "#E7B800"))

我得到了我想要的情节,但唯一的问题是变量yQ值的格式为:

 1990Q1
 1900Q2
 1990Q3
 1990Q4
 ......
 ......
 2017Q1
 2017Q2
 2017Q3
 2017Q4

因为有很多年,x轴标签不能清楚地显示所有日期(它们重叠)。 因此,我希望x轴标签每5年仅显示Q1Q3。 所以我希望x轴是这样的:

    1990Q1   1990Q3   1995Q1   1995Q3 ......  2015Q1 2015Q3

我尝试使用scale_x_date,但我的日期不是日期格式(例如1990Q1),因此这不起作用。我该如何解决?

4 个答案:

答案 0 :(得分:1)

使用函数zoo::as.yearqtrzoo包)来处理季度日期。

生成示例数据:

year <- 1990:2000
quar <- paste0("Q", 1:4)
foo <- as.vector(outer(year, quar, paste0))
data <- data.frame(dateQ = foo, Y = rnorm(length(foo)))
head(data)

   dateQ           Y
1 1990Q1 -0.09944705
2 1991Q1  0.14493910
3 1992Q1  0.54856787
4 1993Q1  1.12966224
5 1994Q1 -0.93539302
6 1995Q1  0.24772265

将季度日期转换为“正常”日期:

data$dateNorm <- as.Date(zoo::as.yearqtr(data$dateQ))
head(data)
   dateQ           Y   dateNorm
1 1990Q1 -0.09944705 1990-01-01
2 1991Q1  0.14493910 1991-01-01
3 1992Q1  0.54856787 1992-01-01
4 1993Q1  1.12966224 1993-01-01
5 1994Q1 -0.93539302 1994-01-01
6 1995Q1  0.24772265 1995-01-01

它将Q1/2/3/4设置为1月/ 4月/ 7月/ 10月的第一天。

data[grep("1991", data$dateQ), ]
    dateQ          Y   dateNorm
2  1991Q1  0.1449391 1991-01-01
13 1991Q2  1.5878678 1991-04-01
24 1991Q3 -0.1071823 1991-07-01
35 1991Q4  2.2905729 1991-10-01

现在您可以用Date格式绘制它或执行其他计算。

library(ggplot2)
ggplot(data, aes(dateNorm, Y)) +
    geom_line()

enter image description here

答案 1 :(得分:1)

该问题不提供可重现的输入,但使用下面的注释中的df使用ggplot的autoplot.zoo通用的autoplot方法,我们可以写:

library(ggplot2)
library(zoo)

z <- read.zoo(df, index = "yQ", FUN = as.yearqtr)
autoplot(z) + scale_x_yearqtr()

注意

测试输入 -

df <- data.frame(yQ = c("1990Q1", "1990Q2", "1990Q3", "1990Q4"), value = 1:4)

答案 2 :(得分:1)

zoo::format.yearqtr()函数很容易与ggplot2一起使用。

尝试

scale_x_date(labels = function(x) zoo::format.yearqtr(x, "%YQ%q"))

答案 3 :(得分:0)

你可以

  • 使用scale_x_discrete(breaks = ..., labels = ...)
  • 操纵x轴断点和标签
  • 使用theme(axis.text.x = element_text(angle = ...))
  • 更改文字的角度

我生成了一些数据

Combs <- expand.grid(1990:2017, c("Q1", "Q2", "Q3", "Q4"))
df <- data.frame(
    yQ = sort(apply(Combs, 1, paste, collapse="")),
    value = runif(112)
)

在第一个示例中,我使用逻辑向量对您想要的yQ值进行分组 - 并更改文本的角度

library(ggplot2)
pattern <- c(T, F, T, F, rep(F, 16))
ggplot(df, aes(x = yQ, y = value, group =1)) +
geom_line(aes(color = "red"), size = 1) +
scale_x_discrete(breaks = df$yQ[pattern], labels = df$yQ[pattern]) +
theme(axis.text.x = element_text(angle=90))

但是请注意,没有显示未被break指定的刻度标记 - 所以替代方法是将yQ值复制到向量中并生成non-relevant years = ""

xVec <- as.character(df$yQ)
xVec[pattern==F] <- ""
ggplot(df, aes(x = yQ, y = value, group =1)) +
geom_line(aes(color = "red"), size = 1) +
scale_x_discrete(breaks = df$yQ, labels = xVec) +
theme(axis.text.x = element_text(angle=90))