2012-04-23 23 views
7

私はgeom_tileを使って、それをpdf( "filename"、...)を使って出力するプロットを作っています。しかし、私がすると、.pdf結果には小さな行(1人の人が書いた通りの行)が流れています。問題を示す画像を添付しました。 Minimal exampleR ggplot:pdom出力のgeom_tile行

グーグルは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")) 

答えて

13

geom_tileのタイルのデフォルトcolourは白のようですので、これが起こります。

これを修正するには、fillと同じ方法でcolourをzにマップする必要があります。

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

ありがとう、kohske!私もできればあなたの答えを受け入れるだろうが、今日あなたが2度私を助けてくれたので、私はその代わりにそれを受け入れるだろう。 :-)あなたの答えについての素敵な点は、結果のグラフィックがよりスムーズで、プロダクションバージョンで使用することになるかもしれないということです。 – Winawer

0

私は自分のコンピュータ(Windows 7の)上の問題を再現することはできませんが、私はそれが特定の構成のためのリストの上に述べた問題だった覚えています。ブライアン・リプリー(私が覚えている場合)は、この猫をスキニング、およびwaaayあまり詳細に入るの利益ではこの

+0

私は実際にそれを試しましたが(cairo_pdf())、問題を解決していないようです... – Winawer

0

を回避するために

CairoPDF("mew.pdf") # Package Cairo 

をお勧めします、このコードは、クワッドのメッシュにRの画像を分解する(rglで使用されているように)、ラスタプロットと「タイル」または「rect」プロットの違いを表示します。

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()'のソースを呼び出しますが、境界線の色も設定できません。 'rasterImage'を使用すると、効率的な描画時間、補間制御、最終的にはファイルサイズを使用するには 'useRaster = TRUE'を使用します。

ここで、イメージを再度プロットしてみましょう。明示的にすべてのピクセルに対してrectを呼び出します。 (「クワッドメッシュ」はおそらく最も簡単な方法ではなく、私の心の中で新鮮なものです)。

## 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") 
}