Save all plots already present in the panel of Rstudio

后端 未结 5 1312
一生所求
一生所求 2021-02-02 12:10

I\'ve made different plots (more than a hundred) for a project and I haven\'t capture them on the way (yes it\'s bad , i know). Now, I need to save them all at once but without

相关标签:
5条回答
  • 2021-02-02 12:25

    If you enter the following function all that will follow will be save in a document:

    pdf("nameofthedocument.pdf")
    
    plot(x~y)
    plot(...
    
    
    dev.off()
    

    You can also use tiff(), jpg()... see ?pdf

    0 讨论(0)
  • 2021-02-02 12:26

    Although this discussion has been inactive for a while, there are some persons, like myself, who still come across the same problem, and the other solutions don't really seem to even get what the actual question is.

    So, hands on. Your plot history gets saved in a variable called .SavedPlots. You can either access it directly, assign it to another variable in code or do the latter from the plots window.

    # ph for plot history
    ph <- .SavedPlots
    

    In R 3.4.2, I could index ph to reproduce the corresponding plot in a device. What follows is rather straightforward:

    1. Open a new device (png, jpeg, pdf...).
    2. Reproduce your plot ph[index_of_plot_in_history].
    3. Close the device (or keep plotting if it is a pdf with multiple pages).

    Example:

    for(i in 1:lastplot) {
        png('plotname.png')
        print(ph[i])
        dev.off()
    }
    

    Note: Sometimes this doesn't happen because of poor programming. For instance, I was using the MICE package to impute many datasets with a large number of variables, and plotting as shown in section 4.3 of this paper. Problem was, that only three variables per plot were displayed, and if I used a png device in my code, only the last plot of each dataset would be saved. However, if the plots were printed to a window, all the plots of each dataset would be recorded.

    0 讨论(0)
  • 2021-02-02 12:38

    In RStudio, every session has a temporary directory that can be obtained using tempdir(). Inside that temporary directory, there is another directory that always starts with "rs-graphics" and contains all the plots saved as ".png" files. Therefore, to get the list of ".png" files you can do the following:

    plots.dir.path <- list.files(tempdir(), pattern="rs-graphics", full.names = TRUE); 
    plots.png.paths <- list.files(plots.dir.path, pattern=".png", full.names = TRUE)
    

    Now, you can copy these files to your desired directory, as follows:

    file.copy(from=plots.png.paths, to="path_to_your_dir")
    



    Additional feature:

    As you will notice, the .png file names are automatically generated (e.g., 0078cb77-02f2-4a16-bf02-0c5c6d8cc8d8.png). So if you want to number the .png files according to their plotting order in RStudio, you may do so as follows:

    plots.png.detials <- file.info(plots.png.paths)
    plots.png.detials <- plots.png.detials[order(plots.png.detials$mtime),]
    sorted.png.names <- gsub(plots.dir.path, "path_to_your_dir", row.names(plots.png.detials), fixed=TRUE)
    numbered.png.names <- paste0("path_to_your_dir/", 1:length(sorted.png.names), ".png")
    
    # Rename all the .png files as: 1.png, 2.png, 3.png, and so on.
    file.rename(from=sorted.png.names, to=numbered.png.names)
    

    Hope it helps.

    0 讨论(0)
  • 2021-02-02 12:45

    I am not sure how Rstudio opens the device where the plot are drawn, but I guess it uses dev.new(). In that case one quick way to save all opened graphs is to loop through all the devices and write them using dev.print.

    Something like :

    lapply(dev.list(),function(d){dev.set(d);dev.print(pdf,file=file.path(folder,paste0("graph_",d,".pdf"))})
    

    where folder is the path of the folder where you want to store your graph (could be for example folder="~" if you are in linux and want to store all your graph in your home folder).

    0 讨论(0)
  • 2021-02-02 12:47

    If your plots are 3d, you can take a snapshot of all your plots and save them as a .png file format.

    snapshot3d(filename = '../Plots/SnapshotPlots.png', fmt = 'png')
    

    Or else, the best way is to create a multi-paneled plotting window using the par(mfrow) function. Try the following

    plotsPath = "../Plots/allPlots.pdf"
    pdf(file=plotsPath)  
    
        for (x in seq(1,100))   
        {   
          par(mfrow = c(2,1))
          p1=rnorm(x)  
          p2=rnorm(x)  
          plot(p1,p2)   
        } 
        dev.off() 
    

    You can also use png, bmp, tiff, and jpeg functions instead of pdf. You can read their advantages and disadvantages and choose the one you think is good for your needs.

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