Search code examples
rggplot2ecdffacet-grid

Plot several graphs using ggplot() and facet_grid()


I am wondering in how to plot several graphs in one screen using ggplot() and facet_grid() because I really need to repeat this process several times for different statistical variables.

I have two data frame contenting observations and another one with predictions. They are both matrix of 550 x 76.

Data frame 1:

Observations    x1   x2   x3  x5  x6  x7  x8  x9  x10  x11  x13 .... x75
Observation1   -0.1 0.05 0.1 0.2 0.3 0.04 0.3 -0.1 0.02 0.02 -0.2 ....0.8
Observation2   -0.3 0.05 0.1 0.1 0.3 0.03 0.3 -0.1 0.03 0.02 -0.2 ....0.6
Observation3   -0.2 0.05 0.1 0.4 0.3 0.02 0.3 -0.1 0.01 0.01 -0.2 ....0.1
Observation550 -0.1 0.05 0.8 0.4 0.3 0.02 0.7 -0.1 0.01 0.01 -0.2 ....0.1

Data frame 2:

Predictions    x1   x2   x3  x5  x6  x7  x8  x9  x10  x11  x13 .... x75
Prediction1   -0.1 0.05 0.1 0.2 0.3 0.04 0.3 -0.1 0.02 0.02 -0.2 ....0.8
Prediction2   -0.3 0.05 0.1 0.1 0.3 0.03 0.3 -0.1 0.03 0.02 -0.2 ....0.6
Prediction3   -0.2 0.05 0.1 0.4 0.3 0.02 0.3 -0.1 0.01 0.01 -0.2 ....0.1
Prediction550 -0.1 0.05 0.8 0.4 0.3 0.02 0.7 -0.1 0.01 0.01 -0.2 ....0.1

It seems that I have to create only one data frame or list with these two matrix inside in order to use ggplot().

I have done this but using the standard plot of r.

Thanks in advance


Solution

  • I think this is what you want.

    library(ggplot2)
    library(reshape2)
    
    # Fake some data
    set.seed(1234)
    nc <- 15
    nr <- 20  
    onms <- sprintf("Observation%d",1:nr)
    pnms <- sprintf("Prediction%d",1:nr)
    cnames <- sprintf("x%d",1:nc)
    
    odf <- data.frame(Observations=onms)
    pdf <- data.frame(Predictions=pnms)
    
    for(i in 1:nc){
      vk1 <- 0.01*rnorm(nr)
      odf[[cnames[i]]] <- round(cumsum(vk1),3)
      vk2 <- 0.02*rnorm(nr)
      pdf[[cnames[i]]] <- round(cumsum(vk1) + cumsum(vk2),3)
    }
    
    # This is the data we need
    head(odf)
    head(pdf)
    
    # Now change the pred. colnames so they don't collide with the obs. colnames
    newpnames <- sprintf("p_x%d",1:nc)
    names(pdf) <- c("series",newpnames)
    names(odf)[1] <- "series"
    
    # Merge the data into a long format
    modf <- melt(odf,id.vars="series",measure.vars=cnames)
    mpdf <- melt(pdf,id.vars="series",measure.vars=newpnames)   
    mdf <- rbind(modf,mpdf)
    
    # Now extract the fields we need into new columns
    mdf$x <- as.numeric(gsub(".*[A-Za-z]","",mdf$variable))
    mdf$frame <- as.numeric(gsub(".*[A-Za-z]","",mdf$series))
    frameNames <- sprintf("Frame:%d",1:max(mdf$frame))
    mdf$frame <- factor(sprintf("Frame:%d",mdf$frame),levels=frameNames)
    mdf$kind <- substr(mdf$series,1,3)
    
    # Finally plot it
    ggplot(mdf) + geom_line(aes(x=x,y=value,color=kind)) + facet_wrap( ~ frame )
    
    # ecdf version
    ggplot(mdf,aes(x=value,color=kind)) + stat_ecdf(geom="step") + facet_wrap( ~ frame )
    

    Note that the head statements after I fake the data give you this, so this is close to what you are starting from I believe:

    > head(odf)
      Observations     x1     x2     x3     x4     x5    x6     x7     x8     x9
    1 Observation1 -0.012  0.014 -0.002 -0.002 -0.008 0.005  0.001 -0.010  0.001
    2 Observation2 -0.009  0.004 -0.003 -0.010 -0.011 0.012  0.005 -0.005  0.002
    3 Observation3  0.002 -0.005 -0.017  0.011 -0.015 0.014 -0.006 -0.012 -0.003
    4 Observation4 -0.022 -0.008 -0.019  0.018 -0.017 0.021  0.001 -0.004 -0.019
    5 Observation5 -0.018 -0.017 -0.010  0.037 -0.013 0.024  0.008 -0.012 -0.019
    6 Observation6 -0.013 -0.027 -0.003  0.037 -0.007 0.031  0.011 -0.009 -0.026
        x10    x11    x12    x13   x14    x15
    1 0.009 -0.012  0.005 -0.007 0.015 -0.007
    2 0.028 -0.012  0.004  0.005 0.013 -0.018
    3 0.028 -0.016  0.005 -0.012 0.026 -0.021
    4 0.027 -0.025 -0.004 -0.008 0.026 -0.020
    5 0.022 -0.021 -0.017 -0.006 0.019 -0.012
    6 0.036 -0.019 -0.003  0.026 0.011  0.001
    > head(pdf)
      Predictions     x1    x2     x3     x4     x5    x6     x7     x8    x9
    1 Prediction1 -0.009 0.028  0.007 -0.009 -0.063 0.023  0.020 -0.022 0.000
    2 Prediction2 -0.016 0.068 -0.005  0.011 -0.068 0.043  0.017 -0.036 0.007
    3 Prediction3 -0.014 0.059 -0.017  0.045 -0.052 0.090  0.009 -0.047 0.021
    4 Prediction4 -0.029 0.042 -0.029  0.050 -0.046 0.121 -0.019 -0.018 0.028
    5 Prediction5 -0.038 0.032 -0.037  0.079 -0.024 0.130 -0.005 -0.026 0.031
    6 Prediction6 -0.062 0.058 -0.027  0.087  0.022 0.124 -0.016 -0.036 0.047
         x10    x11    x12    x13    x14    x15
    1 -0.027 -0.037  0.007  0.012  0.023 -0.026
    2 -0.061 -0.029 -0.010  0.000  0.048 -0.027
    3 -0.073 -0.035 -0.004 -0.003  0.048 -0.023
    4 -0.045 -0.041  0.000 -0.001  0.048 -0.025
    5 -0.034 -0.024 -0.038  0.037  0.030 -0.007
    6  0.005 -0.020 -0.045  0.064 -0.002 -0.005
    

    Finally yielding this plot:

    enter image description here

    And this faceted ecdf plot:

    enter image description here