2012-10-30 18 views
15

शीर्षक में स्वतंत्र रूप से दो किंवदंतियों को कैसे स्थापित करूं, शीर्षक बहुत अच्छी तरह से कवर करता है।मैं ggplot

मेरे पास आकार और रंग से संबंधित दो किंवदंतियों हैं, और शीर्ष पर और ग्राफ के भीतर एक को कहना है। यदि ऐसा है तो

यह संभव है और,, कैसे

TIA

+0

मुझे नहीं लगता कि यह संभव है (जहां किंवदंतियों को रखा जाता है थीम द्वारा नियंत्रित किया जाता है, और वे भाग जो किंवदंती स्थान को परिभाषित करते हैं केवल एक ही मान लेते हैं)। हालांकि, मुझे इतना यकीन नहीं है कि यह एक उत्तर बनाना संभव नहीं है। –

+0

मान लीजिए कि यह था, विशेषज्ञों में से एक अब – pssguy

+0

@pssguy पर चल रहा होगा, यह कुछ झुकाव के साथ किया जा सकता है। किंवदंतियों पर नियंत्रण रखने के लिए, आपको अलग-अलग किंवदंतियों को निकालने की आवश्यकता है, फिर उन्हें एक साजिश में व्यवस्थित किया जा सकता है जिसमें प्रारंभ में कोई किंवदंती नहीं है। निकालने के लिए –

उत्तर

3

मेरी समझ से, मूल रूप से वहाँ ggplot2 में किंवदंतियों पर बहुत सीमित नियंत्रण है। यहाँ हैडली की पुस्तक से एक पैरा (पेज 111) है:

ggplot2 को सटीक ढंग से साजिश में इस्तेमाल सौंदर्यशास्त्र बता देते हैं किंवदंतियों के छोटी संभव संख्या का उपयोग करने की कोशिश करता है। यह एक किंवदंतियों को जोड़कर करता है यदि एक चर का उपयोग एक से अधिक सौंदर्यशास्त्र के साथ किया जाता है। चित्रा 6.14 अंक geom के लिए इसका एक उदाहरण दिखाता है: यदि दोनों रंग और आकार एक ही चर के लिए मैप किए जाते हैं, तो केवल एक ही किंवदंती आवश्यक है। किंवदंतियों को विलय करने के क्रम में, उनके पास एक ही नाम होना चाहिए (वही किंवदंती शीर्षक)। इस कारण से, यदि आप मर्ज किए गए किंवदंतियों में से किसी एक का नाम बदलते हैं, तो आपको इसे सभी के लिए बदलना होगा।

+0

धन्यवाद। सभी उदाहरण एक ही स्थिति में किंवदंतियों को दिखाते हैं – pssguy

28

यह भूखंडों से अलग किंवदंतियों को निकालने, फिर प्रासंगिक साजिश में किंवदंतियों की व्यवस्था करके किया जा सकता है। कोड यहां निष्कर्षण करने के लिए gtable पैकेज से फ़ंक्शंस का उपयोग करता है, फिर व्यवस्था करने के लिए gridExtra पैकेज से कार्य करता है। इसका उद्देश्य एक साजिश है जिसमें रंगीन किंवदंती और आकार की किंवदंती शामिल है। सबसे पहले, रंगीन किंवदंती को उस साजिश से निकालें जिसमें रंगीन किंवदंती शामिल है। दूसरा, आकार की किंवदंती को उस साजिश से निकालें जिसमें केवल आकार की किंवदंती शामिल है। तीसरा, एक साजिश तैयार करें जिसमें कोई किंवदंती नहीं है। चौथा, साजिश और दो किंवदंतियों को एक नई साजिश में व्यवस्थित करें।

# Some data 
df <- data.frame(
    x = 1:10, 
    y = 1:10, 
    colour = factor(sample(1:3, 10, replace = TRUE)), 
    size = factor(sample(1:3, 10, replace = TRUE))) 

library(ggplot2) 
library(gridExtra) 
library(gtable) 
library(grid) 

    ### Step 1 
# Draw a plot with the colour legend 
(p1 <- ggplot(data = df, aes(x=x, y=y)) + 
    geom_point(aes(colour = colour)) + 
    theme_bw() + 
    theme(legend.position = "top")) 

# Extract the colour legend - leg1 
leg1 <- gtable_filter(ggplot_gtable(ggplot_build(p1)), "guide-box") 

    ### Step 2 
