2015-10-20 26 views
18

मैं नीचे (आर्क मानचित्र में बनाया गया) एकएक रेखापुंज

enter image description here

मैं निम्नलिखित कोड की कोशिश की है के लिए इसी तरह आर स्टूडियो का उपयोग एक साजिश बनाने के लिए चाहते हैं मैप करने के लिए उपयोग ggplot2 कैसे निर्धारित करें:

# data processing 
library(ggplot2) 
# spatial 
library(raster) 
library(rasterVis) 
library(rgdal) 

# 
test <- raster(paste(datafold,'oregon_masked_tmean_2013_12.tif',sep="")) # read the temperature raster 
OR<-readOGR(dsn=ORpath, layer="Oregon_10N") # read the Oregon state boundary shapefile 

gplot(test) + 
    geom_tile(aes(fill=factor(value),alpha=0.8)) + 
    geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
       fill=NA,color="grey50", size=1)+ 
    coord_equal() 

कि कोड के उत्पादन में इस तरह दिखता है:

enter image description here

कुछ चीजों को ध्यान में रखना। सबसे पहले, वाटरशेड आकारफाइल आर संस्करण से गायब हैं। यह ठीक है।

दूसरा, आर प्लॉट में गहरा भूरा पृष्ठभूमि कोई डेटा मान नहीं है। आर्क में, वे प्रदर्शित नहीं होते हैं, लेकिन आर में वे gplot के साथ प्रदर्शित करते हैं। जब मैं रेखापुंज पैकेज से 'साजिश' का उपयोग वे प्रदर्शन नहीं करते:

plot(test) 

enter image description here

मेरे सवालों का इस प्रकार हैं:

  1. मैं कैसे गहरे भूरे रंग से कैसे छुटकारा पाऊँ भरने NoData 'gplot' उदाहरण में?
  2. मैं किंवदंती (रंगीन) को उचित होने के लिए कैसे सेट करूं (जैसे आर्कमैप और रास्टर 'प्लॉट' किंवदंतियों में?)
  3. मैं रंगरूप को कैसे नियंत्रित करूं?

ध्यान दें करने के लिए, मैं

scale_fill_brewer 
scale_fill_manual 
scale_fill_gradient 

के कई अलग अलग संस्करणों की कोशिश की है और इतने पर और बहुत आगे है, लेकिन मैं

br <- seq(minValue(test), maxValue(test), len=8) 

gplot(test)+ 
geom_tile(aes(fill=factor(value),alpha=0.8)) + 

scale_fill_gradient(breaks = br,labels=sprintf("%.02f", br)) + 

geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
      fill=NA,color="grey50", size=1)+ 
coord_equal() 

Regions defined for each Polygons 
Error: Discrete value supplied to continuous scale 

अंत में त्रुटियों मिलता है, उदाहरण के लिए, एक बार मैं एक समाधान है इन मानचित्रों में से एक को साजिश करने के लिए, मैं एक आकृति पर कई मानचित्रों को प्लॉट करना चाहता हूं और पूरे पैनल (यानी सभी मानचित्रों के लिए एक रंगीन पट्टी) के लिए एक रंगीन रंग बनाना चाहता हूं और मैं यह नियंत्रित करने में सक्षम होना चाहूंगा कि कलरबार कहां स्थित है और कर्नल का आकार orbar। यहाँ है कि मैं क्या grid.arrange साथ कर सकते हैं का एक उदाहरण है, लेकिन मैं समझ नहीं एक भी colorbar सेट करने का तरीका:

r1 <- test 
r2 <- test 
r3 <- test 
r4 <- test 

colr <- colorRampPalette(rev(brewer.pal(11, 'RdBu'))) 

