2010-11-30 13 views
13

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

  • マップ1、マップ2は、色が緑色に(最低)赤から移行0から0.5
  • の値(最高)
  • を有する
  • 0から1までの値を有しています

私は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)) 
+0

あなたが解決したソリューションは、実際には最高の答えです。答えとして入れて受け入れてください!私はほとんどそれを逃した - 私は質問で答えを探すことはありません。 – TMS

+1

'spplot'はすべてのレイヤーのグローバル凡例を含む' RasterStack'を表示します。 'raster'パッケージは' spplot'のメソッドを定義していますので、 'RasterStack'を' Spatial * 'オブジェクトに変換する必要はありません。 –

答えて

7

画像::ラスター機能が画像::基本引数が渡された(とそのイメージを提案することができることを指定するので:: baseはおそらく使用されます)、image :: rasterへのすべての呼び出しに対して同じcol =とbreaks =引数を指定するだけではありませんか?あなたはを実行します。はブレークとcolの引数を "同期"する必要があります。色の数は、ブレークの数より1少ない必要があります。以下の例は、古典的な火山のデータに基づいており、第二のバージョンは、値の範囲が画像から除外することができる方法を示しています。

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) 

特定の例では、この取り組みを支援することになります。

+0

これは完璧です、ありがとう!私は最後にプロットをした(d、col = rev(rainbow(99、start = 0、end = 1))、breaks = seq(min(minValue(d))、max(maxValue(d))、length.out = 100))(申し訳ありませんが、コメントに書式を付けることはできません!) –

+0

あなたの質問を編集して、後世のためにあなたの解決策を保存してください。いつかは便利かもしれません。 –

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に行く前にggplotに行くでしょう

その後、210

、おそらく

m <- as.matrix(r) 
3

@Tomas

に応じて答えとして追加された私が使用して終了答えは次のとおりです。

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

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

plot(d, col=rev(heat.colors(8, alpha = 1)), breaks = seq(0, 0.40, by = 0.05)) 
1

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

plot(d, col=rev(rainbow(99, start=0,end=1)),zlim=c(0,1)) 
関連する問題