# Draw a plot with the size legend 
(p2 <- ggplot(data = df, aes(x=x, y=y)) + 
    geom_point(aes(size = size)) + 
    theme_bw()) 

# Extract the size legend - leg2 
leg2 <- gtable_filter(ggplot_gtable(ggplot_build(p2)), "guide-box") 

    # Step 3 
# Draw a plot with no legends - plot 
(plot <- ggplot(data = df, aes(x=x, y=y)) + 
    geom_point(aes(size = size, colour = colour)) + 
    theme_bw() + 
    theme(legend.position = "none")) 

    ### Step 4 
# Arrange the three components (plot, leg1, leg2) 
# The two legends are positioned outside the plot: 
# one at the top and the other to the side. 
plotNew <- arrangeGrob(leg1, plot, 
     heights = unit.c(leg1$height, unit(1, "npc") - leg1$height), ncol = 1) 

plotNew <- arrangeGrob(plotNew, leg2, 
      widths = unit.c(unit(1, "npc") - leg2$width, leg2$width), nrow = 1) 

grid.newpage() 
grid.draw(plotNew) 

# OR, arrange one legend at the top and the other inside the plot. 
plotNew <- plot + 
     annotation_custom(grob = leg2, xmin = 7, xmax = 10, ymin = 0, ymax = 4) 

plotNew <- arrangeGrob(leg1, plotNew, 
    heights = unit.c(leg1$height, unit(1, "npc") - leg1$height), ncol = 1) 

grid.newpage() 
grid.draw(plotNew) 

enter image description here

enter image description here

+0

हाय सैंडी। यह एक प्रभावशाली उदाहरण है। क्या आप 'हाइट्स' तर्क के उपयोग पर 'gangeGrob'' के उपयोग पर तर्क को तोड़ सकते हैं, उदाहरण के लिए 'plotNew <- arrangeGrob (leg1, plot, heights = unit.c (leg1 $ height, unit (1, "npc") - पैर 1 $ ऊंचाई), एनकॉल = 1) '? मुझे लगता है कि 'ऊंचाई' को 'grid.layout' के लिए एक तर्क के रूप में पारित किया गया है, लेकिन मुझे यह देखने में परेशानी हो रही है कि इसका उपयोग कैसे किया जाता है। धन्यवाद। –

+0

हाय @ फेहेम, दो प्लॉट लंबवत व्यवस्थित किए जाने हैं: 'leg1' और' plot'; और इसलिए 'unit.c() 'फ़ंक्शन में दो ऊंचाइयों। 'leg1' की पूर्ण ऊंचाई है और' leg1 $ height' द्वारा दी गई है। दूसरी ऊंचाई, 'इकाई (1, "एनपीसी") - पैर 1 $ ऊंचाई', 'प्लॉट' के लिए उपलब्ध ऊंचाई देने के लिए डिवाइस की ऊंचाई से पौराणिक ऊंचाई को घटा देती है। पहले उदाहरण में, समान तर्क चौड़ाई पर लागू होता है। प्लॉट करने के लिए दो ग्रब्स हैं: साजिश और किंवदंती। इसलिए 'unit.c()' फ़ंक्शन में दो चौड़ाई; 'प्लॉटन्यू 'के लिए एक और दूसरा' leg2' के लिए। –

+0

धन्यवाद, सैंडी। एक और सवाल - आप कैसे जानते हैं कि डिवाइस की ऊंचाई 'इकाई (1," एनपीसी ") है? यह उपयोगी होगा अगर आपने इस जानकारी में से कुछ को अपने प्रश्न में जोड़ा। आप उल्लेख कर सकते हैं (ए) 'हाइट्स' तर्क और 'चौड़ाई' तर्क 'grid.layout' पर पास किए जाते हैं, (बी) कि' इकाई (1, "एनपीसी") 'डिवाइस की ऊंचाई है, और इसलिए (सी) उदाहरण के लिए 'leg1 $ height' और' इकाई (1, "एनपीसी") - leg1 $ height' क्रमशः किंवदंती और मुख्य साजिश की ऊंचाई है। यदि आप चाहें तो मैं इसे जोड़ सकता हूं। –

6

यहाँ ggplot2 और cowplot (= ggplot2 विस्तार) पैकेज का इस्तेमाल एक और उपाय है।

