10

我正在构建一个使用 geom_tile 的绘图,然后将其输出到 .pdf(使用 pdf("filename",...))。但是,当我这样做时,.pdf 结果有细小的线条(有人说的条纹)贯穿其中。我附上了一张显示问题的图片。 最小的例子

谷歌搜索让这个线程,但那里唯一真正的建议是尝试将 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

4 回答 4

18

发生这种情况是因为默认colour的瓷砖geom_tile看起来是白色的。

要解决此问题,您需要以colourfill.

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

在此处输入图像描述

于 2012-04-23T08:01:23.377 回答
7

尝试使用geom_raster

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

在我的环境中质量很好。

在此处输入图像描述

于 2012-04-23T08:00:58.273 回答
0

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

CairoPDF("mew.pdf") # Package Cairo

解决这个问题

于 2012-04-23T09:13:43.187 回答
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 'image',它为每个像素绘制一个小块或 '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")
}
于 2016-09-01T14:17:39.760 回答