簡體   English   中英

如何設置使用ggplot2來映射柵格

[英]How to set use ggplot2 to map a raster

我想使用類似於下面的R studio(在Arc Map中創建)制作一個情節

在此輸入圖像描述

我試過以下代碼:

# 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()

該代碼的輸出如下所示:

在此輸入圖像描述

有幾點需要注意。 首先,R版本缺少分水嶺形狀文件。 那也行。

其次,R圖中較暗的灰色背景是無數據值。 在Arc中,它們不顯示,但在R中它們顯示為gplot。 當我使用光柵包中的“plot”時,它們不顯示:

plot(test)

在此輸入圖像描述

我的問題如下:

  1. 如何擺脫'gplot'示例中的深灰色NoData填充?
  2. 如何將圖例(顏色條)設置為合理(例如在ArcMap和柵格'情節'圖例中?)
  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

最后,一旦我有一個繪制其中一個地圖的解決方案,我想在一個圖上繪制多個地圖,並為整個面板創建一個顏色條(即所有地圖的一個顏色條),我希望能夠控制顏色條所在的位置和顏色條的大小。 這是我可以用grid.arrange做的一個例子,但我無法弄清楚如何設置一個顏色條:

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   

輸出是這樣的:

在此輸入圖像描述

shapefile和raster文件位於以下鏈接:

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

非常感謝提前。

devtools :: session_info()會話信息------------------------------------------ -------------------------------------------------- -------------------------設定值
版本R版本3.1.1(2014-07-10)系統x86_64,darwin10.8.0
ui RStudio(0.98.1103)
語言(EN)
整理en_US.UTF-8
tz America / Los_Angeles

包裹------------------------------------------------- -------------------------------------------------- ----------------------包*版日期來源
bitops 1.0-6 2013-08-17 CRAN(R 3.1.0)色彩空間1.2-6 2015-03-11 CRAN(R 3.1.3)devtools 1.8.0 2015-05-09 CRAN(R 3.1.3)摘要0.6 .4 2013-12-03 CRAN(R 3.1.0)ggplot2 * 1.0.1 2015-03-17 CRAN(R 3.1.3)ggthemes * 2.1.2 2015-03-02 CRAN(R 3.1.3)git2r 0.10 。2015-05-07 CRAN(R 3.1.3)gridExtra 0.9.1 2012-08-09 CRAN(R 3.1.0)gtable 0.1.2 2012-12-05 CRAN(R 3.1.0)hexbin * 1.26。 3 2013-12-10 CRAN(R 3.1.0)格* 0.20-29 2014-04-04 CRAN(R 3.1.1)latticeExtra * 0.6-26 2013-08-15 CRAN(R 3.1.0)magrittr 1.5 2014 -11-22 CRAN(R 3.1.2)質量7.3-33 2014-05-05 CRAN(R 3.1.1)備忘錄0.2.1 2014-04-22 CRAN(R 3.1.0)munsell 0.4.2 2013-07 -11 CRAN(R 3.1.0)plyr 1.8.2 2015-04-21 CRAN(R 3.1.3)proto 0.3-10 2012-12-22 CRAN(R 3.1.0)raster * 2.2-31 2014-03- 07 CRAN(R 3.1.0)rasterVis * 0.28 2014-03-25 CRAN(R 3.1.0)RColorBrewer * 1.0-5 2011-06-17 CRAN(R 3.1.0)Rcpp 0.11.2 2014-06-08 CRAN (R 3.1.0)RCurl 1.95-4.6 2015-04-24 CRAN(R 3.1.3)reshape2 1.4.1 2014-12-06 CRAN(R 3.1.2)rgdal * 0.8-16 2014-02-07 CRAN(R 3.1.0)rversions 1.0.0 2015-04-22 CRAN(R 3.1.3)規模* 0.2.4 2014-04-22 CRAN(R 3.1.0)sp * 1.0-15 2014-04-09 CRAN(R 3.1.0)stringi 0.4-1 2014-12-14 CRAN(R 3.1.2)stringr 1.0.0 2015-04-30 CRAN(R 3.1.3)viridis * 0.3.1 2015 -10-11 CRAN(R 3.2.0)XML 3.98-1.1 2013-06-20 CRAN(R 3.1.0)zoo 1.7-11 2014-02-27 CRAN(R 3.1.0)

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")

而且,這只是將+ shapefile發送到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"))

在此輸入圖像描述

它現在可以用於任何連續的溫標。 Viridis只是很長一段時間內最好的人之一。

如果必須使用gplot可以使用以下gplot

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"))

以下是我將如何使用rasterVis::levelplot

裝貨:

library(rgdal)
library(rasterVis)
library(RColorBrewer)

讀東西:

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

定義顏色漸變調色板(或長度為1的顏色矢量,顏色漸變的數量小於使用下面的at參數定義的顏色漸變)。

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

在此輸入圖像描述

您可能實際上想要繪制圖例輪廓(包括其刻度),在這種情況下將axis.line=list(col='black')colorkey args列表中。 這需要覆蓋由par.settings=list(axis.line=list(col='transparent'))引起的對框的一般抑制:

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))                  

在此輸入圖像描述

我同意@hrbrmstr認為viridis通常是一個更好的使用 ,盡管在我看來 - 有點難看。 ColorBrewer的RdYlBu類的主要優點是在去飽和時顏色仍然不同,顏色差異更能反映出值的差異。 我相信RdYlBu非常適合Deuteranopia / Protanopia / Tritanopia色盲。

這是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))

在此輸入圖像描述


編輯

為了回應OP的另外一個問題,這里是如何根據要求繪制多個柵格。

假設所有柵格具有相同的范圍,分辨率,投影等,您可以將它們堆疊到RasterStack ,然后在堆棧上使用levelplot 您可以將width作為傳遞給colorkey的列表的元素來傳遞以控制圖例的高度(“寬度”有點違反直覺,但默認情況下圖例是垂直的)。 如果你想抑制每個面板上方的條帶標簽(正如我在下面所做的那樣 - 默認情況下它們標有堆棧的圖層名稱[參見names(s) ]),你可以將strip.borderstrip.background添加到列表中傳遞給par.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))

在此輸入圖像描述

這是使用ggplot的簡單解決方案:

scale_fill_gradientn(colours = terrain.colors(4),limits=c(0,1),  
                 space = "Lab",name=paste("Probability \n"),na.value = NA)

在scale_fill_gradientn中(也應該適用於scale_file_gradient),設置na.value = NA。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM