2011-07-28 51 views
8

與spplot()圖例相比,如何使用ggplot改進空間柵格圖圖的圖例?與spplot相比,如何使用ggplot改進空間柵格圖?

我想用ggplot情節空間地圖(),而不是ssplot(),然而還有比spplot的時候,我想提高几件事情:

  1. 創建ggplot傳說,從去小(底部)到較大值(頂部)
  2. 在ggplot圖例中有類似於ssplot()圖例的中斷,以便我知道每種顏色的邊界是什麼。

## load packages 
require(raster) 
require(ggplot2) 
require(rgdal) 
require(RColorBrewer) 
set.seed(1) 

r <- raster(xmn=-110, xmx=-90, ymn=40, ymx=60, ncols=40, nrows=40, 
      crs="+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100 
+ellps=WGS84") 
r <- setValues(r,matrix(rnorm(1600, mean=0.4,sd=0.2))) 

## 1. spatial map with spplot 
cuts <-seq(minValue(r),maxValue(r),length.out=8) 
cuts = round(cuts,digits=2) 
col.regions = brewer.pal(length(cuts)+3-1, "RdYlGn") 
print( 
spplot(as(r, 'SpatialGridDataFrame'),at=cuts, 
col.regions=col.regions, 
colorkey=list(labels=list(at=cuts),at=cuts), pretty=TRUE, 
scales=list(draw=T) 
) 
) 

## 2. spatial map with ggplot 
p = rasterToPoints(r); df = data.frame(p) 
colnames(df) = c("x", "y", "NDVI") 

p <- ggplot(data=df) + geom_tile(aes(x, y, fill=NDVI)) + 
coord_equal() + labs(x=NULL, y=NULL) + 
scale_fill_gradient2(low="red", mid="yellow",high="green", 
limits=c(minValue(r),maxValue(r)), midpoint = 0.4) + theme_bw() + 
scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0)) 
print(p) 

ssplot()導致 ssplot

ggplot()導致 ggplot

+9

請不要使用紅綠對比。 5-10%的紅綠色弱點男性會發現[非常難讀](http://vischeck.homeip.net/uploads/131191118210660/)。 – hadley

+0

鏈接到Koske的網站 - 說明了我想要做的或多或少的事情。我將進一步探索ggplot()容量,調整顏色,改進圖例並在下面發佈更新。所有提示/例子都歡迎。謝謝 – Janvb

回答

5

感謝@joran的指針。

這裏是使用開發版本的示例代碼和輸出:

br <- seq(min(df$NDVI), max(df$NDVI), len=8) 

ggplot(data=df) + 
    geom_tile(aes(x, y, fill=NDVI)) + 
    scale_fill_gradient(low="red", high="green", 
    breaks=br, labels=sprintf("%.02f", br), 
    guide=guide_colorbar(title=NULL, nbin=100, barheight=unit(0.75, "npc"), label.hjust=1)) + 
    scale_x_continuous(expand=c(0,0)) + 
    scale_y_continuous(expand=c(0,0)) 

enter image description here

你或許可以試試這個:

# from Hadley's instruction 
install.packages("devtools") 
library(devtools) 
dev_mode() # to avoid interfering with your existing install 
install_github("ggplot2", username="kohske", branch = "feature/new-guides-with-gtable") 
library(ggplot2) 

更新:

這裏從頭開始安裝指導:

install.packages(
    c('devtools', 'digest', 'memoise', 'plyr', 'reshape2', 'RColorBrewer', 'stringr', 'dichromat', 'munsell', 'plyr', 'colorspace'), 
    dep=TRUE) 

library(devtools) 
dev_mode() 

install_github("scales") 
install_github("ggplot2", username="kohske", branch = "feature/new-guides-with-gtable") 
+0

我剛剛嘗試過,但出現以下錯誤:建立'ggplot2_0.9.0.tar.gz'時, 錯誤:依賴'scale'不能用於包'ggplot2',它說scale不可用於2.13.0,我可以在哪裏找到它?製作像上面這樣的傳奇是很棒的。大。 – Janvb

+0

我在github https://github.com/hadley/scales上發現了尺度,在R中安裝這個最好的方法是什麼? – Janvb

+0

答案已更新。嘗試'install_github(「scale」)'。如果你遇到錯誤,比如丟失了包'RColorBrewer,stringr,dichromat,munsell,plyr,colorspace',然後嘗試'install.packages(c('RColorBrewer','stringr','dichromat','munsell','plyr' ,'colorspace'),dep = TRUE)' – kohske

4

我不知道如何解決(1)從我的頭頂。但是對於(2)和(3),這裏有一些可能的解決方案。

我不認爲ggplot2目前能夠以這種方式標記圖例。然而,Koske一直在研究一些代碼,這些代碼可能會在未來編入ggplot2,創建以這種方式設計的傳奇。 Here是一個鏈接,但它將需要安裝一些額外的軟件包,並且只是alpha。

爲了得到你正在尋找具體的休息,試試這個:

br <- c(-0.25,-0.05,0.15,0.35,0.56,0.76,0.96,1.16) 
p <- ggplot(data=df) + geom_tile(aes(x, y, fill=NDVI)) + 
coord_equal() + labs(x=NULL, y=NULL) + 
scale_fill_gradient(low="red", mid="yellow",high="green", 
breaks = br) + theme_bw() + 
scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0)) 
print(p) 

它生產我的機器上這個圖:

enter image description here

我沒有測試過這是什麼會看比如使用上面提到的實驗代碼。

+0

我可以考慮的唯一方法就是在不破壞ggplot代碼的內部的情況下獲得一個高到低的圖例,就是通過'cut'將縮放比例放入一個因子中,用手指定顏色,並顛倒水平... –

+0

謝謝你的鏈接也Koske網站,這正是我想要做的與ggplot空間地圖的傳說。我會做一些測試,很快就會發布最終結果。 – Janvb

+0

請注意,代碼已過時。請將此帖發送到ggplot2列表中:http://groups.google.com/group/ggplot2/browse_thread/thread/1026e8bf330deca2 – kohske

0

回覆:(2) 第一個cut()你的數據得到一個binned數據集。使用cut()中的breakslabels選項可獲得正確的標籤,例如::

scale_fill_manual (your options...) + guides(fill=guide_legend(label.vjust = 1.2)) #1.2= what fits your legend best. Use label.hjust if using an horizontal color bar 

參見:

dat$col <- cut(
    df$NDVI, 
    breaks=c(-Inf, -0.25, 0.05, ...whatever..., Inf), 
    labels=c(-0.25, 0.05, ...whatever..., "") 
) 

然後你就可以讓他們使用是正確的色彩學邊界使用ggplot和轉移標籤繪製 Generating a color legend with shifted labels using ggplot2

或者,您可以創建帶有外部腳本的顏色圖例(例如,GrADS使用正確的腳本創建出色的圖例),並在scale_fill_manual中手動指定相同的顏色。

相關問題