【问题标题】:How to do a ridiculously wide plot如何做一个荒谬的情节
【发布时间】:2013-10-03 05:27:35
【问题描述】:

我有一个包含 10000 个观察值的长时间序列,我想将其可视化。问题是,如果我只是正常绘制它,时间维度将被挤压,并且我想要可视化的时间序列的任何细节都不会很明显。例如:

 plot((sin(1:10000/100)+rnorm(10000)/5),type='l')

我想要以某种方式将以下内容并排绘制在一个巨大的图中,而不使用 par(mfrow=c(1,100))。然后我想导出这个非常宽的图,然后简单地滚动以可视化整个系列。

 plot((sin(1:10000/100)+rnorm(10000)/5)[1:100],type='l')
 plot((sin(1:10000/100)+rnorm(10000)/5)[101:200],type='l')
 plot((sin(1:10000/100)+rnorm(10000)/5)[201:300],type='l')
 .....

最终我希望将这些巨大的地块中的 3 或 4 个用par(mfrow=c(4,1)) 重叠在一起。

我知道答案与par 中的pin 设置有关,但我不断收到Error in plot.new() : plot region too large。我猜这与pin 与其他par 参数的交互有关

如果我们能得到完全正确的像素高度和宽度,就会获得奖励积分。由于导出大小不完美,最好不要跳过随机像素。

如果图像可以编码为.html,则可以获得更多奖励积分。并以这种方式查看

【问题讨论】:

  • 这取决于你如何写出来。是PDF吗?
  • @DavidRobinson 任何图像文件。 png, eps, ...,强烈偏爱磁盘上的小尺寸。 png 会很好。可以编码为 html 的东西也很好(例如 png 可以)。
  • 只是做png(width=10000,height=10000); par(mfrow=....); plot(...); dev.off(); 或类似的东西不能给你足够的空间来适应真正宽阔的地块吗?
  • @thelatemail 不够宽。如果我经过width=50000,它会显示cairo error 'invalid value (typically too big) for the size of the input (surface, pattern, etc.)
  • 我有这个确切的问题,这里列出的解决方案似乎不起作用。我是 RStudio 的 R 初学者。就我而言,我需要反省一年多的每小时天气数据测量结果。

标签: r plot


【解决方案1】:

您可能会考虑另一种选择是 svg,它在任何情况下都会产生比 png/jpeg 更好的质量。

类似

svg(width = 2000, height = 7)
par(mfrow=c(4,1), mar = c(4, 4, 0, 2))
for (i in 1:4){
    plot((sin(1:10000/100)+rnorm(10000)/5),type='l', 
         bty = "l", xaxs = "i")
}
dev.off()

将生成一个非常宽的绘图,大小刚刚超过 1MB,在 Chrome 中呈现得非常好。

注意这里的宽度和高度以英寸为单位。

P.S. svg 还提供了交互式图形的潜力。刚刚看到一个很好的例子,它允许用户选择长时间序列的一个区域来放大,参见 Dynamic and Interactive R Graphics for the Web: The gridSVG Package 中的图 22,这是 Paul Murrell 和 Simon Potter 的草稿。

【讨论】:

  • svg 是矢量格式,所以我认为你的问题的答案是任意的。
  • 如果您在文本编辑器中打开生成的 svg 文件,您将看到指定为 width="144000pt" height="504pt" 的尺寸,即每英寸 72 点。我尝试将其编辑为 width="144000px" height="504px",这似乎可以正常工作,但我不知道这是否是个好主意!
  • 你有没有发现用Chrome打开时卡顿?
  • Chrome 对我来说很好,但 Firefox 很慢
  • 我正在使用 RStudio,并且使用此代码会产生错误:“dev.off() 中的错误:无法关闭设备 1(空设备)。它也不会产生 SVG 输出. 它确实创建了一个 SVG 文件,但它是空的。
【解决方案2】:

这可能是 Cairo 特有的问题,也可能是您的机器上缺少 RAM。以下代码在具有 8GB RAM 的 Windows 7 机器上运行良好。

png("wide.png", width = 1e5, height = 500)
plot((sin(1:10000/100)+rnorm(10000)/5),type='l')
dev.off()

如果我将宽度更改为1e6 像素,那么 R 会成功创建文件(大约需要一分钟),但我现有的图像查看软件无法显示这么大的图像。

【讨论】:

  • Cairo 将宽度/高度限制为 32767 像素。 1e4 的宽度应该可以用于绘制 1e4 数据点,并且有助于减小文件大小。
  • 我可能正在寻找大约 150,000 像素,但我收到此错误:> dev.off() Maximum supported image dimension is 65500 pixels *** glibc detected *** /usr/lib64/R/bin/exec/R: double free or corruption (!prev): 0x000000000278f950 *** 然后它会转储所有这些“回溯”内容。
  • 请您将用于创建绘图文件的确切代码添加到您的问题中,以及您的操作系统和您正在运行的 R 版本。
  • @RichiCotton 实际上 PNG 有效,只有 JPG 不适用于那么多像素。
  • 嗯,JPG 比图表更适合存储照片。使用 PNG 或矢量格式。
【解决方案3】:

我会选择其他路线。首先,以高分辨率观看整个情节究竟有什么意义?如果您正在搜索某种异常或异常情况,那么这就是数据处理的用途:-)。想想诸如查找 allx > 3sigma,或进行 FFT 等操作。

接下来,如果你真的想用肉眼检查整个事情,那么编写一些 R-TclTK 代码或使用 dynamicGraphiplotszoom 来生成一个交互式图形,你可以通过“实时”滚动。”

ETA:IIRC RStudio 也有用于交互式图形滚动和缩放的工具。

【讨论】:

  • @user2763361 zoom 包与基本的plot 图形配合得很好。它允许您以交互方式修改 X 和 Y 比例(范围和分辨率)。我相信iplots 也可以。
  • 查看整个内容对我来说很重要。我需要查看每个数据点的时间序列的精确演变。你能举一些关于你推荐的例子吗?我还想把它放在html 报告中,或者不以当时打开 R 为条件的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多