यहां एक संभावित प्रारंभिक बिंदु है। मैं दो अलग-अलग भूखंडों का निर्माण करता हूं जिनमें उपयुक्त किंवदंतियों - एक 'उज्ज्वल' और 'पीला' है। साजिश वस्तुओं से किंवदंतियों को निकालें। फिर grid
viewport
एस, प्लॉट के लिए एक, और प्रत्येक किंवदंती के लिए एक टुकड़े को एक साथ रखने के लिए उपयोग करें।
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)
# 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)
तेज समाधान सिर्फ दो उपयोग करने के लिए हो सकता है ** ग्रिड** साजिश और इसकी किंवदंती के लिए अलग-अलग क्षेत्रों को आवंटित करने के लिए व्यूपोर्ट्स, फिर ऊपरी व्यूपोर्ट में अपने हाथ से बने किंवदंती को रखने के लिए ** ग्रिडबेस ** पैकेज का उपयोग करें। ('विग्नेट (" ग्रिडबेस ") 'एक परिचय देता है, या अतिरिक्त उदाहरणों के लिए SO पर यहां [आर] ग्रिडबेस' की खोज करता है।) –
@ जोशो'ब्रायन को 'ग्रिडबेस' के बारे में पता नहीं था, सूचक के लिए धन्यवाद! – Gregor
हाँ, यह कभी-कभी बहुत आसान में आता है। [यहां] (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) कुछ ऐसे स्थान हैं जहां मैंने इसे अन्यथा मुश्किल प्रभावों को पूरा करने के लिए उपयोग किया है। –