l1 <- levelplot(r1, 
      margin=FALSE,      
      colorkey=list(
      space='bottom',     
      labels=list(at=-5:5, font=4), 
      axis.line=list(col='black')  
     ),  
      par.settings=list(
      axis.line=list(col='transparent') 
     ), 
      scales=list(draw=FALSE),    
      col.regions=viridis,     
      at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

l2 <- levelplot(r2, 
       margin=FALSE,      
       colorkey=list(
        space='bottom',     
        labels=list(at=-5:5, font=4), 
        axis.line=list(col='black')  
       ),  
       par.settings=list(
        axis.line=list(col='transparent') 
       ), 
       scales=list(draw=FALSE),    
       col.regions=viridis,     
       at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

l3 <- levelplot(r3, 
       margin=FALSE,      
       colorkey=list(
        space='bottom',     
        labels=list(at=-5:5, font=4), 
        axis.line=list(col='black')  
       ),  
       par.settings=list(
        axis.line=list(col='transparent') 
       ), 
       scales=list(draw=FALSE),    
       col.regions=viridis,     
       at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

l4 <- levelplot(r4, 
       margin=FALSE,      
       colorkey=list(
        space='bottom',     
        labels=list(at=-5:5, font=4), 
        axis.line=list(col='black')  
       ),  
       par.settings=list(
        axis.line=list(col='transparent') 
       ), 
       scales=list(draw=FALSE),    
       col.regions=viridis,     
       at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

grid.arrange(l1, l2, l3, l4,nrow=2,ncol=2) #use package gridExtra 

उत्पादन यह है:

enter image description here

शेपफ़ाइल और रेखापुंज फ़ाइल नीचे दिए गए लिंक पर उपलब्ध हैं:

https://drive.google.com/open?id=0B5PPm9lBBGbDTjBjeFNzMHZYWEU

कई समय से आगे धन्यवाद।

devtools :: session_info() सत्र जानकारी ------------------------------------- -------------------------------------------------- ------------------------------ सेटिंग मूल्य
संस्करण आर संस्करण 3.1.1 (2014-07-10) सिस्टम x86_64, डार्विन 10.8।0
ui RStudio (0.98.1103)
भाषा (एन)
कोलेट en_US.UTF-8
America/Los_Angeles TZ

संकुल --------------- -------------------------------------------------- -------------------------------------------------- ------ पैकेज * संस्करण दिनांक स्रोत
बिट्स 1.0-6 2013-08-17 सीआरएएन (आर 3.1.0) रंगस्थान 1.2-6 2015-03-11 सीआरएएन (आर 3.1.3) devtools 1.8 .0 2015-05-09 सीआरएएन (आर 3.1.3) डाइजेस्ट 0.6.4 2013-12-03 सीआरएएन (आर 3.1.0) ggplot2 * 1.0.1 2015-03-17 सीआरएएन (आर 3.1.3) ggthemes * 2.1.2 2015-03-02 सीआरएएन (आर 3.1.3) git2r 0.10.1 2015-05-07 सीआरएएन (आर 3.1 .3) ग्रिडएक्स्ट्रा 0.9.1 2012-08-09 सीआरएएन (आर 3.1.0) जीटेबल 0.1.2 2012-12-05 सीआरएएन (आर 3.1.0) हेक्सबिन * 1.26.3 2013-12-10 सीआरएएन (आर 3.1.0) जाली * 0.20-29 2014-04-04 सीआरएएन (आर 3.1.1) लैटिस एक्स्ट्रा * 0.6-26 2013-08-15 सीआरएएन (आर 3.1.0) मैग्रिटर 1.5 2014-11-22 क्रैन (आर 3.1.2) MASS 7.3-33 2014-05-05 सीआरएएन (आर 3.1.1) ज्ञापन 0.2.1 2014-04-22 सीआरएएन (आर 3.1.0) मुनसेल 0.4.2 2013-07-11 सीआरएएन (आर 3.1.0) प्लीयर 1.8.2 2015-04-21 सीआरएएन (आर 3.1.3) प्रोटो 0.3-10 2012-12-22 क्रैन (आर 3.1.0) रास्टर * 2.2-31 2014-03-07 सीआरएएन (आर 3.1.0) रास्टरविस * 0.28 2014-03-25 सीआरएएन (आर 3.1.0) आरकॉलरब्रेवर * 1.0-5 2011-06- 17 सीआरएएन (आर 3.1.0) आरसीपीपी 0.11.2 2014-06-08 सीआरएएन (आर 3.1.0) आरसीआरएल 1.95-4.6 2015-04-24 सीआरएएन (आर 3.1.3) reshape2 1.4.1 2014-12 -06 सीआरएएन (आर 3.1.2) आरजीडीएल * 0.8-16 2014-02-07 सीआरएएन (आर 3.1.0) रिवर्सन 1.0.0 2015-04-22 सीआरएएन (आर 3.1.3) स्केल * 0.2.4 2014-04-22 सीआरएएन (आर 3.1.0) एसपी * 1.0-15 2014-04-09 सीआरएएन (आर 3.1.0) स्ट्रिंग 0.4-1 2014-12-14 सीआरएएन (आर 3.1.2) स्ट्रिंगर 1.0 .0 2015-04-30 सीआरएएन (आर 3.1.3) वायरिडीस * 0.3.1 2015-10-11 सीआरएएन (आर 3.2.0) एक्सएमएल 3.98-1.1 2013-06-20 क्रैन (आर 3.1.0) चिड़ियाघर 1.7-11 2014-02-27 क्रैन (आर 3.1.0)

+2

कारण यह है कि आप इस के लिए ggplot उपयोग करना चाहते हैं क्या है? – RobertH

+1

@RobertH मैं ggplot का उपयोग करने के लिए प्रतिबद्ध नहीं हूं लेकिन आम तौर पर मुझे ggplot पसंद है और मैं इसे सीखने की कोशिश कर रहा हूं इसलिए मैं प्रभावी रूप से ggplot के साथ भूखंडों का उत्पादन करने में सक्षम होना चाहता हूं। कृपया अन्य समाधानों को भी साझा करने के लिए स्वतंत्र महसूस करें। धन्यवाद। –

+0

@hrbrmstr कृपया पहचानें कि क्या काम नहीं कर रहा है। शायद आप इस तथ्य से जूझ रहे हैं कि मैंने कुछ पूर्ण पथ शामिल किए हैं जो स्पष्ट रूप से किसी और की मशीन पर काम नहीं करेंगे। मैंने अपने संदेश के अंत में वास्तविक डेटा का एक लिंक शामिल किया। यदि आप डेटा को किसी फ़ोल्डर में डालते हैं और पथ को अपने फ़ोल्डर के पथ से प्रतिस्थापित करते हैं तो इसे काम करना चाहिए। मैं खरोंच से डेटा उत्पन्न करने के लिए आर के साथ पर्याप्त कुशल नहीं हूँ। –

उत्तर

9

यहाँ कैसे मैं यह कर जाएगा,:

आप gplot उपयोग करने के लिए है, तो निम्न का उपयोग कर सकते

लोड बातें:

oregon <- readOGR('.', 'Oregon_10N') 
r <- raster('oregon_masked_tmean_2013_12.tif') 

रंग रैंप पैलेट को परिभाषित करें (या नीचे at तर्क के साथ परिभाषित रंग रैंप के लिए ब्रेक की संख्या से लंबाई 1 के साथ रंगों का एक वेक्टर परिभाषित करें)।

colr <- colorRampPalette(brewer.pal(11, 'RdYlBu')) 

प्लॉट बातें:

levelplot(r, 
      margin=FALSE,      # suppress marginal graphics 
      colorkey=list(
      space='bottom',     # plot legend at bottom 
      labels=list(at=-5:5, font=4)  # legend ticks and labels 
     ),  
      par.settings=list(
      axis.line=list(col='transparent') # suppress axes and legend outline 
     ), 
      scales=list(draw=FALSE),   # suppress axis labels 
      col.regions=colr,     # colour ramp 
      at=seq(-5, 5, len=101)) +   # colour ramp breaks 
    layer(sp.polygons(oregon, lwd=3))   # add oregon SPDF with latticeExtra::layer 

enter image description here

आप वास्तव में कथा रूपरेखा (अपने टिक सहित) चाहते हो सकता है साजिश रची है, जिसमें मामले colorkey आर्ग की सूची में axis.line=list(col='black') जोड़ें। मेरी राय में - - एक सा बदसूरत

levelplot(r, 
      margin=FALSE,      
      colorkey=list(
      space='bottom',     
      labels=list(at=-5:5, font=4), 
      axis.line=list(col='black')  
     ),  
      par.settings=list(
      axis.line=list(col='transparent') 
     ), 
      scales=list(draw=FALSE),    
      col.regions=colr,     
      at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3))     

enter image description here

मैं साथ @hrbrmstr कि viridis अक्सर एक better ramp to use है, होने के बावजूद इस बात से सहमत: इस बक्से के सामान्य दमन par.settings=list(axis.line=list(col='transparent')) की वजह से ओवरराइड करने के लिए आवश्यक है । कलरब्रेवर के RdYlBu जैसे कुछ पर मुख्य लाभ यह है कि रंग असंतृप्त होने पर अभी भी अलग हैं, और रंग भिन्नता मूल्यों में अंतर को बेहतर ढंग से प्रतिबिंबित करती है। मेरा मानना ​​है कि RdYlBu हालांकि ड्यूटेरानोपिया/प्रोटानोपिया/ट्राइटोनोपिया रंग-अंधापन के लिए पूरी तरह से सुलभ है।

यहाँ viridis संस्करण है:

library(viridis) 
levelplot(r, 
      margin=FALSE,      
      colorkey=list(
      space='bottom',     
      labels=list(at=-5:5, font=4), 
      axis.line=list(col='black')  
     ),  
      par.settings=list(
      axis.line=list(col='transparent') 
     ), 
      scales=list(draw=FALSE),    
      col.regions=viridis,     
      at=seq(-5, 5, len=101)) +   
    layer(sp.polygons(oregon, lwd=3)) 

enter image description here


संपादित

ओपी के अतिरिक्त प्रश्न के उत्तर में, यहाँ के रूप में अनुरोध कई rasters प्लॉट करने के लिए कैसे है।

मानते हैं कि सभी रास्टर्स के पास समान सीमा, संकल्प, अनुमान आदि हैं, आप उन्हें RasterStack में ढेर कर सकते हैं, और फिर स्टैक पर levelplot का उपयोग कर सकते हैं। widthcolorkey पर ली गई सूची के तत्व के रूप में width को पारित करने के लिए पास कर सकते हैं ("चौड़ाई" थोड़ा काउंटर-अंतर्ज्ञानी है, लेकिन डिफ़ॉल्ट किंवदंतियों द्वारा लंबवत हैं)। यदि आप प्रत्येक पैनल के ऊपर स्ट्रिप लेबल को दबाना चाहते हैं (जैसा कि मैंने नीचे किया है - डिफ़ॉल्ट रूप से उन्हें स्टैक के परत नामों के साथ लेबल किया गया है [names(s)] देखें), आप strip.border और strip.backgroundpar.settings पर दी गई सूची में जोड़ सकते हैं।

s <- stack(r, r*0.8, r*0.6, r*0.4) 
levelplot(s, 
      margin=FALSE,      
      colorkey=list(
      space='bottom',     
      labels=list(at=-5:5, font=4), 
      axis.line=list(col='black'), 
      width=0.75 
     ),  
      par.settings=list(
      strip.border=list(col='transparent'), 
      strip.background=list(col='transparent'), 
      axis.line=list(col='transparent') 
     ), 
      scales=list(draw=FALSE),    
      col.regions=viridis,     
      at=seq(-5, 5, len=101), 
      names.attr=rep('', nlayers(s))) +   
    layer(sp.polygons(oregon, lwd=3)) 

enter image description here

+0

मुझे वास्तव में लेवलप्लॉट समाधान पसंद है, भले ही मेरा प्रश्न ggplot और/या gplot का उपयोग करने के लिए विशिष्ट था। क्या आप यह दिखाने के लिए अपना समाधान संपादित कर सकते हैं कि मैं इनमें से चार तापमान मानचित्रों को एक सबप्लॉट में नीचे एक सिंगल कलरबार के साथ कैसे प्लॉट कर सकता हूं और कलरबार के आयामों को नियंत्रित कर सकता हूं ताकि रंगीन लंबा लंबा न हो और यह साजिश के नीचे फैल जाए ? मैं अपने समाधान के साथ संयोजन में अपनी मूल पोस्ट में ग्रिड.रेंज का उपयोग करके जो किया है उसका एक उदाहरण जोड़ रहा हूं लेकिन आप देखेंगे कि प्रत्येक आकृति के लिए रंगीन रंग हैं। –

+1

लेबल आयतों को दबाने का एक और समाधान 'रास्टरथीम' फ़ंक्शन का उपयोग करके है: 'myTheme <- rasterTheme (region = viridis (n = 9)); myTheme $ axis.list $ col <- 'पारदर्शी''। फिर आप 'level.toptings = myTheme' का उपयोग 'लेवलप्लॉट' कॉल के अंदर करते हैं। –

15
library(ggplot2) 
library(raster) 
library(rasterVis) 
library(rgdal) 
library(grid) 
library(scales) 
library(viridis) # better colors for everyone 
library(ggthemes) # theme_map() 

datafold <- "/path/to/oregon_masked_tmean_2013_12.tif" 
ORpath <- "/path/to/Oregon_10N.shp" 

test <- raster(datafold) 
OR <- readOGR(dsn=ORpath, layer="Oregon_10N") 

आप शामिल नहीं किया था जो कुछ भी आप करने के लिए उपयोग कर रहे थे test कर तो मैं ऐसा किया:

test_spdf <- as(test, "SpatialPixelsDataFrame") 
test_df <- as.data.frame(test_spdf) 
colnames(test_df) <- c("value", "x", "y") 

और, तो यह है कि + शेपफ़ाइल ggplot2 के लिए भेजने का मामला है:

ggplot() + 
    geom_tile(data=test_df, aes(x=x, y=y, fill=value), alpha=0.8) + 
    geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
       fill=NA, color="grey50", size=0.25) + 
    scale_fill_viridis() + 
    coord_equal() + 
    theme_map() + 
    theme(legend.position="bottom") + 
    theme(legend.key.width=unit(2, "cm")) 

enter image description here

यह अब किसी भी निरंतर तापमान पैमाने के साथ काम करेगा, वैसे। विरिडिस बहुत ही लंबे समय तक आने वाले सबसे अच्छे लोगों में से एक है।

बातें पढ़ें: rasterVis::levelplot साथ

gplot(test) + 
    geom_tile(aes(x=x, y=y, fill=value), alpha=0.8) + 
    geom_polygon(data=OR, aes(x=long, y=lat, group=group), 
       fill=NA, color="grey50", size=0.25) + 
    scale_fill_viridis(na.value="white") + 
    coord_equal() + 
    theme_map() + 
    theme(legend.position="bottom") + 
    theme(legend.key.width=unit(2, "cm")) 
+0

इनमें से कोई भी समाधान मेरे लिए काम नहीं करता है। पहले समाधान के लिए, मुझे त्रुटि मिलती है कि "ggplot2 क्लास रास्टरलेयर के डेटा से निपटने का तरीका नहीं जानता", और समाधान 2 के लिए मुझे theme_map "त्रुटि: ऑब्जेक्ट 'theme_map' नहीं मिला" के लिए त्रुटि मिलती है। मैंने "ggthemes" –

+0

लोड किया है, यह SO टिप्पणियों के फ़ील्ड में ऐसा करना बहुत आसान है (मैं निराशाजनक रूप से इसे हर समय करता हूं)। दूसरे मुद्दे के लिए 'लाइब्रेरी (ggthemes)' जोड़ें (मैं पोस्ट अपडेट करूंगा)। पहले के लिए मैंने आपकी 'टेस्ट' ऑब्जेक्ट को अलग-अलग बदल दिया। – hrbrmstr

+0

वास्तव में, मेरे पास पोस्ट में 'लाइब्रेरी (ggthemes) 'था, आपको' theme_map' – hrbrmstr

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