2010-11-30 81 views
13

我使用R中的「柵格」包創建了一些柵格文件的地圖。我想創建比較柵格,並排顯示幾個地圖。對所有地圖使用的顏色比例都是相同的,無論每個地圖的值如何都很重要。例如,如果地圖1的值爲0-1,地圖2的值爲0-0.5,則值爲0.5的單元格在兩個地圖上應具有相同的顏色。如何創建R中具有相同色標的柵格圖R

例如:

  • 圖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)) 
+0

您最終使用的解決方案實際上是最佳答案。請把它作爲答案並接受!我幾乎錯過了 - 我不在一個問題中尋找答案。 – TMS 2013-08-26 08:09:41

+1

`spplot`爲所有圖層顯示一個具有全局圖例的`RasterStack`。 `raster`包爲`spplot`定義了一個方法,所以你不需要將`RasterStack`轉換爲`Spatial *`對象來使用它。 – 2013-08-28 22:44:25

回答

7

由於圖像::光柵函數指定該圖像::鹼參數可以被傳遞(並且表明圖像::基地可能會使用),你不會只是指定相同的col =和breaks =參數的所有調用image :: raster?你需要得到「同步」的休息和上校論據。顏色的數量需要少於中斷的數量。下面的例子是基於經典的火山數據和第二版本顯示瞭如何值的範圍可從圖像中排除:

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) 

一個具體的例子將有助於這一努力。

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