[英]Multiple x-axis labels for time-series data
我可以使用ggplot2
绘制时间序列数据。 但是,我想突出显示季节性信息以及时间序列数据。
这是我的代码:
library(zoo)
library(ggplot2)
a <- read.table(text = "
Season Quarter Sales
Season1 2014Q1 20
Season1 2014Q2 40
Season1 2014Q3 60
Season1 2014Q4 80
Season2 2015Q1 30
Season2 2015Q2 40
Season2 2015Q3 80
Season3 2015Q4 90
Season3 2016Q1 100
Season3 2016Q2 120
Season3 2016Q3 140
", header = TRUE, sep = "")
a$Quarter<-as.yearqtr(a$Quarter)
a$Quarter<-as.Date(a$Quarter)
ggplot(data=a,aes(x=Quarter, y=Sales)) +
geom_line()
现在,我要标记第1季,第2季等的构成。执行此操作的一种方法是使用color
或linetype
。 但是,这似乎不起作用,因为它破坏了时间序列的连续性。
# doesn't work...
ggplot(data=a,aes(x=Quarter, y=Sales)) +
geom_line(aes(linetype=Season))
另一方面,我喜欢Excel 只需单击两次即可绘制该图形的方式。 它会创建一个漂亮的图形,在x轴上显示季节性信息以及日期。 它实际上创建了一个三层的x轴。
关于这个主题,我有两个问题:
问题1:使用ggplot
,如何在ggplot
使用linetype
(或color
)创建连续图形(即不间断)? 我更喜欢linetype
不是color
。 作为示例并回答评论:这是我使用另一组数据创建的图形。
df <- data.frame(x = 1:3, y = 1:3, z = c(1,3,5))
ggplot(df, aes(x, y, color = factor(z))) +
geom_line(aes(group = 1))
我无法为时间序列数据复制上述行为。 这是我从上面的代码中得到的图形:
问题2:如何使用ggplot
创建多级x轴(类似于Excel为我所做的事情),以显示带有日期的季节性信息? {请参阅我创建的Excel图形。}我不想使用此选项创建图例。 我还想澄清一下,如果我们不通过采用annotate
(或可能是geom_text
)方法通过调整和重新调整x和y值使其适合这些多级标签来使用黑客方法,我将不胜感激。 这是因为它违反了使用编程语言绘制图形的目的,并且随着数据的更改而无效。
如有任何疑问,请告诉我。 非常感谢您的想法。 我绝对是ggplot2
初学者。 从Excel和STATA过渡到ggplot
仅仅只有5天。 因此,对于我的问题过于基本,我深表歉意。
我在SO上研究了这个主题,没有什么可以做得足够接近了。 例如, 此线程讨论的是更改滴答声,但不是我想要的。
您可以很容易地重新创建Excel图的意图 ,如下所示:
library(plyr)
ss <- ddply(a, .(Season), summarize, date = min(Quarter))
ss$date <- as.numeric(ss$date)
ggplot(data=a,aes(x=Quarter,y=Sales)) +
geom_line() +
geom_vline(data = ss, aes(xintercept = date), colour = "grey50") +
geom_text(data = ss, aes(x = as.Date(date), y = Inf, label = Season),
hjust = -0.1, vjust = 1.1)
使用颜色时,行中断的一种解决方法是在色线之外绘制一条连续的灰线:
ggplot(data=a,aes(x=Quarter,y=Sales)) +
geom_line(colour = "grey80") +
geom_line(aes(colour = Season)) +
geom_vline(data = ss, aes(xintercept = date), colour = "grey50") +
geom_text(data = ss, aes(x = as.Date(date), y = Inf, label = Season),
hjust = -0.1, vjust = 1.1)
一种解决方法是,当“ Season
列中发生更改时,修改数据框,即向数据框添加其他行。 像这样:
library("plyr")
# add additional lines at end of every season
tmp <- ddply(a, "Season",
function(x) {
x[nrow(x)+1, "Season"] <- x[nrow(x), "Season"]
x
})
# fill NA values with values of next season
tmp$Quarter <- na.locf(tmp$Quarter, fromLast=TRUE, na.rm=FALSE)
tmp$Sales <- na.locf(tmp$Sales, fromLast=TRUE, na.rm=FALSE)
tmp <- na.omit(tmp) # drop last line
tmp
# Season Quarter Sales
# 1 Season1 2014-01-01 20
# 2 Season1 2014-04-01 40
# 3 Season1 2014-07-01 60
# 4 Season1 2014-10-01 80
# 5 Season1 2015-01-01 30
# 6 Season2 2015-01-01 30
# 7 Season2 2015-04-01 40
# 8 Season2 2015-07-01 80
# 9 Season2 2015-10-01 90
# 10 Season3 2015-10-01 90
# 11 Season3 2016-01-01 100
# 12 Season3 2016-04-01 120
# 13 Season3 2016-07-01 140
ggplot(data=tmp, aes(x=Quarter, y=Sales)) +
geom_line(aes(colour=Season, linetype=Season))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.