【问题标题】:R: Suppress base graphics plot but return plot as objectR:抑制基本图形绘图但将绘图作为对象返回
【发布时间】:2019-03-21 15:16:20
【问题描述】:

我有一个函数,它既可以返回一些统计数据,又可以使用 R 基础图形绘制图表。我想抑制该函数的绘图,而是将绘图作为对象返回,以便可以从函数外部控制绘图与否。

我试过了:

使用gridGraphics 包,我可以按照this question 中的建议将基本图形转换为对象:

plot(1:10)
grid.echo()
a = grid.grab()
grid.draw(a)

剩下的问题是plot() 命令绘制了我想要抑制的情节。因此,我试图通过绘制到像answer here 建议的临时文件中的设备来抑制它。代码变成:

ff = tempfile()
svg(filename = ff)
plot(1:10)
grid.echo()
a = grid.grab()
dev.off()
unlink(ff)

但是现在,grid.echo() 找不到任何要回显的图形,并抛出警告:

Warning message:
In grid.echo.recordedplot(recordPlot(), newpage, prefix, device) :
  No graphics to replay

我已将此问题追溯到grid.echo() 无法从 Rstudio 默认设备以外的其他设备回显图形,无论是否在临时文件中。这本身就很奇怪,因为grid.echo() docs 说它与当前设备的图形相呼应,没有提及任何限制。

谁能帮助我解决抑制基本图形绘图并将其作为对象返回的问题,无论是通过建议如何修复我的失败尝试,还是通过其他方法?

【问题讨论】:

    标签: r graphics


    【解决方案1】:

    LocoGris解决了this相关问题中关于grid.echo行为的问题。

    以下代码会将不需要的图形输出绘制到临时文件中,在取消链接临时文件之前使用grid.echogrid.grab 将绘图保存为网格对象,以便仅保留绘图对象,从而产生所需的行为:

    ff = tempfile()
    svg(filename = ff)
    plotfun <- function() plot(1:10)
    grid.echo(plotfun)
    a = grid.grab()
    dev.off()
    unlink(ff)
    

    与有问题的代码不同的是,R 基础图形中的绘图被放入一个函数并传递给grid.echo,而不是依靠grid.echo 从当前设备中自动查找所需内容。

    可能有用的注意事项:grid.echo 将绘制两次,如果使用不带临时文件的常规 svg() 可以看到,因为两个文件将以相同的情节出现。我假设第一个图是在 R 基础图形中,第二个是使用网格系统的回声。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多