21

Rの「raster」パッケージを使用してラスターファイルからいくつかのマップを作成しています。いくつかのマップを並べて表示する比較ラスターを作成したいと思います。このために重要なのは、各マップの値に関係なく、使用されるカラースケールがすべてのマップで同じであるということです。たとえば、マップ1の値が0-1で、マップ2の値が0〜0.5の場合、値が0.5のセルは両方のマップで同じ色である必要があります。

例えば:

  • マップ1の値は0から1です
  • マップ2の値は0〜0.5です。
  • 色は赤(最低)から緑(最高)に変わります

0.5の値を両方のマップで同じ色にします(つまり、赤と緑の中間の黄色)。現在の動作は、マップ1では黄色、マップ2では緑色です。

これを機能させる方法が見つかりません。プロット機能で使用するピクセル値の範囲を設定する方法がわかりません。setMinMax()は役に立ちません(「plot」は常に値を計算するため)。手作業で値を設定しようとしても(たとえば、g1 @ data @ max <-10)、機能しません(これらはプロット時に無視されます)。

最後に、マップのスタックを作成すること(すべてを同じカラースケールでプロットすると予想される場合があります)も機能しません。各マップには、独自のカラースケールがあります。

これを行う方法について何か考えはありますか?

編集:

私が使用することになった解決策は次のとおりです。

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ), breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) ) 
4

6 に答える 6

13

今の簡単な解決策は、zlimオプションを使用することです。

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ),zlim=c(0,1) )
于 2017-08-03T21:06:43.847 に答える
12

image::ラスター関数はimage::base引数を渡すことができることを指定しているので(そしてimage :: baseがおそらく使用されることを示唆している)、imageへのすべての呼び出しに同じcol=およびbreaks=引数を指定するだけではないでしょうか::ラスター?ブレークとcol引数を「同期」させる必要があります。色の数は、休憩の数より1つ少なくする必要があります。以下の例は、古典的な火山データに基づいており、2番目のバージョンは、ある範囲の値を画像から除外する方法を示しています。

 x <- 10*(1:nrow(volcano))
 y <- 10*(1:ncol(volcano))
 image(x, y, volcano, col = terrain.colors( length(seq(90, 200, by = 5))-1), axes = FALSE, breaks= seq(90, 200, by = 5) )
 axis(1, at = seq(100, 800, by = 100))
 axis(2, at = seq(100, 600, by = 100))
 box()
 title(main = "Maunga Whau Volcano", font.main = 4)



 x <- 10*(1:nrow(volcano))
 y <- 10*(1:ncol(volcano))
 image(x, y, volcano, col = terrain.colors( length(seq(150, 200, by = 5))-1), axes = FALSE, breaks= seq(150, 200, by = 5) )
 axis(1, at = seq(100, 800, by = 100))
 axis(2, at = seq(100, 600, by = 100))
 box()
 title(main = "Maunga Whau Volcano Restricted to elevations above 150", font.main = 4)

具体的な例は、この取り組みを支援します。

于 2010-11-30T18:21:10.627 に答える
5

@Tomasへの回答として追加

私が使用することになった答えは次のとおりです。

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ), 
    breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) ) 
于 2013-08-28T11:10:18.773 に答える
4

ここで「ラスター」で実行する作業は他にもありますが、ここにハックがあります。

 library(raster)
 r1 <- r2 <- r3 <- raster(ncol=10, nrow=10)
 r1[] <- runif(ncell(r1))
 r2[] <- runif(ncell(r2)) / 2
 r3[] <- runif(ncell(r3)) * 1.5
 r3 <- min(r3, 1)
 s <- stack(r1, r2, r3)


 brk <- c(0, 0.25, 0.5, 0.75, 1)
 par(mfrow=c(1,3))
 plot(r1, breaks=brk, col=rainbow(4), legend=F)
 plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F)
 plot(r2, breaks=brk, col=rainbow(4), legend=F)
 plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F)
 plot(r3, breaks=brk, col=rainbow(4), legend=F)
 plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F)

spplot関数(spパッケージ)も使用できます

 s <- stack(r1, r2, r3) 
 sp <- as(s, 'SpatialGridDataFrame')
 spplot(sp)

値をggplotに送信することもできます(例についてはr-sig-geoアーカイブを検索してください)RasterLayerが非常に大きなファイルにリンクしている場合は、ggplotに移動する前に最初にリンクすることができます。

r <- sampleRegular(r, size=100000, asRaster=TRUE) 

そしておそらく

m <- as.matrix(r)
于 2010-11-30T18:36:52.040 に答える
1

それは私にはうまくいきませんでした。このスクリプトを使用してカラースケールを分割し、データに応じてより適切なものを選択しました。

plot(d, col=rev(heat.colors(8, alpha = 1)), breaks = seq(0, 0.40, by = 0.05))
于 2016-02-02T23:20:45.693 に答える
1

通常は機能するはずの非常に単純な解決策(たとえば、ラスターパッケージの「プロット」機能を使用)は、「z軸」制限(色と色の凡例を制御する)を設定することです。

たとえば、次のようなことができます。 plot(d, zlim=c(0,1))

ここで、dはスタックされたラスターオブジェクトです。または、個別のラスターd1、d2、d2 ...が多数ある場合は、次の操作を実行できます plot(d1, zlim=c(0,1)) plot(d2, zlim=c(0,1)) plot(d3, zlim=c(0,1)) 。...

于 2020-02-15T15:17:29.097 に答える