2012-04-23 21 views
7

मैं एक प्लॉट का निर्माण कर रहा हूं जो geom_tile का उपयोग करता है और फिर इसे .pdf पर आउटपुट करता है (पीडीएफ ("फ़ाइल नाम", ...) का उपयोग कर)। हालांकि, जब मैं करता हूं, तो पीडीएफ परिणाम में छोटी रेखाएं होती हैं (स्ट्राइशन, जैसे एक व्यक्ति इसे डालता है) इसके माध्यम से चल रहा है। मैंने समस्या दिखाने वाली एक छवि संलग्न की है। Minimal exampleआर ggplot: पीडीएफ आउटपुट में geom_tile लाइनें

this thread जाने Googling, लेकिन वहाँ में केवल वास्तविक सलाह आकार = 0 गुजर geom_tile को, जो मैं कोई प्रभाव के साथ किया था की कोशिश करने का था। मैं इन्हें कैसे ठीक कर सकता हूं इस पर कोई सुझाव? मैं इसे एक पेपर में एक आकृति के रूप में उपयोग करना चाहता हूं, लेकिन यह इस तरह काम नहीं करेगा।

मिनिमल कोड: geom_raster उपयोग करने के लिए

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 पर उसी तरह से ज़ेड करने की आवश्यकता है।

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

प्रयास करें:

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

मैं अपने कंप्यूटर (विंडोज 7) पर समस्या को पुन: नहीं कर सकते, लेकिन मुझे याद है यह एक समस्या कुछ विन्यास के लिए सूची पर विचार-विमर्श किया था। ब्रायन रिप्ले (यदि मुझे याद है) की सिफारिश की

CairoPDF("mew.pdf") # Package Cairo 

इस

+0

मैंने वास्तव में कोशिश की थी (cairo_pdf()), लेकिन यह समस्या को ठीक नहीं लग रहा था ... – Winawer

0

इस बिल्ली skinning, और waaay भी ज्यादा विस्तार में जाने के हितों में चारों ओर पाने के लिए, इस कोड quads का एक जाल में आर छवि विघटित हो जाता है (जैसा कि 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 

यह पारंपरिक आर 'छवि' है, जो प्रत्येक पिक्सेल के लिए थोड़ा टाइल या 'रेक्ट()' खींचती है।

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

यह धीमी है, और यद्यपि यह हुड के नीचे '() रेक्ट' का स्रोत कहता है, हम भी सीमा रंग निर्धारित नहीं कर सकते। अधिक कुशल ड्राइंग समय, इंटरपोलेशन पर नियंत्रण, और अंत में - फ़ाइल आकार के लिए 'rasterImage' का उपयोग करने के लिए 'useRaster = TRUE' का उपयोग करें।

अब आइए छवि को दोबारा प्लॉट करें, लेकिन स्पष्ट रूप से प्रत्येक पिक्सेल के लिए रेक्ट को कॉल करके। ('क्वाडमेश' शायद प्रदर्शित करने का सबसे आसान तरीका नहीं है, यह मेरे दिमाग में ताजा है)।

## 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") 
} 
संबंधित मुद्दे