2011-02-07 29 views
13

पूर्ण प्रकटीकरण के साथ कस्टम आकार बनाना: यह ggplot2 मेलिंग सूची में भी पोस्ट किया गया था। (अगर मुझे कोई प्रतिक्रिया मिलती है तो मैं अपडेट करूंगा)आर: ggplot

मैं इस पर थोड़ा सा खो गया हूं, मैंने geom_polygon के साथ गड़बड़ करने की कोशिश की है लेकिन लगातार प्रयास पिछले की तुलना में बदतर लगते हैं।

छवि है कि मैं पुन: बनाने की कोशिश कर रहा हूँ है यह, रंग महत्वहीन हैं, लेकिन पदों हैं:

enter image description here

इस बनाने के अलावा, मैं भी प्रत्येक लेबल करने के लिए सक्षम होना चाहिए पाठ के साथ तत्व।

इस बिंदु पर, मुझे समाधान की उम्मीद नहीं है (हालांकि यह आदर्श होगा) लेकिन पॉइंटर्स या इसी तरह के उदाहरण बेहद सहायक होंगे।

एक विकल्प जिसे मैंने साथ खेला था वह स्केल_शिप हैकिंग और 1,1 को कॉर्ड के रूप में उपयोग कर रहा था। लेकिन लेबल जोड़ने में सक्षम होने के साथ अटक गया था।

कारण मैं ggplot के साथ ऐसा कर रहा हूं, क्योंकि मैं कंपनी के आधार पर कंपनी पर स्कोरकार्ड उत्पन्न कर रहा हूं। यह अन्य प्लॉट्स के 4 x 10 ग्रिड (पुश व्यूपोर्ट का उपयोग करके) में केवल एक साजिश है

नोट: पिरामिड का शीर्ष स्तर भी समान आकार का आयताकार हो सकता है।

+0

तुम सच में आर के साथ ऐसा करना चाहते हैं? जो मुझे समझ में नहीं आता वह अंतर्निहित प्रेरणा है ...इस तरह की चीजें आसानी से वेक्टर ग्राफिक्स प्रोग्राम के साथ बनाई जा सकती हैं, और आपको केवल आर पर जोर देना चाहिए यदि आप इसे प्रोग्रामेटिक रूप से और/या दिखाने के लिए तैयार हैं। =) अन्यथा, इस तरह के दृष्टिकोण सिर्फ कोई समझ नहीं लेते हैं ... – aL3xa

+0

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

+0

अंडाकार के लिए, यह मदद कर सकता है: http://stackoverflow.com/questions/2397097/how-can-a-data-ellipse-be-superimposed-on-a-ggplot2-scatterplot और https://github.com /JoFrhwld/FAAV/blob/master/r/stat-ellipse.R –

उत्तर

9

