2012-07-16 12 views
10

में अलग-अलग और निरंतर स्केल प्लॉटिंग मैं दो अलग-अलग रंग स्केल (एक निरंतर और दो अलग-अलग डीएफ से अलग) का उपयोग करके ggplot2 का उपयोग करके कुछ अलग डेटा आइटम प्लॉट करना चाहता हूं। मैं या तो प्लॉट कर सकता हूं कि मैं व्यक्तिगत रूप से कैसे पसंद करूंगा, लेकिन मैं उन्हें एक साथ काम नहीं कर सकता। ऐसा लगता है कि आपके पास एक ही साजिश में दो अलग-अलग रंग स्केल नहीं हो सकते हैं? मैंने इसी तरह के प्रश्न here और here देखे हैं, और इससे मुझे विश्वास था कि मैं जो हासिल करना चाहता हूं वह ggplot2 में संभव नहीं है, लेकिन अगर मैं गलत हूं तो मैं यह देखने के लिए अपनी समस्या का वर्णन करना चाहता हूं कि क्या कोई है या नहीं काम के आसपास। enter image description hereएक ही ggplot

मैं भी जो एक सतत प्रतिक्रिया स्थानों में से एक सेट है:

मैं पाने के लिए कुछ जीआईएस धारा डेटा जो कुछ स्पष्ट इसे से जुड़े गुण है, जो मैं प्लॉट कर सकते हैं (नीचे दिए गए कोड में p1) है है , जो मैं नीचे दिए गए कोड में p2 भी प्लॉट कर सकता हूं): enter image description here हालांकि मैं दो (p3 नीचे कोड में) को जोड़ नहीं सकता हूं। मैं यह त्रुटि

Error in scales[[prev_aes]] : attempt to select less than one element

लाइन scale_colour_hue("Strahler order") + बाहर टिप्पणी करते

Error: Discrete value supplied to continuous scale

मूल रूप से करने के लिए त्रुटि में परिवर्तन यह है कि ggplot2 geom_path कॉल के लिए एक ही पैमाने प्रकार (निरंतर या असतत) और geom_point कॉल का उपयोग करता है लगता है मिल । इसलिए जब मैं अलग चर, factor(Strahler) पास करता हूं, scale_colour_gradientn पैमाने पर, साजिश विफल हो जाती है।

क्या इसके आसपास कोई रास्ता है? यह आश्चर्यजनक होगा कि data एक स्केल फ़ंक्शन के लिए तर्क था कि यह कहने के लिए कि यह कहां मैपिंग या सेटिंग सेट करना चाहिए। क्या यह भी संभव है?

बहुत धन्यवाद और नीचे प्रतिलिपि प्रस्तुत करने योग्य कोड:

library(ggplot2) 

### Download df's ### 
oldwd <- getwd(); tmp <- tempdir(); setwd(tmp) 
url <- "http://dl.dropbox.com/u/44829974/Data.zip" 
f <- paste(tmp,"\\tmp.zip",sep="") 
download.file(url,f) 
unzip(f) 


### Read in data ### 
riv_df <- read.table("riv_df.csv", sep=",",h=T) 
afr_df <- read.table("afr_df.csv", sep=",",h=T) 
vil_df <- read.table("vil_df.csv", sep=",",h=T) 


### Min and max for plot area ### 
xmin <- -18; xmax <- 3; ymin <- 4; ymax <- 15 


### Plot river data ### 
p1 <- ggplot(riv_df, aes(long, lat)) + 
    geom_map(mapping = aes(long , lat , map_id = id) , fill = "white" , data = afr_df , map = afr_df) + 
    geom_path(colour = "grey95" , mapping = aes(long , lat , group = group , size = 1) , data = afr_df) + 
    geom_path(aes(group = id , alpha = I(Strahler/6) , colour = factor(Strahler) , size = Strahler/6)) + 
    scale_alpha(guide = "none") + 
    scale_colour_hue("Strahler order") + 
    scale_x_continuous(limits = c(xmin , xmax) , expand = c(0 , 0)) + 
    scale_y_continuous(limits = c(ymin , ymax) , expand = c(0 , 0)) + 
    coord_map() 
print(p1) # This may take a little while depending on computer speed... 



### Plot response data ### 
p2 <- ggplot(NULL) + 
    geom_point(aes(X , Y , colour = Z) , size = 2 , shape = 19 , data = vil_df) + 
    scale_colour_gradientn(colours = rev(heat.colors(25)) , guide="colourbar") + 
    coord_equal() 
print(p2) 



### Plot both together ### 
p3 <- ggplot(riv_df, aes(long, lat)) + 
    geom_map(mapping = aes(long , lat , map_id = id) , fill = "white" , data = afr_df , map = afr_df) + 
    geom_path(colour = "grey95" , mapping = aes(long , lat , group = group , size = 1) , data = afr_df) + 
    geom_path(aes(group = id , alpha = I(Strahler/6) , colour = factor(Strahler) , size = Strahler/6)) + 
    scale_colour_hue("Strahler order") + 
    scale_alpha(guide = "none") + 
    scale_x_continuous(limits = c(xmin , xmax) , expand = c(0 , 0)) + 
    scale_y_continuous(limits = c(ymin , ymax) , expand = c(0 , 0)) + 
    geom_point(aes(X , Y , colour = Z) , size = 2 , shape = 19 , data = vil_df) + 
    scale_colour_gradientn(colours = rev(heat.colors(25)) , guide="colourbar") + 
    coord_map() 
