2017-02-24 12 views
5

में एक से अधिक 'scale_fill_` का उपयोग करके मैं ggplot2 में एकाधिक परतों को प्रदर्शित करने का प्रयास कर रहा हूं, लेकिन मैं प्रत्येक परत के लिए अलग-अलग scale_fill_ रंग योजनाओं का उपयोग करना चाहता हूं। मुझे ऐसा नहीं लगता है, क्योंकि scale_fill_gradientn जैसे कुछ को कॉल करने से दो बार पहले कॉल को ओवरराइट किया जाता है।`ggplot2`

library(ggplot2) 
library(reshape2) 
library(RColorBrewer) 
set.seed(123) 

मैं पहली बार साजिश करेंगे एक tile ग्रिड (ध्यान दें मैं scale_fill_gradientn साथ रंग सेट कर रहा हूं):

foo <- matrix(data = rnorm(100), ncol = 10) 
foo <- melt(foo) 

plot <- ggplot() + 
    geom_tile(data = foo, 
      mapping = aes(x = Var1, y = Var2, fill = value)) + 
    scale_fill_gradientn(
    colours = rev(brewer.pal(7, "BrBG")) 
) 
plot 

enter image description here

अब मैं शीर्ष पर एक और साजिश में शामिल करना चाहते उसमें से, लेकिन एक अद्वितीय रंग योजना के साथ। मैं बस ठीक एक अलग साजिश बना सकते हैं:

bar <- data.frame(x = rnorm(100, 4, 1), 
        y = rnorm(100, 6, 1.5)) 

ggplot() + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, fill = ..level..), 
        geom = "polygon") + 
    scale_fill_gradientn(
    colours = rev(brewer.pal(7, "Spectral")) 
) + xlim(0, 10) + ylim(0, 10) 

enter image description here

मुझे क्या करना चाहते हैं भूखंड पहले की चोटी पर दूसरी साजिश है, लेकिन रंग योजनाओं ऊपर दिखने बनाए रखें। यदि मैं पहली बार दूसरी परत को जोड़ने की कोशिश करता हूं, तो मैं मूल scale_fill_gradientn को ओवरराइट करता हूं, और दो परतों को एक रंग योजना साझा करने के लिए मजबूर करता हूं (जो इस मामले में दूसरी परत को पूरी तरह से एक रंग में गिरने के लिए "संपीड़ित" करता है:

plot <- plot + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, fill = ..level..), 
        geom = "polygon") + 
    scale_fill_gradientn(
    colours = rev(brewer.pal(7, "Spectral")) 
) + xlim(0, 10) + ylim(0, 10) 
plot 

enter image description here

वहाँ प्रत्येक परत के लिए अलग रंग योजनाओं निर्दिष्ट करने के लिए कोई तरीका है? मुझे लगता है कि, उदाहरण के लिए, stat_density_2d समझता है एक colour सौंदर्य नोटिस, लेकिन मैं कोई लाभ नहीं हुआ एक निर्दिष्ट करने की कोशिश की है (यह केवल पौराणिक कथाओं में एक लेबल के रूप में रंग जोड़ता है, और रंग योजना को डिफ़ॉल्ट में बदल देता है):

ggplot() + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, fill = ..level.., colour = "red"), 
        geom = "polygon") + 
    xlim(0, 10) + ylim(0, 10) 

enter image description here

मुझे लगता है कि वहाँ एक "प्रति परत" के आधार पर रंग योजना स्थापित करने के लिए एक अलग तरह से होना चाहिए, लेकिन मैं स्पष्ट रूप से गलत स्थानों में देख रहा हूँ।

+2

आप प्रति प्लॉट केवल एक भरने का स्तर प्राप्त कर सकते हैं। – Roland

+0

धन्यवाद रोलैंड, मैं समझता हूं, और वह बाधा है जिसके खिलाफ मैं उछाल रहा हूं।मुझे लगता है कि मैं रंग योजना स्थापित करने के लिए एक वैकल्पिक विधि की तलाश में हूं, जैसे कि मैं उस सीमा के आसपास हो सकता हूं? – rosscova

+1

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

उत्तर

5

सीमा के चारों ओर जाने का एक तरीका है इसके बजाय रंग को मैप करना है (जैसा कि आप पहले ही संकेत देते हैं)।

हम अंतर्निहित रेखापुंज साजिश रखने के लिए, और उसके बाद जोड़ें::

plot + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, col = ..level..), 
        geom = "path", size = 2) + 
    scale_color_gradientn(
    colours = rev(brewer.pal(7, "Spectral")) 
) + xlim(0, 10) + ylim(0, 10) 

यह हमें देता है:

enter image description here

यह पूरी तरह से संतोषजनक नहीं है, ज्यादातर क्योंकि तराजू है यह कैसे है काफी समझदार ओवरलैप (मुझे लगता है)। फिर भी नहीं मेरी राय में महान

plot <- ggplot() + 
    geom_tile(data = foo, 
      mapping = aes(x = Var1, y = Var2, fill = value)) + 
    viridis::scale_fill_viridis(option = 'A', end = 0.9) 

plot + 
    stat_density_2d(data = bar, 
        mapping = aes(x = x, y = y, col = ..level..), 
        geom = "path", size = 2) + 
    viridis::scale_color_viridis(option = 'D', begin = 0.3) + 
    xlim(0, 10) + ylim(0, 10) 

enter image description here

(कई रंग पैमाने का उपयोग मेरे लिए भ्रामक है), लेकिन एक बहुत अधिक संतोषजनक: अलग तराजू के साथ चारों ओर खेलने के कर सकते हैं निश्चित रूप से हमें एक बेहतर परिणाम देता है।

+0

धन्यवाद @ एक्समन, यह निश्चित रूप से एक कामकाज देता है, जो शानदार है। ऐसा लगता है कि 'घनत्व' साजिश को भरने के बजाय लाइनों तक सीमित करना प्रतीत होता है, क्या यह सही है? – rosscova

+1

सही। आपके पास 'fill' के लिए दो स्केल नहीं हो सकते हैं। – Axeman