2016-01-20 8 views
12
में अलग से बात करने के लिए कैसे

कोड इस प्रकार है:लाइन के आकार का मूल्यांकन करते और ggplot2

set.seed(123) 
d1=data.frame(x=runif(10),y=runif(10),z=runif(10,1,10)) 
d2=data.frame(x=runif(10),y=runif(10),z=runif(10,100,1000)) 
ggplot()+geom_point(aes(x,y,size=z),data=d1)+ 
geom_line(aes(x,y,size=z),data=d2) 

और परिणाम इस तरह है:

enter image description here

अंक का आकार बहुत हैं छोटा तो मैं scale_size द्वारा अपना आकार बदलना चाहता हूं। हालांकि, ऐसा लगता है कि दोनों लाइनें और अंक प्रभावित हैं। तो मुझे आश्चर्य है कि अलग-अलग किंवदंती के साथ अलग-अलग लाइनों और अंक को मापने का कोई तरीका है या नहीं?

+2

केवल एक ही आकार कथा नहीं है। यदि आप अलग-अलग किंवदंतियों को रखना चाहते हैं तो आपको एक या दूसरे के लिए कुछ और उपयोग करना होगा, जैसे 'लिनटाइप' या 'रंग'। –

+3

क्या होगा यदि अंक 'आकार = z * 100' – mtoto

+0

के लिए क्या एक और आकार की किंवदंती बनाना संभव है? शायद इस सरल उदाहरण के लिए इसे 'लिनटाइप' या 'रंग' द्वारा प्रतिस्थापित किया जा सकता है, लेकिन अगर' लिनटाइप 'या' रंग' का उपयोग किया गया है या आंकड़े के लिए उपयुक्त नहीं है, तो हमें अभी भी इस समस्या को हल करने की आवश्यकता है। @MikeWise – Tiger

उत्तर

3

दो तरीकों से मैं सोच सकता हूं 1) दो किंवदंती grobs या 2) संयोजन एक और किंवदंती सौंदर्यशास्त्र हैकिंग। इन दोनों का उल्लेख उपरोक्त टिप्पणियों में @ माइक वाइस ने किया था।

दृष्टिकोण # 1: ग्रब्स का उपयोग करके एक ही साजिश में 2 अलग-अलग किंवदंतियों को जोड़ता है।

मैंने पौराणिक कथाओं को पकड़ने के लिए इस answer से कोड का उपयोग किया। बैपटिस्ट का arrangeGrob vignette एक उपयोगी संदर्भ है। printing के लिए

library(grid); library(gridExtra) 

#Function to extract legend grob 
g_legend <- function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    legend 
} 

#Create plots 
p1 <- ggplot()+ geom_point(aes(x,y,size=z),data=d1) + scale_size(name = "point") 
p2 <- ggplot()+ geom_line(aes(x,y,size=z),data=d2) + scale_size(name = "line") 
p3 <- ggplot()+ geom_line(aes(x,y,size=z),data=d2) + 
     geom_point(aes(x,y, size=z * 100),data=d1) # Combined plot 
legend1 <- g_legend(p1) 
legend2 <- g_legend(p2) 
legend.width <- sum(legend2$width) 

gplot <- grid.arrange(p3 +theme(legend.position = "none"), legend1, legend2, 
      ncol = 2, nrow = 2, 
      layout_matrix = rbind(c(1,2), 
            c(1,3)), 
      widths = unit.c(unit(1, "npc") - legend.width, legend.width)) 
grid.draw(gplot) 

नोट: arrangeGrob() बजाय grid.arrange() का उपयोग करें। मुझे (arrangeGrob) साजिश को बचाने के लिए png; grid.draw; dev.off का उपयोग करना पड़ा।

grob_legends

कार्य # 2: एक और सौंदर्य कथा हैकिंग।

MilanoR इस पर एक शानदार पोस्ट है, आकार के बजाय रंग पर ध्यान केंद्रित करना। अधिक SO उदाहरण: 1) discrete colour और 2) colour gradient

#Create discrete levels for point sizes (because points will be mapped to fill) 
d1$z.bin <- findInterval(d1$z, c(0,2,4,6,8,10), all.inside= TRUE) #Create bins 

#Scale the points to the same size as the lines (points * 100). 
#Map points to a dummy aesthetic (fill) 
#Hack the fill properties. 
ggplot()+ geom_line(aes(x,y,size=z),data=d2) + 
    geom_point(aes(x,y, size=z * 100, fill = as.character(z.bin)),data=d1) + 
    scale_size("line", range = c(1,5)) + 
    scale_fill_manual("points", values = rep(1, 10) , 
        guide = guide_legend(override.aes = 
           list(colour = "black", 
           size = sort(unique(d1$z.bin))))) 

legend_hack

+0

उत्तर संपादित न करें I जरुरत। धन्यवाद! – Tiger

+0

एक और समस्या यह है कि 'आकार' एक ही समय में लाइन और बिंदु को नियंत्रित करेगा, अगर मैं ** दृष्टिकोण # 2 ** में 'श्रेणी = सी (1,3)' सेट करता हूं, तो मैं उन्हें अलग से कैसे नियंत्रित कर सकता हूं? @oshun – Tiger

+0

आप नहीं कर सकते। यदि आप अधिक नियंत्रण चाहते हैं, तो दृष्टिकोण 1 का उपयोग करें। यदि आप दृष्टिकोण 2 का उपयोग करना चाहते हैं, तो आप दोनों बिंदुओं और रेखाओं के लिए समान पैमाने पर फंस गए हैं। ध्यान दें कि समाधान # 2 अंक (सीमा = 2 से 10) को लाइनों (रेंज 140-905) के रूप में एक ही पैमाने पर बदलता है 100 से गुणा करके। अपने आकार को एक दूसरे के सापेक्ष बदलने के लिए, आप इस स्केलिंग कारक को बदलते हैं।अंक * 50 (लाइनों के सापेक्ष छोटे बिंदु) या अंक * 200 (बड़े अंक) का प्रयास करें। अपनी स्केल रेंज को 'सी (1,3) 'तक कम करने, परिवर्तित आकार को 1-3 से सीमित करता है जो प्रतिकूल प्रतीत होता है। संभावित आकारों की सीमा क्यों नहीं बढ़ाएं? – oshun

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