将绘图保存为pdf并同时在窗口中显示(x11)

时间:2011-11-08 23:44:28

标签: r

我写了一个创建条形图的函数。我想将此图保存为pdf,并在应用此功能时将其显示在我的屏幕(x11)上。代码看起来像这样。

create.barplots <- function(vec)
 {
   x11()                                  # opens the window
   ### Here is a code that creates a barplot and works perfectly
   ### but irrelevant for my question
   dev.copy(pdf("barplots.table.2.pdf")) # is supposed to copy the plot in pdf
                                         # under the name "barplots.table.2.pdf"
   dev.off()                             # is supposed to close the pdf device
 }

这会产生以下错误:'device'应该是一个函数

当我将代码修改为:

create.barplots <- function(vec)
 {
   x11()
   ### Here is a code that creates a barplot and works perfectly
   ### but irrelevant for my question
   dev.copy(pdf) # This is the only difference to the code above
   dev.off()
 }

R显示绘图并创建一个名为Rplots.pdf的文件。由于几个原因,这是一个问题。

我还试图以相反的方式打开设备。首先打开pdf设备,而不是将pdf设备的内容复制到x11设备,而不是将pdf设备设置为活动设备,而不是关闭pdf设备。这里的代码如下所示:

create.barplots <- function(vec)
 {
   pdf("barplots.table.2.pdf") # open the pdf device
   ### Here is a code that creates a barplot and works perfectly
   ### but irrelevant for my question
   dev.copy(x11)              # copy the content of the pdf device into the x11 device
   dev.set(which = 2)         # set the pdf device as actice
   dev.off()                  # close the pdf device
 }

这里的问题是应该显示情节的wondow是空的!

总结一下,我有两个问题: 1)如何将绘图保存为pdf并同时在x11中显示?和 2)如何将绘图保存在其他地方的工作目录中?

修改

上述解决方案效果很好。但我仍然不明白为什么

pdf("barplots.table.2")
barplot(something)
dev.copy(x11)

显示一个空的灰色窗口,而不是在窗口设备中复制pdf设备的内容!我也试过

pdf("barplots.table.2")
barplot(something)
dev.copy(window)

我也失败了......

5 个答案:

答案 0 :(得分:25)

怎么样:

create.barplots <- function(...) {
  x11()
  plot.barplots(...) # create the barplot
  dev.copy2pdf(file = "path/to/barplots.table.2.pdf")
}

答案 1 :(得分:9)

您可以在pdf来电中轻松添加dev.copy的参数,如下所示:

create.barplots <- function(vec,dir,file)
 {
   windows()
   plot(vec)
   dev.copy(pdf,file=paste(dir,file,sep="/") 
   dev.off()
 }

dev.copy()有一个...参数将参数传递给pdf函数,另请参阅?dev.copy。或者,你可以使用dev.copy2pdf,正如马克斯告诉你的那样。我还建议您使用windows()代替x11(),否则您可能会遇到字体系列问题。 x11和pdf的默认值并不总是匹配。

要将文件保存在另一个目录中,只需添加完整目录(例如使用粘贴,就像上面的函数一样)

答案 2 :(得分:4)

正如我在previous post中提到的,您可以考虑我的knitr包裹;如果您在交互式R会话中使用它,您将能够在窗口中看到这些图并将其保存为pdf而不会出现任何黑客攻击(这是默认行为)。我仍然需要在documentation和演示上付出很多努力,但它应该能够使用Rnw文档。你可以看到这些图并将其保存在knitr中的主要原因是knitr与设计中的Sweave非常不同 - 图形设备在代码之后打开进行评估,因此您的绘图不会隐藏在屏幕外设备中。同样,我需要警告你,目前它是高度实验性的。

答案 3 :(得分:0)

从内部函数调用时,以下对我很有效。在绘图代码后调用它:

pdf2 <- function (file = "plot.pdf", w = 10, h = 7.07, openPDF = FALSE) 
{
    dev.copy2pdf(file = file, width = w, height = h, out.type = "pdf")
    if(openPDF) browseURL(file)
}

NB。 openPDF只能在Windows中使用完整(非相对)文件路径。

答案 4 :(得分:0)

根据Max Gasner的回答,我编写了这个辅助功能,可以快速切换显示而不是显示。参数x是绘图对象或执行绘图的函数。

savepdf<-function(x, file, display=TRUE) {
    if (display){
        x;
        dev.copy2pdf(file=file)
    }
    else {
        pdf(file=file)
        x;
        dev.off()
    }
}

示例:

savepdf(plot(c(1,2,3)), file="123.pdf", display=F)