r - 在 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.contour
由pdf
. 否则ggplot2
的输出也会遇到同样的问题。
解决方案
这可能是抗锯齿的结果:当您显示图像时,它一次绘制一个正方形。在绘制它们时,边缘是正方形颜色和白色背景的混合,因此它被绘制得更浅。
不幸的是,这并不是您真正可以控制的事情。引入工件的是 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)
. 也许其他人可以在评论中向我们展示。
推荐阅读
- ruby - 如何从另一个方法中访问两个方法?
- python - 当我使用 jupyter notebook pip install COVID19Py 时,我收到一个 ERROR Command errored out with exit status 1
- blueprint - Blueprint.js MultiSelect:如何启用滚动?
- python - 不能从另一个文件继承 TestCase
- node.js - $push 到多个嵌套数组两个深
- bots - 试图在 discord.js 嵌入机器人的列中显示玩家名称
- rust - 如何将结构成员传递给 rust 宏
- apache-spark - 无法让 S3A 目录提交者在 Spark 3.0.0 中写入文件
- javascript - 如果 JavaScript 包含 jinja,它将不会运行,否则会运行
- amazon-web-services - AWS Cognito,通过 CLI 更改账户状态