2012-01-18 13 views
12

मुझे उम्मीद है कि ggplot2 की भयानक ग्राफिंग शक्ति के साथ grImport की स्पिफी आयात और ड्राइंग शक्तियों को जोड़ सकते हैं, लेकिन मैं बस grid सिस्टम को समझ नहीं पा रहा हूं जो मुझे प्राप्त करने का एक शानदार तरीका खोजने के लिए पर्याप्त है। मैं क्या चाहता हूं कि ggplot2 ग्राफ़ में x-axis टिक लेबल को grImport का उपयोग करके आयातित छवियों के साथ प्रतिस्थापित करना है।मैं ggplot2 (ग्रिड फ़ंक्शंस का उपयोग करके) अक्ष अक्ष टिक लेबल के रूप में grImport के साथ आयात किए गए ग्राफ़िक का उपयोग कैसे कर सकता हूं?

के बाद से दोनों संकुल grid कार्यों का उपयोग, मैं वहाँ आशा करती हूं कि grid.symbols() उपयोग करने के लिए एक तरीका है या तो ggplot2 ढांचा है, जो आदर्श, या कम से कम एक डिवाइस में एक मौजूदा भूखंड पर किया जाएगा के भीतर। क्या ऐसी चीजों के बारे में अधिक जानकारी वाले किसी को ऐसा करने का एक मजबूत तरीका पता है? या, क्या कोई मुझे ग्रोब्स, व्यूपोर्ट्स इत्यादि के बारे में जानने में मदद करने के लिए मुझे अधिक जानकारी दे सकता है? मैंने ग्रिड ग्राफिक्स मॉडल पर free Chapter of Paul Murrel's R graphics book के माध्यम से पढ़ा है, लेकिन मैं लिंक बनाने के लिए ggplot2 के आंतरिक कार्यों के साथ पर्याप्त परिचित नहीं हूं।

मेरा प्रश्न an existing question about using an image as a plot point के समान है, हालांकि मुझे साजिश बिंदुओं की बजाय धुरी लेबल में अधिक रुचि है। हालांकि, मैं उत्सुक होगा कि दो कार्य कितने समान हैं, और यदि इस समाधान के लिए उस समाधान को अनुकूलित किया जा सकता है। मैं इसे अपने आप समझने में सक्षम नहीं था।

यह मेरी पहली पोस्ट है, इसलिए मुझे एक छवि पोस्ट करने की अनुमति नहीं है, लेकिन यह कोड मुझे जो कुछ चाहिए, उसके करीब कुछ प्राप्त करता है। नोट: यह दृष्टिकोण एक बदसूरत, बदसूरत हैक का उपयोग करता है जो पोर्टेबल नहीं है, और असंतोषजनक है। आखिरी साजिश जिसे मैं उत्पादित करना चाहता हूं, में पहलुओं (facet_grid) होंगे, और एक्स-अक्ष एक कारक के लिए है, प्रत्येक अक्ष पर विभिन्न चित्रों के साथ, निरंतर परिवर्तनीय नहीं है, यही कारण है कि मैं एक अधिक सामान्य/मजबूत समाधान जिसके लिए बहुत परीक्षण की आवश्यकता नहीं है & त्रुटि।

library(ggplot2) 
## library(grImport) # not needed for this example, but would be for grid.symbols() 

p <- ggplot(mtcars, aes(cyl, mpg)) + stat_summary(fun.data = "mean_cl_boot") 
print(p) 

## Replace (in this case, overlay) x-axis tick labels with a graphic/grob 
iconSize <- 0.05 
iconHt <- 0.2 
padding <- 0.09 # horizontal padding around axis: I found this by trial & error 
tickSp <- (1-padding)/(4*2) 
downViewport("axis_h-5-3") 
## I would use grid.symbols() with an imported Picture in place of grid.circle(), 
## but the idea is the same: draw a shape at the ticks along the axis. 
for (i in 0:(max(mtcars$cyl) - min(mtcars$cyl))) 
{ 
    grid.circle(x = (padding/2 + tickSp*(i*2)), y = iconHt, 
       r = iconSize*(min(mtcars$cyl)+i), gp = gpar(fill="black")) 
} 

upViewport() 
+0