print(p3) 
#Error in scales[[prev_aes]] : attempt to select less than one element 

### Clear-up downloaded files ### 
unlink(tmp,recursive=T) 
setwd(oldwd) 

चीयर्स,

साइमन

+1

समस्या इतनी जटिल नहीं है का आह्वान जैसा कि आप सोच सकते हैं। आम तौर पर, आप केवल एक सौंदर्य को मानचित्र बना सकते हैं। इसलिए 'scale_colour_ * 'को दो बार कॉल करना ** ggplot2 ** को कोई समझ नहीं आता है। यह एक दूसरे को मजबूर करने की कोशिश करेगा। – joran

+0

@joran तो वर्तमान में डेटा फ्रेम से एक निरंतर पैमाने पर एक रंग सौंदर्य को मैप करने का कोई तरीका नहीं है और एक अलग डेटाफ्रेम से एक अलग रंग सौंदर्य को एक अलग पैमाने पर? यह आसान होगा, अगर नहीं, तो स्केल के लिए डेटा निर्दिष्ट करना संभव था? –

+1

आपके पास एक ही ग्राफ में एकाधिक रंग स्केल नहीं हो सकते हैं, भले ही कोई भी निरंतर या अलग हो। पैकेज लेखक ने कहा है कि उनके पास इसे जोड़ने का कोई इरादा नहीं है। यह कार्यान्वित करने के लिए जटिल है और अविश्वसनीय रूप से भ्रमित ग्राफ बनाने में बहुत आसान बना देगा। (एकाधिक वाई अक्षों को समान कारणों से कभी भी लागू नहीं किया जाएगा।) – joran

उत्तर

9

आप यह कर सकते हैं। आपको ग्रिड ग्राफिक्स को दूसरे के शीर्ष पर एक प्लॉट ओवरले करने के लिए बताना होगा। में है मार्जिन और स्पेसिंग आदि प्राप्त करने के लिए, बिल्कुल दाएं, और आपको शीर्ष परतों की पारदर्शिता के बारे में सोचना होगा। संक्षेप में ... यह के लायक नहीं है। साथ ही संभवतः साजिश को भ्रमित कर रहा है।

हालांकि, मैंने सोचा कि कुछ लोगों को इस बात को समझने के लिए एक सूचक पसंद हो सकता है। N.B.मैं शीर्ष साजिश में तत्वों बनाने के लिए इस्तेमाल किया code from this gist पारदर्शी तो वे नीचे तत्व अपारदर्शी नहीं है:

grid.newpage() 
pushViewport(viewport(layout = grid.layout(1 , 1 , widths = unit(1 , "npc")))) 
print(p1 + theme(legend.position="none") , vp = viewport(layout.pos.row = 1 , layout.pos.col = 1)) 
print(p2 + theme(legend.position="none") , vp = viewport(layout.pos.row = 1 , layout.pos.col = 1)) 

कैसे ग्रिड लेआउट पर एक और स्थिति में किंवदंतियों जोड़ने के लिए मेरा उत्तर here देखें।

enter image description here

5

समस्या इतनी जटिल के रूप में आप सोच सकते हैं नहीं है। आम तौर पर, आप केवल एक सौंदर्य को मानचित्र बना सकते हैं। तो scale_colour_* को दो बार कॉल करने से ggplot2 को कोई समझ नहीं आता है। यह एक दूसरे को मजबूर करने की कोशिश करेगा।

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

1

मैं पल में समय एक पूरा काम कर उदाहरण प्रदान करने के लिए नहीं है, लेकिन वहाँ यह करने के लिए एक और तरीका है यहाँ उल्लेख किया जाना चाहिए कि क्या है: Fill and border colour in geom_point (scale_colour_manual) in ggplot

मूल रूप से, में geom_point का उपयोग कर shape = 21, color = NA के साथ संयोजन color सौंदर्यशास्त्र के बजाय fill का उपयोग करके अंकों की एक श्रृंखला के रंग को नियंत्रित करने की अनुमति देता है। यहां मेरा कोड इस तरह दिखता है। मैं समझता हूँ बशर्ते कोई डेटा उपलब्ध न हो, लेकिन उम्मीद है कि यह एक प्रारंभिक बिंदु प्रदान करता है:

biloxi + 
    geom_point(data = filter(train, primary != 'na'), 
      aes(y = GEO_LATITUDE, x = GEO_LONGITUDE, fill = primary), 
      shape = 21, color = NA, size = 1) + 
    scale_fill_manual(values = c('dodgerblue', 'firebrick')) + 
    geom_point(data = test_map_frame, 
      aes(y = GEO_LATITUDE, x = GEO_LONGITUDE, color = var_score), 
      alpha = 1, size = 1) + 
    scale_color_gradient2(low = 'dodgerblue4', high = 'firebrick4', mid = 'white', 
        midpoint = mean(test_map_frame$var_score)) 

सूचना कैसे geom_point की प्रत्येक कॉल एक अलग सौंदर्य (color या fill)