r - 如何在 R 中基于离屏(位图)图形创建 "interactive"图形设备?

标签 r plot graphics bitmap

在 R 中绘制大图可能非常缓慢。我正在尝试一些 workarounds但即使使用最大缓冲的“dbcairo”X11 设备,绘图似乎也比它可能花费的时间长得多。我注意到“png”设备对于小地 block 和大地 block 都更快。

小图,png() 比 X11() 快 3 倍:

> system.time({X11(type="dbcairo"); plot(1:1e3); dev.off()})
   user  system elapsed 
  0.234   0.029   0.373 
> system.time({png("file.png",type="cairo"); plot(1:1e3); dev.off()})
   user  system elapsed 
  0.114   0.000   0.113 
> system.time({png("file.png",type="Xlib"); plot(1:1e3); dev.off()})
   user  system elapsed 
  0.056   0.000   0.107 

大图,png() 比 X11() 快 2.3 倍到 46 倍:

> system.time({X11(type="dbcairo"); plot(1:1e5); dev.off()})
   user  system elapsed 
 14.420   0.157  15.491 
> system.time({png("file.png",type="cairo"); plot(1:1e5); dev.off()})
   user  system elapsed 
  6.790   0.001   6.826 
> system.time({png("file.png",type="Xlib"); plot(1:1e5); dev.off()})
   user  system elapsed 
  0.144   0.010   0.340 

结果与其他 X11() 设备类型(类似于“dbcairo”)和其他位图图像类型(类似于“png”)几乎相同。我猜 png() 类型“cairo”比“Xlib”花费的时间更长,因为它会产生抗锯齿输出。

对于中等大小的 ggplot2 图,我发现 png() 比 X11() 快 1.7 到 2.6 倍(使用 png(..); plot(g); dev.off() ,不是 ggsave())

因为我可以使用像“feh”这样的极简图像查看器几乎瞬间加载和重新加载 PNG 文件,我想知道为什么我不使用 png() 作为我的 R 的主要绘图设备。

问题当然是在我调用 dev.off() 之前 PNG 文件不会写入磁盘。这限制了标准绘图界面的风格,我在其中设置设备一次,然后调出各种绘图,有时添加线条或文本,同时在绘图窗口中立即查看每个更改。

是否很难创建一个新的 R 图形设备,将图像文件写入 PNG(或其他图像格式),但使用像“feh”这样的简单图像查看器在每个绘图命令后显示它们?换句话说,我正在寻找像 X11 这样的“交互式”绘图设备,但它使用现有设备(如 png()、jpeg() 或 tiff())的位图离屏渲染功能来绘制图像。或者可以修改 png() 设备以具有赋予它这种行为的选项。 (或者也许我应该对所有事情都使用 knitR ......但我更熟悉命令行......)

最佳答案

如果 X11 使您难以自拔,并且您不想使用 RStudio 绘图查看器(或者不能使用,因为您位于无法安装 RStudio Server 的远程服务器上),一个有趣的替代方法是使用 rmote包裹。您可以将它安装在您自己的本地 R 安装上,或者,如果您正在通过 SSH 连接到远程机器并愿意转发端口,则可以安装在远程 R 实例上。然后,您打印的任何图表和帮助文件都将被重定向到本地网络服务器,您可以在其中从浏览器访问它们。

它还附带了一些不错的附加功能,例如:

  • 情节历史,
  • 能够像在浏览器中处理任何其他图像一样右键单击并保存绘图,以及
  • 能够选择将哪种输出发送到服务器。

我发现这是 X11 转发的一个很好的替代方法,在远程服务器上进行绘图,而且它在本地也能很好地工作 🙂

关于r - 如何在 R 中基于离屏(位图)图形创建 "interactive"图形设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52435605/

相关文章:

r - 在Hexagon Binning(ggplot2)中同时使用颜色和尺寸属性

R/Shiny Downloadhandler 结果被截断的 .csv 文件

plot - 如何使用方程在 Maxima 中绘制 3D 表面?

python - Python 3.5.2 中的本福德定律绘图

c++ - 在 VAO 中使用交错数组

cocoa-touch - 测量字符串的像素宽度

java - 使用 openGL 绘制样条线

R在多图布局中仅在一个图上绘制插图

r - 倾向得分分层 : How can I calculate the variance ratio?

ruby - 使用 Ruby 进行科学编程