2013-11-21 7 views
14

में मैं एक ggplot जहां मैं दोनों को भरने और अल्फा के लिए मानचित्रण कारकों हूँ मिल गया है, इस तरह:पंक्तियों और स्तंभों लेबल के साथ एक आयताकार कथा बनाओ,, ग्रिड

set.seed(47) 
the_data <- data.frame(value = rpois(6, lambda=20), 
         cat1 = rep(c("A", "B"), each = 3), 
         cat2 = rep(c("X", "Y", "Z"), 2)) 

ggplot(the_data, aes(y = value, x = cat2, alpha = cat1, fill = cat2)) + 
    geom_bar(stat = "identity", position = "dodge") + 
    scale_alpha_discrete(range = c(0.5, 1)) + 
    theme_bw() 

enter image description here

जिन लोगों को मैं इसका उत्पादन कर रहा हूं उन्हें अल्फा के लिए किंवदंती नहीं मिलती है। मुझे लगता है कि एक अच्छा विकल्प कुछ इस तरह (जो मैं आधार ग्राफिक्स में एक साथ काट दिया) होगा:

enter image description here

मैं जानता हूँ कि मुझे लगता है कि उच्च स्तरीय ggplot आदेशों के साथ की तरह एक किंवदंती उत्पन्न नहीं कर सकते, लेकिन मैं यह कर सकते हैं इसे grid में करें और इसे मेरे साजिश के शीर्ष पर रखें?

+2

तेज समाधान सिर्फ दो उपयोग करने के लिए हो सकता है ** ग्रिड** साजिश और इसकी किंवदंती के लिए अलग-अलग क्षेत्रों को आवंटित करने के लिए व्यूपोर्ट्स, फिर ऊपरी व्यूपोर्ट में अपने हाथ से बने किंवदंती को रखने के लिए ** ग्रिडबेस ** पैकेज का उपयोग करें। ('विग्नेट (" ग्रिडबेस ") 'एक परिचय देता है, या अतिरिक्त उदाहरणों के लिए SO पर यहां [आर] ग्रिडबेस' की खोज करता है।) –

+0

@ जोशो'ब्रायन को 'ग्रिडबेस' के बारे में पता नहीं था, सूचक के लिए धन्यवाद! – Gregor

+0

हाँ, यह कभी-कभी बहुत आसान में आता है। [यहां] (http://stackoverflow.com/questions/11489447/combining-two-plots-in-r/11496362#11496362) और [यहां] (http://stackoverflow.com/questions/9985013/how-do -याउ-ड्रा-ए-लाइन-ए-ए-मल्टी-फिगर-एनवायरन-इन-आर/9985 9 36 # 9985 9 36) कुछ ऐसे स्थान हैं जहां मैंने इसे अन्यथा मुश्किल प्रभावों को पूरा करने के लिए उपयोग किया है। –

उत्तर

14

यहां एक संभावित प्रारंभिक बिंदु है। मैं दो अलग-अलग भूखंडों का निर्माण करता हूं जिनमें उपयुक्त किंवदंतियों - एक 'उज्ज्वल' और 'पीला' है। साजिश वस्तुओं से किंवदंतियों को निकालें। फिर gridviewport एस, प्लॉट के लिए एक, और प्रत्येक किंवदंती के लिए एक टुकड़े को एक साथ रखने के लिए उपयोग करें।

library(grid) 
library(gtable) 

# create plot with legend with alpha = 1 
g1 <- ggplot(the_data, aes(y = value, x = cat2, alpha = cat1, fill = cat2)) + 
    geom_bar(stat = "identity", position = "dodge") + 
    scale_alpha_discrete(range = c(0.5, 1)) + 
    theme_bw() + 
    guides(fill = guide_legend(title = "A", 
          title.hjust = 0.4), 
     alpha = FALSE) + 
    theme_bw() + 
    theme(legend.text = element_blank()) 

g1 

# grab legend 
legend_g1 <- gtable_filter(ggplot_gtable(ggplot_build(g1)), "guide-box") 


# create plot with 'pale' legend 
g2 <- ggplot(the_data, aes(y = value, x = cat2, alpha = cat1, fill = cat2)) + 
    geom_bar(stat = "identity", position = "dodge") + 
    scale_alpha_discrete(range = c(0.5, 1)) + 
    guides(fill = guide_legend(override.aes = list(alpha = 0.5), 
          title = "B", 
          title.hjust = 0.3), 
     alpha = FALSE) + 
    theme_bw() 
g2 

# grab legend 
legend_g2 <- gtable_filter(ggplot_gtable(ggplot_build(g2)), "guide-box") 



# arrange plot and legends 

# legends to the right 

# define plotting regions (viewports) 
vp_plot <- viewport(x = 0.4, y = 0.5, 
        width = 0.8, height = 1) 

vp_legend_g1 <- viewport(x = 0.85, y = 0.5, 
          width = 0.4, height = 0.4) 

vp_legend_g2 <- viewport(x = 0.90, y = 0.5, 
          width = 0.4, height = 0.4) 


# clear current device 
grid.newpage() 

# add objects to the viewports 
# plot without legend 
print(g1 + theme(legend.position = "none"), vp = vp_plot) 
upViewport(0) 

pushViewport(vp_legend_g1) 
grid.draw(legend_g1) 
upViewport(0) 

pushViewport(vp_legend_g2) 
grid.draw(legend_g2) 

enter image description here

# legends on top 
vp_plot <- viewport(x = 0.5, y = 0.4, 
        width = 1, height = 0.85) 

vp_legend_g1 <- viewport(x = 0.5, y = 0.9, 
         width = 0.4, height = 0.4) 

vp_legend_g2 <- viewport(x = 0.55, y = 0.9, 
         width = 0.4, height = 0.4) 

grid.newpage() 

print(g1 + theme(legend.position = "none"), vp = vp_plot) 
upViewport(0) 

pushViewport(vp_legend_g1) 
grid.draw(legend_g1) 
upViewport(0) 

pushViewport(vp_legend_g2) 
grid.draw(legend_g2) 

enter image description here

+1

ठीक है कि मुझे निश्चित रूप से आपको वोट देने की ज़रूरत है, लेकिन जोश की रणनीति अब और भी उचित लगती है। –

+0

यह सुंदर है! धन्यवाद, हेनरिक। – Gregor

4

@Henrik

यह थोड़ा आसान हो सकता है,

g1 <- ggplotGrob(p1) 
g2 <- ggplotGrob(p2) 

leg1 <- gtable_filter(g1, "guide-box") 
leg2 <- gtable_filter(g2, "guide-box") 
leg <- gtable:::cbind_gtable(leg1[["grobs"]][[1]], leg2[["grobs"]][[1]], "first") 

g1$grobs[g1$layout$name == "guide-box"][[1]] <- leg 
g1$widths[max(subset(g1$layout, name == "guide-box")[["r"]])] <- list(leg1$width + leg2$width) 

grid.newpage() 
grid.draw(g1) 
संबंधित मुद्दे