【问题标题】:Damaged PDF from R PDF Graphics DeviceR PDF Graphics Device 损坏的 PDF
【发布时间】:2020-06-23 13:49:12
【问题描述】:

我有一个列表 (eulerr.list),其中包含可以使用 eulerr 绘制欧拉图的数据框。 我想为列表中的每个数据框绘制并保存欧拉图。为此我写了如下代码:

for (j in 1: length(eulerr.list)) {
        
        pdf(file=paste0("output/","triple_","eulerr_",names(eulerr.list[j]),".pdf"))
        plot(eulerr.list[[j]],
             fills = c("red", "forestgreen", "mediumorchid"),
             quantities = TRUE,
             alpha = 0.5,
             labels = c("A", 
                        "B", 
                        names(eulerr.list[j])),
             adjust_labels = TRUE)
        dev.off()
        
}

当我运行循环(RStudio 版本 1.3.959)时,我得到了我期望的文件,但所有文件都已损坏(无法在我的 Mac (OSX 10.12.6) 上通过预览打开)。循环完成后,没有错误消息,Rstudio 返回一个空提示。 当我手动将值 1 分配给 j 并在循环内运行代码时:

pdf(file=paste0("output/","triple_","eulerr_",names(eulerr.list[j]),".pdf"))
        plot(eulerr.list[[j]],
             fills = c("red", "forestgreen", "mediumorchid"),
             quantities = TRUE,
             alpha = 0.5,
             labels = c("A", 
                        "B", 
                        names(eulerr.list[j])),
             adjust_labels = TRUE)
        dev.off()

然后文件被正确生成(可以在预览中查看)并且 RStudio 返回:

> dev.off()
RStudioGD 
        2

为什么for 循环会生成损坏的 PDF 文件?

【问题讨论】:

  • 你确定不应该是names(eulerr.list)[j]
  • 当我尝试这样做时,我仍然遇到同样的问题
  • 我认为您需要提供一个最小的可重现示例。
  • 这有效:for (i in 2:3) { pdf(file=paste0(i, ".pdf")); plot(mtcars[[i]], main=names(mtcars)[i]); dev.off(); },所以它一定与您的数据有关。是否使用了任何非基础包? (我推断 eulerr,请明确说明您使用的任何/所有关于SO的问题。)您是否尝试使用width=/height=扩展pdf的尺寸?也许这是一个情节大小的事情。
  • @r2evans 我看到了。我可以检查plot 方法,但是(a)我不想安装该软件包,并且(b)没有可重现的示例,我无法确定实际调用了哪个方法。

标签: r pdf eulerr


【解决方案1】:

这里发生的是plot.euler() 返回一个"eulergram" 对象。然后要在当前设备上实际绘制此图,必须调用print.eulergram()(或plot.eulergram())方法,但这并不是因为调用在for循环内。当您以交互方式调用plot() 时,返回的对象实际上隐式调用了它的print() 方法。这与人们使用 ggplot 或 lattice 时遇到的问题完全相同。

您需要做的是从plot() 保存对象并在其上调用print()(或plot()),如下所示:

for (j in 1: length(eulerr.list)) {  
  pdf(file=paste0("output/","triple_","eulerr_",names(eulerr.list[j]),".pdf"))
  p <- plot(eulerr.list[[j]],
            fills = c("red", "forestgreen", "mediumorchid"),
            quantities = TRUE,
            alpha = 0.5,
            labels = c("A", 
                       "B", 
                       names(eulerr.list[j])),
            adjust_labels = TRUE)
  print(p)
  dev.off()
}

【讨论】:

    猜你喜欢
    • 2022-10-05
    • 2016-08-20
    • 1970-01-01
    • 2013-01-04
    • 2013-02-18
    • 2022-01-14
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多