R ggplot:pdf输出中的geom_tile行

时间:2012-04-23 07:50:57

标签: r pdf ggplot2

我正在构建一个使用geom_tile然后将其输出到.pdf的图(使用pdf(“filename”,...))。但是,当我这样做时,.pdf结果会有很小的线条(条纹,正如一个人所说)穿过它。我附上了一张显示问题的图片。 Minimal example

谷歌搜索到this thread,但唯一真正的建议是尝试将size = 0传递给geom_tile,我做了没有效果。关于我如何解决这些问题的任何建议?我想用它作为一篇论文中的数字,但它不会像这样工作。

最小代码:

require(ggplot2)
require(scales)
require(reshape)

volcano3d <- melt(volcano) 
names(volcano3d) <- c("x", "y", "z") 
 v <- ggplot(volcano3d, aes(x, y, z = z)) 

pdf("mew.pdf")
print(v + geom_tile(aes(fill=z)) + stat_contour(size=2) + scale_fill_gradient("z"))

4 个答案:

答案 0 :(得分:14)

这是因为colour中的图块的默认geom_tile似乎是白色的。

要解决此问题,您需要以与colour相同的方式将fill映射到z。

print(v + 
  geom_tile(aes(fill=z, colour=z), size=1) + 
  stat_contour(size=2) + 
  scale_fill_gradient("z")
)

enter image description here

答案 1 :(得分:6)

尝试使用geom_raster

pdf("mew.pdf")
print(v + geom_raster(aes(fill=z)) + stat_contour(size=2) + scale_fill_gradient("z"))
dev.off()

我的环境质量很好。

enter image description here

答案 2 :(得分:0)

我无法在我的计算机上重现问题(Windows 7),但我记得这是某些配置列表中讨论的问题。 Brian Ripley(如果我记得的话)推荐

CairoPDF("mew.pdf") # Package Cairo

绕过这个

答案 3 :(得分:0)

为了使这只猫皮肤化,并且进入太多细节,这段代码将R图像分解为一个四边形网格(由rgl使用),然后显示光栅图之间的差异和“瓦片”或“矩形”图。

library(raster)
im <- raster::raster(volcano)
## this is the image in rgl corner-vertex form
msh <- quadmesh::quadmesh(im)

## manual labour for colour scaling
dif <- diff(range(values(im)))
mn <- min(values(im))
scl <- function(x) (x - mn)/dif

这是传统的R'图像',它为每个像素绘制一个小瓦片或'rect()'。

list_image <- list(x = xFromCol(im), y = rev(yFromRow(im)), z = t(as.matrix(im)[nrow(im):1, ]))
image(list_image)

它很慢,虽然它在引擎盖下调用'rect()'的来源,但我们也不能设置边框颜色。使用'useRaster = TRUE'来使用'rasterImage'来提高绘图时间,控制插值,最终控制文件大小。

现在让我们再次绘制图像,但是通过为每个像素显式调用rect。 ('quadmesh'可能不是最容易演示的方式,它在我的脑海里只是新鲜的)。

## worker function to plot rect from vertex index
rectfun <- function(x, vb, ...) rect(vb[1, x[1]], vb[2,x[1]], vb[1,x[3]], vb[2,x[3]], ...)

## draw just the borders on the original, traditional image
apply(msh$ib, 2, rectfun, msh$vb, border = "white")

现在再试一次'rect'。

## redraw the entire image, with rect calls 
##(not efficient, but essentially the same as what image does with useRaster = FALSE)
cols <- heat.colors(12)
## just to clear the plot, and maintain the plot space
image(im, col = "black")  
for (i in seq(ncol(msh$ib))) {
  rectfun(msh$ib[,i], msh$vb, col = cols[scl(im[i]) * (length(cols)-1) + 1], border = "dodgerblue")
}