首页 > 解决方案 > 在 R 中将填充的等高线图保存为 PDF 会产生像素化结果

问题描述

R将函数的内置示例之一的输出保存filled.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.contourpdf. 否则ggplot2的输出也会遇到同样的问题。

标签: rpdfplotcontourvector-graphics

解决方案


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

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

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

png('test.png',type="cairo")
filled.contour(volcano, asp = 1)
dev.off()

在此处输入图像描述

编辑添加:

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

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). 也许其他人可以在评论中向我们展示。


推荐阅读