web-dev-qa-db-ja.com

ggplot2を使用してラスターをマップするように設定する方法

Rスタジオを使用して、以下のようなプロットを作成したい(Arc Mapで作成)

enter image description here

私は次のコードを試しました:

# 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

注意すべき点がいくつかあります。まず、Rバージョンには流域シェープファイルがありません。それは結構です。

第二に、Rプロットの暗い灰色の背景はデータ値なしです。 Arcでは表示されませんが、Rではgplotで表示されます。ラスターパッケージの 'plot'を使用すると表示されません。

plot(test)

enter image description here

私の質問は次のとおりです。

  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

最後に、これらのマップの1つをプロットするためのソリューションが得られたら、1つの図に複数のマップをプロットし、パネル全体に単一のカラーバー(つまり、すべてのマップに1つのカラーバー)を作成します。カラーバーの位置とカラーバーのサイズを制御します。 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   

出力は次のとおりです。

enter image description here

シェープファイルとラスターファイルは、次のリンクから入手できます。

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

事前に感謝します。

devtools :: session_info()セッション情報------------------------------------------ -------------------------------------------------- -------------------------設定値
バージョンRバージョン3.1.1(2014-07-10)システムx86_64、darwin10.8.0
ui RStudio(0.98.1103)
言語(EN)
collat​​e 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.1 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)格子Extra * 0.6-26 2013-08-15 CRAN(R 3.1。 0)magrittr 1.5 2014-11-22 CRAN(R 3.1.2)MASS 7.3-33 2014-05-05 CRAN(R 3.1.1)memoise 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)ラスター* 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)

32
mr. cooper

rasterVis::levelplotを使用して、次のようにします。

ロードする:

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

物事を読む:

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 argsのリストにaxis.line=list(col='black')を追加します。これは、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))                  

enter image description here

私は@hrbrmstrに同意しますが、viridisは 使用する方が良いランプ であることが多いですが、私の意見では少しopinionいです。 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))

enter image description here


[〜#〜] edit [〜#〜]

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

enter image description here

19
jbaums
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

連続温度スケールで動作します。ヴィリディスは、非常に長い間やってきた最高のものの一つです。

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

これは、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に設定します。

2
Mio_Mio_Mate