2016-09-19 2 views
3

Мне нужно сделать несколько графиков временных рядов в том же формате, что и на рисунке. Мне интересен сам формат.Как воспроизвести этот сюжет с помощью R?

Буду признателен за вашу помощь.

enter image description here

Вот минимальный пример с имитацией данных

set.seed(1234) 
    nobs<-50 
    x<-rnorm(nobs,0,10) 
    t<-seq(1,nobs) 
    data<-ts(20+x+t, freq=4, start=c(2004,1)) 
    par(family="serif") 
    plot(data, lwd=2, col="blue4", ylab="Millions") 
    title(main="Gráfico 1. Evolución del ...") 
    legend(2010,10,"GDP", col="blue4",lwd=2) 
    abline(lm(data~t), lwd=2, col="red") # This does not work 

enter image description here

+0

что подразумевается под "в том же формате"? – hrbrmstr

+0

Главным образом, те же метки на оси х и у-оси и в том же положении легенды. –

+0

Ну и линия регрессии. Я попробовал что-то подобное с функцией abline, но это не сработало. –

ответ

6

Я предполагаю, что ваши данные являются ts объектом, как в вашем примере. Вот такой подход, используя графику base. Мы начинаем с минимального графика, затем слоя на элементах. Во-первых, минимальный участок, убедившись, чтобы оставить много места на стороне 1 (то есть внизу):

par(mar = c(8, 4, 4, 2), family = "serif", las = 1) 
plot(data, 
    frame = FALSE, 
    xaxt = "n", 
    ylab = "Millones de pesos", xlab = "", 
    main = "Gráfico 1. Evolución del ...", 
    col = "darkblue", lwd = 2) 
fit <- forecast::tslm(data ~ trend) 
lines(fitted(fit), col = "red", lwd = 2) 

Обратите внимание, что выше, мы используем forecast::tslm, чтобы получить временную тенденцию к временных рядов. Теперь добавьте элементы оси x. Я использую mtext вставить клеща метки:

axis(1, at = seq(2003.875, 2015.875, 1), tck = -.2, labels = FALSE) 
mtext(rep(c("ener-mar", "abril-jun", "jul-sep", "oct-dic"), l = length(data)), 
    side = 1, line = 0.25, las = 2, 
    at = seq(tsp(data)[1], tsp(data)[2], by = 1/tsp(data)[3]), 
    cex = .6) 
mtext(2004:2016, side = 1, line = 3, at = seq(2004.3, 2016.3), cex = .7) 
title(xlab = "Trimestres", line = 5, cex.lab = .8) 

прикончить с легендой:

par(xpd = TRUE) 
legend(2010, -27, c("PIB", "Tendencia PIB"), 
    bty = "n", 
    xjust = .5, 
    lty = c(1, 1), 
    col = c("darkblue", "red"), 
    cex = .7, 
    horiz = TRUE) 

Выход: enter image description here

3

Вот ggplot2 подход, который приближается к формату сюжета в вашем вопросе:

library(ggplot2) 

# Fake data 
set.seed(1234) 
nobs<-52 
t<-seq(1,nobs) 
x<-rnorm(nobs,0,10) + t + 20 
dat = data.frame(year=rep(2004:2016, each=4), qtr=rep(1:4, 13), x = x) 

ggplot(dat, aes(paste(year,qtr), x)) + 
    geom_vline(xintercept=seq(4.5,100,4), colour="grey80",lwd=0.3) + 
    geom_line(aes(group=1)) + 
    annotate(seq(2.5, 2.5 + 12*4, length.out=13), -2, label=2004:2016, 
      geom="text", colour="grey30", size=3.5) + 
    theme_bw(base_size=10) + 
    theme(axis.text.x=element_text(angl=-90, vjust=0.5, colour="grey30"), 
     panel.grid.major.x=element_blank()) + 
    scale_x_discrete(name="Quarter", 
        labels=rep(paste0(month.abb[seq(1,12,3)],"-",month.abb[seq(3,12,3)]),20)) + 
    coord_cartesian(xlim=c(0,13*4 + 1), ylim=c(-4,max(dat$x + 2)), expand=FALSE) 

enter image description here

Facetting подходит ближе к формату, который вы хотели, но нет никакого способа (AFAIK) в нормальном рабочем процессе ggplot для соединения линий по граням. На приведенном ниже рисунке вертикальные линии показывают границы между каждой гранью. There are (somewhat complicated) ways, чтобы попытаться подключить линии по граням, но я не сделал это так далеко в примере ниже.

dat$qtr = rep(paste0(month.abb[seq(1,12,3)],"-",month.abb[seq(3,12,3)]),13) 
dat$qtr = factor(dat$qtr, levels=paste0(month.abb[seq(1,12,3)],"-",month.abb[seq(3,12,3)])) 

p=ggplot(dat, aes(qtr, x)) + 
    geom_line(aes(group=1)) + 
    coord_cartesian(xlim=c(0.5,4.5), expand=FALSE, ylim=c(-2,80)) + 
    facet_grid(. ~ year, switch="x") + 
    annotate(x=c(0.5, 4.5), xend=c(0.5,4.5), y=-16, yend=-2, geom="segment", 
      colour="grey70", size=0.3) + 
    theme_bw(base_size=10) + 
    theme(panel.margin=unit(0,"lines"), 
     axis.text.x=element_text(angl=-90, vjust=0.5, colour="grey30"), 
     panel.border=element_rect(colour="grey70", size=0.3), 
     panel.grid.major=element_blank(), 
     strip.background=element_rect(fill="grey90", colour="grey20"), 
     axis.line=element_line(colour="black")) + 
    labs(x="Quarter") 

# Turn off clipping and draw plot 
gt <- ggplot_gtable(ggplot_build(p)) 
gt$layout$clip[gt$layout$name=="panel"] <- "off" 
grid.draw(gt) 

enter image description here

Смежные вопросы