Storing plot objects in a list

后端 未结 5 1429
星月不相逢
星月不相逢 2020-12-03 15:04

I asked this question yesterday about storing a plot within an object. I tried implementing the first approach (aware that I did not specify that I was using qplot()

相关标签:
5条回答
  • I think you should use the data argument in qplot, i.e., store your vectors in a data frame.

    See Hadley's book, Section 4.4:

    The restriction on the data is simple: it must be a data frame. This is restrictive, and unlike other graphics packages in R. Lattice functions can take an optional data frame or use vectors directly from the global environment. ...

    The data is stored in the plot object as a copy, not a reference. This has two important consequences: if your data changes, the plot will not; and ggplot2 objects are entirely self-contained so that they can be save()d to disk and later load()ed and plotted without needing anything else from that session.

    0 讨论(0)
  • 2020-12-03 15:38

    For your second question: Multi-page pdfs are easy -- see help(pdf):

     onefile: logical: if true (the default) allow multiple figures in one
              file.  If false, generate a file with name containing the
              page number for each page.  Defaults to ‘TRUE’.
    

    For your main question, I don't understand if you want to store the plot inputs in a list for later processing, or the plot outputs. If it is the latter, I am not sure that plot() returns an object you can store and retrieve.

    0 讨论(0)
  • 2020-12-03 15:40

    Another suggestion regarding your second question would be to use either Sweave or Brew as they will give you complete control over how you display your multi-page pdf.

    Have a look at this related question.

    0 讨论(0)
  • 2020-12-03 15:45

    Ok, so if your plot command is changed to

    p <- qplot(data = data.frame(x = x, y = y),
               x, y,   
               xlab = "Radius [km]", 
               ylab = "Services [log]",
               xlim = x_range,
               ylim = c(0,10),
               main = paste("Sample",i)
               ) + geom_abline(intercept = inter, slope = slop, colour = "red", size = 1)           
    

    then everything works as expected. Here's what I suspect is happening (although Hadley could probably clarify things). When ggplot2 "saves" the data, what it actually does is save a data frame, and the names of the parameters. So for the command as I have given it, you get

    > summary(pltList[["a1"]])
    data: x, y [50x2]
    mapping:  x = x, y = y
    scales:   x, y 
    faceting: facet_grid(. ~ ., FALSE)
    -----------------------------------
    geom_point:  
    stat_identity:  
    position_identity: (width = NULL, height = NULL)
    
    mapping: group = 1 
    geom_abline: colour = red, size = 1 
    stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
    position_identity: (width = NULL, height = NULL)
    

    However, if you don't specify a data parameter in qplot, all the variables get evaluated in the current scope, because there is no attached (read: saved) data frame.

    data: [0x0]
    mapping:  x = x, y = y
    scales:   x, y 
    faceting: facet_grid(. ~ ., FALSE)
    -----------------------------------
    geom_point:  
    stat_identity:  
    position_identity: (width = NULL, height = NULL)
    
    mapping: group = 1 
    geom_abline: colour = red, size = 1 
    stat_abline: intercept = 2.55595281266726, slope = 0.05543539319091 
    position_identity: (width = NULL, height = NULL)
    

    So when the plot is generated the second time around, rather than using the original values, it uses the current values of x and y.

    0 讨论(0)
  • 2020-12-03 15:45

    There is a bug in your code concerning list subscripting. It should be

    pltList[[pltName]]
    

    not

    pltList[pltName]
    

    Note:

    class(pltList[1])
    [1] "list"
    

    pltList[1] is a list containing the first element of pltList.

    class(pltList[[1]])
    [1] "ggplot"
    

    pltList[[1]] is the first element of pltList.

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