繁体   English   中英

多个x轴标签用于时间序列数据

[英]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()

这很有效,因为我能够绘制时间序列数据。 plot1

现在,我要标记第1季,第2季等的构成。执行此操作的一种方法是使用colorlinetype 但是,这似乎不起作用,因为它破坏了时间序列的连续性。

# doesn't work...
ggplot(data=a,aes(x=Quarter, y=Sales)) +
       geom_line(aes(linetype=Season))

plot2

另一方面,我喜欢Excel 只需单击两次即可绘制该图形的方式 它会创建一个漂亮的图形,在x轴上显示季节性信息以及日期。 它实际上创建了一个三层的x轴。

plot3

关于这个主题,我有两个问题:

问题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))

ggplot输出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM