我使用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年仅显示Q1
和Q3
。
所以我希望x轴是这样的:
1990Q1 1990Q3 1995Q1 1995Q3 ...... 2015Q1 2015Q3
我尝试使用scale_x_date
,但我的日期不是日期格式(例如1990Q1),因此这不起作用。我该如何解决?
答案 0 :(得分:1)
使用函数zoo::as.yearqtr
(zoo
包)来处理季度日期。
生成示例数据:
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()
答案 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 = ...)
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))