ऐसा लगता है कि आप geom_path() और geom_segment() के संयोजन का उपयोग कर सकते हैं क्योंकि आप या तो अपने ग्राफ/चार्ट/चीज़माजिगर पर प्रत्येक प्रमुख बिंदु के लिए समन्वय स्थानों को उचित रूप से पहचान सकते हैं या कर सकते हैं। शायद ऐसा कुछ काम करेगा? बनाए गए डेटा.फ्रेम में ऊपर दिए गए आकार की रूपरेखा है (मैंने शीर्ष पर आयताकार का चयन किया है ... मुझे यकीन है कि यदि आप वास्तव में चाहते थे तो सर्कल का अनुमान लगाने के लिए अंक उत्पन्न करने का एक आसान तरीका मिल सकता है। geom_segment() का उपयोग सूद करने के लिए बड़े आकार आप की जरूरत के रूप में है।

df <- data.frame(
    x = c(-8,-4,4,8,-8, -8, -8, 8, 8, -8) 
    , y = c(0,18,18,0,0, 18, 22, 22, 18, 18) 
    , group = c(rep(1,5), rep(2,5))) 

qplot(x,y, data = df, geom = "path", group = group)+ 
    geom_segment(aes(x = 0, y = 0, xend = 0, yend = 12)) + 
    geom_segment(aes(x = -6.75, y = 6, xend = 6.75, yend = 6)) + 
    geom_segment(aes(x = -5.25, y = 12, xend = 5.25, yend = 12)) + 
    geom_segment(aes(x = -2, y = 12, xend = -2, yend = 18)) + 
    geom_segment(aes(x = 2, y = 12, xend = 2, yend = 18)) + 
    geom_text(aes(x = -5, y = 2.5), label = "hi world") 
+0

मैंने geom_segment() का उपयोग करने पर भी विचार नहीं किया। निर्देश के लिए धन्यवाद! –

18

यहाँ मेरी प्रस्तावित समाधान है। बहुभुज डेटा की एक श्रृंखला बनाएँ, और geom_polygon() का उपयोग इन प्लॉट करने के लिए। geom_text() साथ पाठ लेबल प्लॉट करें।

के साथ cluster पैकेज में अंडाकार बनाएं।

आप, कथा, ग्रिडलाइनें, अक्ष लेबल, आदि

enter image description here

library(ggplot2) 
library(cluster) 

mirror <- function(poly){ 
    m <- poly 
    m$x <- -m$x 
    m 
} 

poly_br <- data.frame(
     x=c(0, 4, 3, 0), 
     y=c(0, 0, 1, 1), 
     fill=rep("A", 4) 
) 


poly_mr <- data.frame(
     x=c(0, 3, 2, 0), 
     y=c(1, 1, 2, 2), 
     fill=rep("B", 4) 
) 

poly_tr <- data.frame(
     x=c(0.5, 2, 1, 0.5), 
     y=c(2, 2, 3, 3), 
     fill=rep("C", 4) 
) 

poly_tm <- data.frame(
     x=c(-0.5, 0.5, 0.5, -0.5), 
     y=c(2, 2, 3, 3), 
     fill=rep("D", 4) 
     ) 

poly_bl <- mirror(poly_br) 
poly_ml <- mirror(poly_mr) 
poly_tl <- mirror(poly_tr) 


get_ellipse <- function(data, fill){ 
    edata <- as.matrix(data) 
    ehull <- ellipsoidhull(edata) 
    phull <- as.data.frame(predict(ehull)) 
    data.frame(
      x=phull$V1, 
      y=phull$y, 
      fill=rep(fill, nrow(phull)) 
    ) 
} 

ellipse <- get_ellipse(
     data.frame(
       x=c(0, 2, 0, -2), 
       y=c(3, 3.5, 4, 3.5) 
    ), fill="E" 
) 

text <- data.frame(
     x=c(2, -2, 1.5, -1.5, 1.25, -1.25, 0, 0), 
     y=c(0.5, 0.5, 1.5, 1.5, 2.5, 2.5, 2.5, 3.5), 
     text=c("br", "bl", "mr", "ml", "tr", "tl", "tm", "ellipse")) 


poly <- rbind(poly_br, poly_bl, poly_mr, poly_ml, poly_tr, poly_tm, poly_tl, ellipse) 


p <- ggplot() + 
     geom_polygon(data=poly, aes(x=x, y=y, fill=fill), colour="black") + 
     geom_text(data=text, aes(x=x, y=y, label=text)) 
print(p) 
13
ग्रिड ग्राफिक्स के साथ

को हटाने के द्वारा साजिश सौंदर्यशास्त्र संशोधित करना चाहते हैं जाएगा

library(grid) 

ellipse <- function (x = 0, y = 0, a=1, b=1, 
         angle = pi/3, n=300) 
{ 

    cc <- exp(seq(0, n) * (0+2i) * pi/n) 

    R <- matrix(c(cos(angle), sin(angle), 
       -sin(angle), cos(angle)), ncol=2, byrow=T) 

    res <- cbind(x=a*Re(cc), y=b*Im(cc)) %*% R 
    data.frame(x=res[,1]+x,y=res[,2]+y) 
} 


pyramidGrob <- function(labels = c("ellipse", paste("cell",1:7)), 
         slope=5, 
         width=1, height=1, 
         fills=c(rgb(0, 113, 193, max=256), 
          rgb(163, 163, 223, max=256), 
          rgb(209, 210, 240, max=256), 
          rgb(217, 217, 217, max=256)), ..., 
         draw=FALSE){ 

    a <- 0.4 
    b <- 0.14 
    ye <- 3/4 + b*sin(acos((3/4/slope-0.5)/a)) 
    e <- ellipse(0.5, ye, a=a, b=b,angle=0) 
    g1 <- polygonGrob(e$x, e$y, gp=gpar(fill=fills[1])) 

    x1 <- c(0, 0.5, 0.5, 1/4/slope, 0) 
    y1 <- c(0, 0, 1/4, 1/4, 0) 

    x2 <- c(1/4/slope, 0.5, 0.5, 1/2/slope, 1/4/slope) 
    y2 <- y1 + 1/4 

    x3 <- c(1/2/slope, 0.5, 0.5, 3/4/slope, 1/2/slope) 
    y3 <- y2 + 1/4 

    x4 <- c(0.5 - 3/4/slope, 0.5 + 3/4/slope, 
      0.5 + 3/4/slope, 0.5 - 3/4/slope, 
      0.5 - 3/4/slope) 

    y4 <- y3 

    d <- data.frame(x = c(x1,1-x1,x2,1-x2,x3,1-x3,x4), 
        y = c(y1,y1,y2,y2,y3,y3,y4), 
        id = rep(seq(1,7), each=5)) 

    g2 <- with(d, polygonGrob(x, y, id, 
        gp=gpar(fill=fills[c(rep(2:4,each=2),4)]))) 

    x5 <- c(0.5, 0.25, 0.25, 0.25, 0.75, 0.75, 0.75, 0.5) 
    y5 <- c(3/4+1/8, 1/8, 1/2 - 1/8, 1/2 + 1/8, 
      1/8, 1/2 - 1/8, 1/2 + 1/8, 1/2 + 1/8) 

    g3 <- textGrob(labels, x5,y5, vjust=1) 
    g <- gTree(children=gList(g1,g2,g3), ..., 
       vp=viewport(width=width,height=height)) 

    if(draw) grid.draw(g) 
    invisible(g) 
} 


grid.newpage() 

## library(gridExtra) 
source("http://gridextra.googlecode.com/svn/trunk/R/arrange.r") 

grid.arrange(pyramidGrob(height=0.4), 
       pyramidGrob(), 
       pyramidGrob(width=0.5),ncol=2) 

screenshot

इसके अलावा, ग्रिड व्यूपोर्ट का उपयोग उसी पृष्ठ पर विभिन्न ऑब्जेक्ट्स रखने के लिए किया जा सकता है। उदाहरण के लिए,

library(gridExtra) 


grid.arrange(tableGrob(head(iris)[,1:3]), 
      pyramidGrob(), qplot(1:10,1:10), 
      lattice::xyplot(1:10~1:10), ncol=2, 
      main = "arrangement of Grid elements") 

screenshot2

+0

यह एक बहुत अच्छा लग रहा है, मेरी एकमात्र चिंता यह है कि यह ग्रिड का उपयोग करता है, और मैं स्कोर कार्ड पर अन्य तत्वों को रखने के लिए पहले ही ग्रिड का उपयोग कर रहा हूं (7 अन्य प्लॉट सटीक होने के लिए)। मौजूदा प्लॉट्स के ग्रिड के भीतर प्लेसमेंट के लिए मैं इसे एक चर में कैसे सहेजूं? –

+1

आप एक पृष्ठ में मनमानी तत्वों को मिश्रित कर सकते हैं बशर्ते वे सभी मेरे उदाहरण की तरह ग्रिड ग्राफिक्स पर आधारित हों। विशेष रूप से, आप ग्रिड व्यूपोर्ट्स का उपयोग करके साइड-बाय-साइड ग्रिड ग्रब्स, जीजीप्लॉट या जाली ग्राफ आसानी से रख सकते हैं। grid.arrange() आयताकार लेआउट के लिए बस यही करता है। यदि आपको अधिक जानकारी चाहिए तो कृपया अपने प्रोजेक्ट का एक और पूर्ण विवरण प्रदान करें। – baptiste