Label X Axis in Time Series Plot using R

后端 未结 5 1562
無奈伤痛
無奈伤痛 2020-12-01 07:02

I am somewhat new to R and have limited experience with plotting in general. I have been able to work get my data as a time series object in R using zoo, but I am having a

相关标签:
5条回答
  • 2020-12-01 07:27

    The axis labeling doesn't line up with even monthly divsions but may be useful in some situations. Random data (summed) over last 500 days:

    xx.Date <- as.Date((Sys.Date()-500):Sys.Date())
    x <- zoo(cumsum(rnorm(501)), xx.Date)
    tt=time(x)
    plot(x, xaxt ="n")
    tt <- time(x)
    ix <- seq(1, length(tt), by=60) #every 60 days
    fmt <- "%b-%d" # format for axis labels
    labs <- format(tt[ix], fmt)
    axis(side = 1, at = tt[ix], labels = labs,  cex.axis = 0.7)
    

    enter image description here

    0 讨论(0)
  • 2020-12-01 07:33

    Start with an example:

    x.Date <- as.Date(paste(rep(2003:2004, each = 12), rep(1:12, 2), 1, sep = "-"))
    x <- zoo(rnorm(24), x.Date)
    plot(x)
    

    If we want different tick locations, we can suppress the default axis plotting and add our own:

    plot(x, xaxt = "n")
    axis(1, at = time(x), labels = FALSE)
    

    Or combine them:

    plot(x)
    axis(1, at = time(x), labels = FALSE)
    

    You need to specify the locations for the ticks, so if you wanted monthly, weekly, etc values (instead of observations times above), you will need to create the relevant locations (dates) yourself:

    ## weekly ticks
    plot(x)
    times <- time(x)
    ticks <- seq(times[1], times[length(times)], by = "weeks")
    axis(1, at = ticks, labels = FALSE, tcl = -0.3)
    

    See ?axis.Date for more details, plus ?plot.zoo has plenty of examples of this sort of thing.

    0 讨论(0)
  • 2020-12-01 07:33

    I have captured all the above and a couple of extra options in one place, for my own reference:

    # Time series plots with good X axis labels
    library(zoo)
    # data
    today = Sys.Date()
    dates = as.Date((today-500):today)
    z = zoo (100+cumsum(rnorm(501)), dates)
    
    # method1 : default X axis labels do not look good
    ?plot.zoo
    plot(z)
    ?plot.ts
    plot(ts(z))
    
    # method 2 : Lattice
    library(lattice)
    ?xyplot.zoo
    xyplot(z)
    xyplot(z, lwd=2, col="tomato")
    
    # method 3 : XTS
    library(xts)
    ?plot.xts
    plot(as.xts(z))
    plot(as.xts(z), auto.grid=F, major.format="%b %y", las=2)
    
    # method 4 : Base graph
    timeline = time(z)
    summary(timeline)
    index = seq(from=1, to=length(timeline), 90) # put ticks every 90 days
    plot(z, xaxt="n")
    axis(side=1, at=timeline[index], label=format(timeline[index], "%b %y"), cex.axis=0.8)
    
    # method 5 : ggplot
    library(ggplot2)
    library(scales)
    ?date_breaks
    df = data.frame(date=as.POSIXct(time(z)), value=as.numeric(z))
    head(df)
    # default plot
    ggplot(df, aes(x=date, y=value)) + geom_line()
    # formatted
    ggplot(df, aes(x=date, y=value)) + geom_line() + 
       scale_x_datetime(labels=date_format("%b '%y"))
    # custom breaks
    ggplot(df, aes(x=date, y=value)) + geom_line() + 
       scale_x_datetime(labels=date_format("%b '%y"), breaks=date_breaks("3 months"))
    
    0 讨论(0)
  • 2020-12-01 07:34

    if the time is in Date format, this might be helpful.

     ggplot(data_frame, aes(date,column)) + geom_point() +
        ggtitle("my title")+
        scale_x_date(date_breaks = "1 month",date_labels = "%b") + xlab("month") + 
        ylab("y_axis title")
    
    0 讨论(0)
  • 2020-12-01 07:50

    plot.zoo uses the axis functions in R's classic graphics but zoo also offers lattice graphics as well via xyplot.zoo. Just changing plot to xyplot may be sufficient for your needs:

    library(zoo)
    library(lattice)
    
    # create test data
    z <- zooreg(1:83, start = as.Date("2009-04-01"), deltat = 7)
    
    xyplot(z)
    

    Note that there are further examples in ?plot.zoo and ?xyplot.zoo as well as the three vignettes that come with zoo. In those places you can also find find examples of a different approach showing how to use the axis function of classic graphics together with plot.zoo for highly customized axes.

    0 讨论(0)
提交回复
热议问题