एक वैकल्पिक विकल्प 'उपयोग करने के लिए tikzDevice', और ([वेक्टर ग्राफिक्स डालें] को LaTeX प्राप्त होगा लेबल के स्थान पर http://groups.google.com/group/ggplot2/browse_thread/thread/38f8695ad55cc2d6?pli=1)। – baptiste

+0

सभी निर्देशक उदाहरणों के लिए धन्यवाद @baptiste!, मुझे यह सब कुछ संसाधित करने में कुछ समय लगा, लेकिन वे बहुत उपयोगी थे (नीचे टिप्पणियां देखें)। मैं 'tikzDevice' दिमाग में रखूंगा, हालांकि यह इस बिंदु पर थोड़ी अधिक मात्रा में दिखता है। मैंने लिंक में उदाहरण का प्रयास किया, लेकिन यह त्रुटियों के साथ विफल रहा (लाटेक्स रासायनिक यौगिकों के लिए आदेशों को समझ नहीं पाया), और मेरे आर सत्र में कुछ बदलाव किए जिन्हें मैं समझ नहीं पाया कि फिर से शुरू किए बिना कैसे उलटना है आर :( –

+0

इतना करीब है, लेकिन मैं प्रत्येक अक्ष टिक पर एक अलग तस्वीर रखना चाहता हूं। क्या किसी भी समाधान को अनुकूलित किया जा सकता है?वैकल्पिक रूप से, क्या एक्स-अक्ष टिक्स की स्थिति को इस तरह से निकालने का कोई तरीका है कि उन्हें लगातार कॉल में 'grid.symbols() 'या' प्रतीकों Grob() 'में उपयोग किया जा सकता है? 'TikzDevice' का उपयोग करके –

उत्तर

18

यहाँ एक उदाहरण है:

# convert ps to RGML 
PostScriptTrace(file.path(system.file(package = "grImport"), "doc", "GNU.ps"), "GNU.xml") 
PostScriptTrace(file.path(system.file(package = "grImport"), "doc", "tiger.ps"), "tiger.xml") 
# read xml 
pics <- list(a = readPicture("GNU.xml"), b = readPicture("tiger.xml")) 

# custom function for x axis label. 
my_axis <- function() { 
    structure(
     function(label, x = 0.5, y = 0.5, ...) { 
     absoluteGrob(
      do.call("gList", mapply(symbolsGrob, pics[label], x, y, SIMPLIFY = FALSE)), 
      height = unit(1.5, "cm")) 
    } 
)} 

qplot(factor(c("a", "b")), 1:2) + opts(axis.text.x = my_axis()) 

enter image description here

+0

भविष्य में ggplot2 में धुरी-आईएनजी सिस्टम हो सकता है जैसे: '+ अक्ष (x = axis_picture(), y = axis_text)' लेकिन भविष्य में। – kohske

+0

ठीक है, मैं नीचे वर्णित अपना "बदसूरत हैक" वापस लेता हूं;) यह 'grid.symbols' की कमी वाले वेक्टरिसेशन के लिए काफी साफ है। – baptiste

+0

शानदार! धन्यवाद, ऐसे ही शानदार कार्य करते रहें। Ggplot2 के लिए इस तरह की शानदार सुविधाओं को देखना बहुत अच्छा लगता है, लेकिन यह अभी भी प्रभावशाली है कि इसमें से अधिकतर सही कोड के साथ पहले से ही पूरा किया जा सकता है;) मैं एक कस्टम फ़ंक्शन बनाने के लिए कुछ मामूली बदलाव करने में सक्षम था जो सूची स्वीकार करता है एक तर्क के रूप में चित्र (मैंने अपना 'picture_axis() 'कहा है), लेकिन यह वही है जो मुझे दिमाग था। तुम लोग कमाल के हो। –

6

एक पैनल के लिए, यह एक्स अक्ष ग्रोब से जानकारी निकालने के लिए काफी सीधे आगे है, और इसे अपने आप से प्रतिस्थापित करें। मुझे यकीन नहीं है कि यह स्वचालित, बहु-पैनल अक्षों को स्पष्ट रूप से कैसे बढ़ाया जा सकता है।

library(grid) 
library(ggplot2) 

p <- qplot(1:12, rnorm(12)) 
grid.newpage() 
g <- ggplotGrob(p) 
grid.draw(g) 
g0 <- getGrob(g, gPath("axis.text.x"), grep=TRUE) 
grid.set(gPath("axis.text.x"), 
     pointsGrob(x = g0$x, y=0*g0$x + unit(0.5,"npc"), 
        pch=19, gp=gpar(col=seq_along(g0$x)), 
        name = g0$name), grep = TRUE) 

screenshot

4

नीचे अक्ष लेबल के लिए एक कस्टम Grob उपयोग करने के लिए एक हैक है।

library(grid) 
library(ggplot2) 

## convert the labels to some parameter to be used in the custom grob 
## here simply an index that will be interpreted as color 
mapping <- function(x, ...){ 
    seq_along(x) 
} 

library(grImport) 

hourglass <- new("Picture", 
paths= list(new("PictureFill", 
x=c(0, 1, 0, 1), 
y=c(0, 0, 1, 1))), 
summary= new("PictureSummary", 
numPaths=1, 
xscale=c(0, 1), 
yscale=c(0, 1))) 

## bare bones edit of theme_text() 
my_axis <- function() 
{ 
    structure(function(label, x = 0.5, y = 0.5, default.units = "npc", ...) { 
     cols <- mapping(label) 

     symbolsGrob(hourglass, x, 0*x + unit(0.5, "npc"), 
        use.gc=FALSE,size=unit(5,"mm"), gp=gpar(fill=cols)) 

    }, class = "theme", type = "custom", call = match.call()) 
} 

qplot(1:12, rnorm(12)) + 
    opts(axis.text.x = my_axis(), axis.ticks.margin = unit(0.5, "cm")) 

screenshot

+0

मुझे यकीन नहीं है कि कोई भी (सुंदरता) प्रत्येक स्थान पर विभिन्न प्रतीक आकारों का उपयोग कर सकता है। – baptiste

+0

मुझे वास्तव में यह दृष्टिकोण पसंद है, क्योंकि यह साजिश को अपेक्षाकृत आत्मनिर्भर रखता है, और यहां तक ​​कि ggsave() के साथ भी काम करना चाहिए! मैं पुष्टि कर सकता हूं कि यह बहु-पैनल भूखंडों के साथ काम करता है, लेकिन ... मुझे वास्तव में प्रत्येक अक्ष टिक पर एक अलग तस्वीर रखने की आवश्यकता है। कोई विचार? –

+0

पॉल मुरेल से पूछता है? मैंने कई चित्रों के साथ 'grid.symbols' के उदाहरण नहीं देखा है। आप अनिवार्य रूप से लूप के लिए चित्र तर्क के संबंध में "vectorize" 'grid.symbols' को एक बदसूरत हैक लिख सकते हैं (उदाहरण के लिए, पैकेज 'gridExtra' में' drawDetails.pattern' देखें) – baptiste

संबंधित मुद्दे