2013-12-09 12 views
6
cnt = 100 
df <- data.frame(x = c(rnorm(cnt, mean=3), rnorm(cnt, mean=0)), y=rnorm(2 * cnt), g=rep(0:1, each=cnt)) 

ggplot(df, aes(x, y, color=as.factor(g))) + stat_density2d(aes(fill=..level..), alpha=.3, geom="polygon") 

पर आधारित भरने के रूप में विभिन्न तराजू का उपयोग करना इस तरह कारक के आधार पर एक भरे समोच्च साजिश बनाता है। plotकारक

मैं प्रत्येक समोच्च के लिए एक अलग भरने के पैमाने का उपयोग करना चाहता हूं, जैसे जी = 0 में लाल भरना है जबकि जी = 1 में नीली भर है। क्या यह संभव है और यदि ऐसा हो तो कैसे?

+3

सामान्य में, नहीं, ggplot केवल आप एक बार प्रत्येक सौंदर्य मैप करने के लिए अनुमति देता है। कभी-कभी आप कुछ प्रयासों के साथ उस पर काम कर सकते हैं, लेकिन आमतौर पर आप नहीं कर सकते हैं। उदाहरण के लिए, [यहां] देखें (https://groups.google.com/forum/#!topic/ggplot2/lDvsd4yJ0AE)। – joran

+0

धन्यवाद। मुझे डर था कि यह मामला था। मुझे एक और रास्ता मिल जाएगा। – robbie

+0

एक संभावित समाधान यहां पाया जा सकता है: http://stackoverflow.com/questions/19791181/density-shadow-around-the-data-with-ggplot2-r/ – bdemarest

उत्तर

6

जैसा कि पहले से ही @joran द्वारा टिप्पणी की गई है, ggplot में मूल डिज़ाइन एक स्केल प्रति aes थीटिक है। इसलिए कुरूपता की विभिन्न डिग्री के कार्य-आसपास की आवश्यकता होती है। अक्सर वे एक या अधिक साजिश वस्तु का निर्माण, वस्तु के विभिन्न घटकों में हेरफेर, और उसके बाद छेड़छाड़ की वस्तु से एक नई साजिश का उत्पादन शामिल करते हैं।

विभिन्न fill रंग पैलेट के साथ दो प्लॉट ऑब्जेक्ट्स - एक लाल और एक नीला - scale_fill_continuous में रंग सेट करके बनाए जाते हैं। 'लाल' साजिश वस्तु में, समूहों में से किसी एक पंक्ति से लाल रंग भरने वाले रंगों को 'नीली' साजिश वस्तु में संबंधित पंक्तियों से नीले रंग के रंगों से बदल दिया जाता है।

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

# plot with red fill 
p1 <- ggplot(data = df, aes(x, y, color = as.factor(g))) + 
    stat_density2d(aes(fill = ..level..), alpha = 0.3, geom = "polygon") + 
    scale_fill_continuous(low = "grey", high = "red", space = "Lab", name = "g = 0") + 
    scale_colour_discrete(guide = FALSE) + 
    theme_classic() 

# plot with blue fill 
p2 <- ggplot(data = df, aes(x, y, color = as.factor(g))) + 
    stat_density2d(aes(fill = ..level..), alpha = 0.3, geom = "polygon") + 
    scale_fill_continuous(low = "grey", high = "blue", space = "Lab", name = "g = 1") + 
    scale_colour_discrete(guide = FALSE) + 
    theme_classic() 


# grab plot data 
pp1 <- ggplot_build(p1) 
pp2 <- ggplot_build(p2)$data[[1]] 


# replace red fill colours in pp1 with blue colours from pp2 when group is 2 
pp1$data[[1]]$fill[grep(pattern = "^2", pp2$group)] <- pp2$fill[grep(pattern = "^2", pp2$group)] 


# build plot grobs 
grob1 <- ggplot_gtable(pp1) 
grob2 <- ggplotGrob(p2) 

# build legend grobs 
leg1 <- gtable_filter(grob1, "guide-box") 
leg2 <- gtable_filter(grob2, "guide-box") 
leg <- gtable:::rbind_gtable(leg1[["grobs"]][[1]], leg2[["grobs"]][[1]], "first") 


# replace legend in 'red' plot 
grob1$grobs[grob1$layout$name == "guide-box"][[1]] <- leg 


# plot 
grid.newpage() 
grid.draw(grob1) 

enter image description here

+0

बहुत अच्छा! आप इसे पीडीएफ के रूप में सहेजने के लिए ggsave का उपयोग कैसे करते हैं? – PatrickT

+0

"grid.draw ggsave" पर पहले कुछ Google हिट आपकी मदद कर सकते हैं। सौभाग्य! – Henrik

+0

उन्होंने यही नहीं पूछा, क्या आपके पास एक सटीक लिंक है? मैंने स्टैक ओवरफ्लो पर कुछ उत्तरों से संकेतों का उपयोग करने की कोशिश की लेकिन यह काम नहीं किया। मुझे नहीं लगता था कि यह एक बड़ा सौदा होगा अन्यथा मैंने एक उचित सवाल पूछा होगा। धन्यवाद। – PatrickT

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