我正在构建一个使用geom_tile然后将其输出到.pdf的图(使用pdf(“filename”,...))。但是,当我这样做时,.pdf结果会有很小的线条(条纹,正如一个人所说)穿过它。我附上了一张显示问题的图片。
谷歌搜索到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"))
答案 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")
)
答案 1 :(得分:6)
尝试使用geom_raster
:
pdf("mew.pdf")
print(v + geom_raster(aes(fill=z)) + stat_contour(size=2) + scale_fill_gradient("z"))
dev.off()
我的环境质量很好。
答案 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")
}