2012-04-23 2 views
7

Я строю сюжет, который использует geom_tile, а затем выводит его в .pdf (используя pdf («filename», ...)). Однако, когда я это делаю, результат .pdf имеет крошечные линии (штрихи, как сказал один человек). Я добавил изображение, показывающее проблему. Minimal exampleR ggplot: geom_tile lines in pdf output

Googling let to this thread, но единственным настоящим советом было попробовать передать размер = 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")) 

ответ

13

Это происходит потому, что по умолчанию colour плитки в geom_tile, кажется белым.

Чтобы исправить это, вам необходимо сопоставить colour с z так же, как fill.

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

enter image description here

+0

Спасибо, что исправляет проблему блестяще! – Winawer

+1

Чтобы избежать возмущений, вызванных этой формой плитки, вы можете сделать это в двух отдельных слоях: 'geom_tile (aes (color = z), fill = NA) + geom_tile (aes (fill = z), color = NA) '. – otsaw

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

+0

Спасибо, кохске! Я бы тоже принял ваш ответ, если бы мог, но, поскольку вы сегодня помогли мне дважды, я пойду принять это вместо этого. :-) Одна приятная вещь в вашем ответе заключается в том, что итоговая графика более плавная, и я могу закончить ее использование в производственной версии. – Winawer

0

Я не могу воспроизвести проблему на моем компьютере (Windows 7), но я помню, что это была проблема обсуждается в списке для определенных конфигураций. Brian Ripley (если я помню) рекомендовал

CairoPDF("mew.pdf") # Package Cairo 

, чтобы обойти эту

+0

Я действительно пробовал это (cairo_pdf()), но он, похоже, не исправил проблему ... – Winawer

0

В интересах снятия шкуры этого кота, и, войдя в waaay слишком много деталей, этот код разлагает 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) 

Это медленно, и, хотя он называет источник «прямоугольник()» под капотом, мы не можем также установить цвет границы. Используйте «useRaster = TRUE» для использования «rasterImage» для более эффективного времени рисования, управления интерполяцией и, в конечном счете, размера файла.

Теперь давайте построим изображение снова, но явно вызываем прямоугольник для каждого пикселя. («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") 
} 
Смежные вопросы