25

With acf we can make ACF plot in base R graph.

x <- lh acf(x) 

enter image description here

The following code can be used to get the ACF plot in ggplot2.

conf.level <- 0.95 ciline <- qnorm((1 - conf.level)/2)/sqrt(length(x)) bacf <- acf(x, plot = FALSE) bacfdf <- with(bacf, data.frame(lag, acf)) library(ggplot2) q <- ggplot(data=bacfdf, mapping=aes(x=lag, y=acf)) + geom_bar(stat = "identity", position = "identity") q 

enter image description here

Question

How to get lines rather than bars or how to set the width of bars so that they look like lines? Thanks

3
  • 2
    Note that there's a ggplot2 wrapper for this: github.com/dewittpe/qwraps. Install with devtools::install_github("dewittpe/qwraps"). Commented Sep 26, 2014 at 7:47
  • This is extremely useful post. I'm wondering if creating Stata-like Cross-correlogram for bivariate time series would be achievable with use of the suggested approach? Commented Jan 17, 2016 at 23:36
  • 2
    @konrad try the following code: library(ggfortify) p1 <- autoplot(acf(AirPassengers, plot = FALSE), conf.int.fill = '#0000FF', conf.int.value = 0.8, conf.int.type = 'ma') print(p1) library(cowplot) ggdraw(switch_axis_position(p1, axis = 'xy', keep = 'xy')) Commented Jan 18, 2016 at 15:29

6 Answers 6

30

You're probably better off plotting with line segments via geom_segment()

library(ggplot2) theme_set(theme_bw()) set.seed(123) x <- arima.sim(n = 200, model = list(ar = 0.6)) bacf <- acf(x, plot = FALSE) bacfdf <- with(bacf, data.frame(lag, acf)) ciline <- qnorm((1 - 0.95)/2)/sqrt(length(x)) q <- ggplot(data = bacfdf, mapping = aes(x = lag, y = acf)) + geom_hline(aes(yintercept = 0)) + geom_segment(mapping = aes(xend = lag, yend = 0)) + geom_hline(yintercept = -ciline, linetype = 2, color = 'darkblue') + geom_hline(yintercept = ciline, linetype = 2, color = 'darkblue') q 

enter image description here

Sign up to request clarification or add additional context in comments.

2 Comments

This answer is super old (and still useful). Just to notice that you forgot to add geom_hline(aes(yintercept = ciline), linetype = 3, color = 'darkblue') + geom_hline(aes(yintercept = -ciline), linetype = 3, color = 'darkblue') to mimic the lines in the original base plot
Dashed line: linetype=2
5

How about using geom_errorbar with width=0?

ggplot(data=bacfdf, aes(x=lag, y=acf)) + geom_errorbar(aes(x=lag, ymax=acf, ymin=0), width=0) 

Comments

5

forecast::ggAcf() is another option:

library(ggplot2) library(forecast) ggAcf(wineind,lag.max=24)+ labs(title='wineind') 

Comments

4

@konrad; try the following code:

library(ggfortify) p1 <- autoplot(acf(AirPassengers, plot = FALSE), conf.int.fill = '#0000FF', conf.int.value = 0.8, conf.int.type = 'ma') print(p1) library(cowplot) ggdraw(switch_axis_position(p1, axis = 'xy', keep = 'xy')) 

enter image description here

1 Comment

This code did not produce the figure you have attached, the blue region is rectangular in the code you presented
3

From the forecast package comes a function ggtsdisplay that plots both ACF and PACF with ggplot. x is the residuals from the model fit (fit$residuals).

forecast::ggtsdisplay(x,lag.max=30) 

Comments

3

From your answers, I synthesized a ggplot ACF / PACF plotting method :

 require(zoo) require(tseries) require(ggplot2) require(cowplot) ts= zoo(data[[2]]) # data[[2]] because my time series data was the second column # Plot ACP / ACF with IC # How to compute IC for ACF and PACF : # https://stats.stackexchange.com/questions/211628/how-is-the-confidence-interval-calculated-for-the-acf-function ic_alpha= function(alpha, acf_res){ return(qnorm((1 + (1 - alpha))/2)/sqrt(acf_res$n.used)) } ggplot_acf_pacf= function(res_, lag, label, alpha= 0.05){ df_= with(res_, data.frame(lag, acf)) # IC alpha lim1= ic_alpha(alpha, res_) lim0= -lim1 ggplot(data = df_, mapping = aes(x = lag, y = acf)) + geom_hline(aes(yintercept = 0)) + geom_segment(mapping = aes(xend = lag, yend = 0)) + labs(y= label) + geom_hline(aes(yintercept = lim1), linetype = 2, color = 'blue') + geom_hline(aes(yintercept = lim0), linetype = 2, color = 'blue') } acf_ts= ggplot_acf_pacf(res_= acf(ts, plot= F) , 20 , label= "ACF") pacf_ts= ggplot_acf_pacf(res_= pacf(ts, plot= F) , 20 , label= "PACF") # Concat our plots acf_pacf= plot_grid(acf_ts, pacf_ts, ncol = 2, nrow = 1) acf_pacf 

Results:

enter image description here

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.