दृष्टिकोण सैंडिस के समान है क्योंकि यह किंवदंती अलग वस्तुओं के रूप में लेता है और आपको स्वतंत्र रूप से प्लेसमेंट करने देता है। यह प्राथमिक रूप से कई किंवदंतियों के लिए डिज़ाइन किया गया था जो भूखंडों के ग्रिड में दो या दो से अधिक भूखंडों से संबंधित हैं।

फ़ंक्शन g_legend, जिसे हर्बी का उपयोग किया जाता है, को answer से लिया गया था।

विचार इस प्रकार है:

  1. Plot1, Plot2, बनाएं ..., PlotX बिना किंवदंतियों
  2. Plot1, Plot2 बनाएँ, ..., PlotX साथ किंवदंतियों अलग वस्तुओं में चरण 2 से
  3. निकालें किंवदंतियों
  4. कथा ग्रिड को सेट करें और
  5. को किंवदंतियों वे को अपने अनुसार प्रबंधित ग्रिड बनाएं भूखंडों और किंवदंतियों

संयोजन यह थोड़े लगता है जटिल और समय/कोड comsuming लेकिन एक बार स्थापित, आप अनुकूलित और हर तरह की साजिश/किंवदंती अनुकूलन के लिए इसका उपयोग कर सकते हैं।

library(ggplot2) 
library(cowplot) 

# set up function 
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]] 
    return(legend) } 

# Some data 
df <- data.frame(
    Name = factor(rep(c("A", "B", "C"), 12)), 
    Month = factor(rep(1:12, each=3)), 
    Temp = sample(0:40, 12), 
    Precip = sample(50:400, 12)) 

# create plot1 
plot1 <- ggplot(df, aes(Month, Temp, fill = Name)) + 
    geom_point(show.legend = F, aes(group = Name, colour = Name), 
     size = 3, shape = 17) + 
    geom_smooth(method = "loess", se = F, 
     aes(group = Name, colour = Name), 
     show.legend = F, size = 0.5, linetype = "dashed") 

# create plot2 
plot2 <- ggplot(df, aes(Month, Precip, fill = Name)) + 
    geom_bar(stat = "identity", position = "dodge", show.legend = F) + 
    geom_smooth(method = "loess", se = F, 
     aes(group = Name, colour = Name), 
     show.legend = F, size = 1, linetype = "dashed") + 
    scale_fill_grey() 

# create legend1 
legend1 <- ggplot(df, aes(Month, Temp)) + 
    geom_point(show.legend = T, aes(group = Name, colour = Name), 
     size = 3, shape = 17) + 
    geom_smooth(method = "loess", se = F,aes(group = Name, colour = Name), 
     show.legend = T, size = 0.5, linetype = "dashed") + 
    labs(colour = "Station") + 
    theme(legend.text=element_text(size=8), 
      legend.title = element_text(face = "italic", 
       angle = -0, size = 10)) 

# create legend2 
legend2 <- ggplot(df, aes(Month, Precip, fill = Name)) + 
    geom_bar(stat = "identity", position = "dodge", show.legend = T) + 
    scale_fill_grey() + 
    guides(fill = 
     guide_legend(title = "", 
       title.theme = element_text(face = "italic", 
        angle = -0, size = 10))) + 
    theme(legend.text=element_text(size=8)) 


# extract "legends only" from ggplot object 
legend1 <- g_legend(legend1) 
legend2 <- g_legend(legend2) 

# setup legends grid 
legend1_grid <- cowplot::plot_grid(legend1, align = "v", nrow = 2) 

# add second legend to grid, specifying its location 
legends <- legend1_grid + 
    ggplot2::annotation_custom(grob = legend2, 
      xmin = 0.5, xmax = 0.5, ymin = 0.55, ymax = 0.55) 

# plot "plots" + "legends" (with legends in between plots) 
cowplot::plot_grid(plot1, legends, plot2, ncol = 3, 
    rel_widths = c(0.45, 0.1, 0.45)) 

उदाहरण:

Example http://i65.tinypic.com/jl1lef.png

अंतिम plot_grid() कॉल के आदेश को बदलने से सही करने के लिए ले जाता है किंवदंतियों:

cowplot::plot_grid(plot1, plot2, legends, ncol = 3, 
        rel_widths = c(0.45, 0.45, 0.1)) 

Example2 http://i68.tinypic.com/314yn9i.png