2016-04-06 13 views
2

以下のサンプルデータを使用して、以下に示す「手動」結合プロットと同じカラーキーでラスタと空間点プロットを生成するにはどうすればよいですか?ラスタとポイントの単一カラーキーレベルプロットR

library(rasterVis) 
library(raster) 
library(colorRamps) 
col=colorRampPalette(matlab.like2(255)) 

s <- stack(replicate(2, raster(matrix(runif(100), 10)))) 
xy <- data.frame(coordinates(sampleRandom(s, 10, sp=TRUE)), 
       z1=runif(10), z2=runif(10)) 

levelplot(s, margin=FALSE, at=seq(0, 1, 0.05),col.regions=col) 
x=xy$x;y=xy$y;z=xy$z1 

levelplot(z ~ x + y,contour=F, panel = panel.levelplot.points, 
      margin=FALSE,col.regions=col, 
      par.settings=list(axis.line=list(lwd=3), strip.border=list(lwd=3)), 
     cex=1.4, scales=list(x=list(cex=1.7),y=list(cex=1.7)),xlab=list(label="Longitude",cex=2), 
      ylab=list(label="Latitude",cex=2)) 

sample plot

おかげで、私が使用して、次のプロットを作成することができた@fdestchします

latticeCombineGrid(mget(rep("pp", 24)), layout = c(3, 8)) 

は同じカラーキーで複数のプロットを印刷するには、私のコメントを以下に示します。

解明されないままで問題:

1)はどのようにして、パネルの順序を決めることができますか?つまり、列&は、levelplotのように特定のプロットを配置するのに、index.condを使用します。

enter image description here

+0

最後の問題について別の質問を投稿してください。 –

答えて

2

まず第一に、あなたはおそらくポイントのプロットのブレークが最初levelplotで定義されたものと同一であることを確認する必要があります。

## raster plot with colorkey disabled 
pr <- levelplot(s, margin = FALSE, at = seq(0, 1, 0.05), col.regions = col, 
       colorkey = FALSE, xlab = list("Longitude", col = "transparent")) 

## points plot 
pp <- levelplot(z ~ x + y, panel = panel.levelplot.points, cex = 1.4, 
       contour = FALSE, margin = FALSE, col.regions = col, 
       colorkey = list(at = seq(0, 1, .05), width = .6, height = .6), 
       xlab = "Longitude", ylab = "Latitude") 

ラスタプロットを作成するときは、透明なxlabの定義に注意してください。この小さな回避策は、後でdownViewportを使用して、prppの実際のプロット境界が重複していることを確認するときにはかなり便利です(print(pr, newpage = FALSE)の直後にgrid.rect()を実行してください)。

グリッドパッケージからのビューポートを使用すると、実際のプロットの配置を簡単に行うことができます。ここで

library(grid) 
library(lattice) 

## initialize new grid device 
grid.newpage() 

## add raster plot 
vp1 <- viewport(x = 0, y = 0, width = .5, height = 1, 
       just = c("left", "bottom")) 

pushViewport(vp1) 
print(pr, newpage = FALSE) 

## add points plot 
downViewport(trellis.vpname("page")) 

vp2 <- viewport(x = 1, y = 0, width = .75, height = 1, 
       just = c("left", "bottom")) 
pushViewport(vp2) 
print(pp, newpage = FALSE) 

arranged_plots

+0

非常に良い解決策。どうもありがとう。単一のカラーキーで表示するために8行と3列を使用するとどうなりますか?通常は 'layout = c(3、8)、index.cond = list(c(1,2、....))'を使ってグリッドを取得します。 'Viewport'はプロットを配置するのが難しい場合があります。 'layout'と' index.cond'の回避策はありますか? – code123

+0

この特別な目的のために、私たちの** Rsenal **パッケージには['latticeCombineGrid'](https://github.com/environmentalinformatics-marburg/Rsenal/blob/master/R/latticeCombineGrid.R)という関数があります。 'devtools :: install_github(" environmentinformatics-marburg/Rsenal ")'を介してパッケージをインストールして、単に実行してください。 'latticeCombineGrid(mget(rep(" pp "、24))、layout = c(3、8))'となります。すべてのプロットのxとyの制限が同じ場合、結果は最もよく見えることに注意してください。 – fdetsch

+0

あなたは私の日を救った。 'latticeCombineGrid'は非常に有望です。私は間違いなくそれを試してみます。再度、感謝します。 – code123

1

latticeExtra::c.trellisを使用して、私のソリューションです:

library(raster) 
library(rasterVis) 

s <- stack(replicate(2, raster(matrix(runif(100), 10)))) 
xy <- data.frame(coordinates(sampleRandom(s, 10, sp=TRUE)), 
       z1=runif(10), z2=runif(10)) 

## Define theme and breaks 
myTheme <- BTCTheme() 
my.at <- seq(0, 1, 0.05) 
  • プロットrasterVis::levelplotを使用してRaster*オブジェクト、:

    p1 <- levelplot(s, margin=FALSE, 
            at = my.at, 
            par.settings = myTheme) 
    
  • lattice::levelplotを使用して
  • プロットポイントを、:

    p2 <- levelplot(z1 ~ x + y, data = xy, 
            at = my.at, 
            panel = panel.levelplot.points, 
            par.settings = myTheme) 
    
  • latticeExtra::c.trellisでそれらに参加:

    p3 <- c(p1, p2, layout = c(3, 1)) 
    
  • 残念ながら、c.trellisは正しくストリップラベルを割り当てていないので、あなたは直接それらを定義する必要があります。

    update(p3, 
        strip = strip.custom(factor.levels = c(names(s), "Points"))) 
    

raster + points

+0

これはさらに簡単で実装が簡単です。ありがとう。最後のコード行は、各プロットがパネル内に配置される場所を決定するために使用できます。私が 's'の名前を知っていれば、それらを表示する順序を簡単に決めることができます。 – code123

関連する問題