在 R 中将填充等高线图保存为 PDF 会给出像素化结果

Saving filled contour plots to PDF in R gives pixelated results

正在将 Rfilled.contour 函数的一个内置示例的输出保存为 PDF:

pdf('test.pdf')
require("grDevices")
filled.contour(volcano, asp = 1)
dev.off()

产生离散化结果(见下文)。有没有什么办法解决这一问题?系统信息:

> sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.1 LTS

在接受的答案后编辑:

这个问题实际上在pdf函数的文档中被报告:

If you see problems with PDF output, do remember that the
problem is much more likely to be in your viewer than in R ... 
Symptoms for which the viewer has been at fault are apparent 
grids on image plots ...
    
Unfortunately the default viewers on most Linux and macOS 
systems have these problems, and no obvious way to turn off 
graphics anti-aliasing.

记录问题的地方很奇怪,因为细分为矩形段显然是由 filled.contour 而不是 pdf 引起的。否则 ggplot2 的输出也会遇到同样的问题。

这可能是抗锯齿的结果:当您显示图像时,它会一次绘制一个正方形。在绘制它们时,边缘是方形颜色和白色背景的混合,因此绘制得较浅。

不幸的是,这并不是您真正可以控制的事情。引入工件的是 PDF 预览器。请参阅此页面 https://codedocean.wordpress.com/2014/02/03/anti-aliasing-and-image-plots/ 进行讨论。

那里的建议对我有用:将 png() 设备与 type = "cairo" 一起使用。这给出了位图输出而不是 pdf().

的矢量输出
png('test.png',type="cairo")
filled.contour(volcano, asp = 1)
dev.off()

编辑添加:

我不认为 filled.contour 可以做得更好,但如果您愿意切换到 ggplot2 图形,则可以。当它绘制填充轮廓时,它似乎使用多边形来绘制,而不是 filled.contour 使用的 image 样式图。这仍然在预览器中显示相同的抗锯齿错误,但现在线条出现在颜色之间的边界上,这不那么令人讨厌了。例如:

df <- data.frame(x = as.numeric(row(volcano)-1)/(nrow(volcano)-1),
                 y = as.numeric(col(volcano)-1)/(ncol(volcano)-1),
                 z = as.numeric(volcano))    
pdf('test.pdf')
library(ggplot2)
ggplot(df, aes(x=x, y=y, z=z)) + 
  geom_contour_filled()
dev.off()

我不知道如何获得与 filled.contour 使用相同的调色板,即 function(n) hcl.colors(n, "YlOrRd", rev = TRUE)。也许其他人可以在评论中向我们展示。