2011-07-28 43 views
8

¿Cómo puedo mejorar la leyenda del trazado del mapa de trama espacial utilizando ggplot en comparación con una leyenda de spplot()?¿Cómo mejorar un mapa de trama espacial utilizando ggplot en comparación con spplot?

me gustaría mapas espaciales de la trama utilizando ggplot() en lugar de ssplot() Sin embargo, hay algunas cosas que me gustaría mejorar en comparación con el spplot:

  1. crear una leyenda ggplot que va desde pequeño (abajo) a valores grandes (arriba)
  2. Tengan los saltos en la leyenda ggplot similares a la leyenda ssplot() para que sepa cuáles son los límites de cada color.

## 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() Resultado ssplot

ggplot() Resultado ggplot

+9

No utilice contrastes de color rojo-verde. El 5-10% de los hombres con debilidad de color rojo-verde los encontrarán [muy difícil de leer] (http://vischeck.homeip.net/uploads/131191118210660/). – hadley

+0

el enlace al sitio de Koske: ilustra más o menos lo que me gustaría hacer. Exploraré aún más la capacidad de ggplot(), ajustaré los colores, mejoraré la leyenda y publicaré una actualización a continuación. Todos los consejos/ejemplos son bienvenidos. Gracias – Janvb

Respuesta

5

gracias @joran por el puntero a eso.

aquí es un código de ejemplo y salida utilizando la versión dev:

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

que probablemente puede hacer esto mediante:

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

ACTUALIZADO:

aquí está las instrucciones para la instalación desde cero:

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

Lo probé pero me aparece el siguiente error: al compilar 'ggplot2_0.9.0.tar.gz' ERROR: la dependencia 'escalas' no está disponible para el paquete 'ggplot2', dice que las escalas no están disponibles para 2.13.0 ¿dónde puedo encontrarlo? Sería genial hacer leyendas como la de arriba. Estupendo. – Janvb

+0

Encontré escalas en github https://github.com/hadley/scales, ¿cuál es la mejor manera de instalar esto en R? – Janvb

+0

La respuesta se actualizó. prueba 'install_github (" scales ")'. si recibe errores como paquetes faltantes 'RColorBrewer, stringr, dicromat, munsell, plyr, colorspace', intente' install.packages (c ('RColorBrewer', 'stringr', 'dicromat', 'munsell', 'plyr' , 'espacio de color'), dep = TRUE) ' – kohske

4

No estoy seguro de cómo abordar (1) de la parte superior de la cabeza. Pero aquí hay algunas soluciones posibles para (2) y (3).

No creo que ggplot2 actualmente sea capaz de etiquetar la leyenda de esa manera. Sin embargo, Koske ha estado trabajando en algún código que se pueda incluir en el ggplot2 en el futuro que crea leyendas diseñadas de esta manera. Here es un enlace, aunque requerirá instalar algunos paquetes adicionales y solo es alfa.

Para obtener los descansos específicos que está buscando, intente esto:

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) 

que produjo este gráfico en mi máquina:

enter image description here

no he probado lo que este se vería como usar el código experimental mencionado anteriormente.

+0

La única forma en que puedo pensar para obtener una leyenda de alta a baja sin hackear las partes internas del código ggplot es convertir la escala en un factor con 'corte', asignar los colores a mano e invertir el orden de los niveles ... –

+0

gracias por el enlace también el sitio de Koske, eso es precisamente lo que me gustaría hacer con la leyenda de un mapa espacial de ggplot. Haré algunas pruebas y pronto publicaré un resultado final. – Janvb

+0

tenga en cuenta que los códigos están desactualizados. Encuentra esta publicación en la lista de ggplot2: http://groups.google.com/group/ggplot2/browse_thread/thread/1026e8bf330deca2 – kohske

0

Re: (2) Primeros cut() sus datos para obtener un conjunto de datos agrupada. Use las opciones breaks y labels en cut() para obtener las etiquetas correctas, p.:

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

Entonces puede trazar usando ggplot y el cambio de las etiquetas para que estén a la derecha en las boudaries de color usando:

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 

Ver también: Generating a color legend with shifted labels using ggplot2

Como alternativa, puede crear la leyenda del color con una secuencia de comandos externa (por ejemplo, GrADS crea lindas leyendas de colores con las secuencias de comandos correctas) y especifica los mismos colores manualmente en scale_fill_manual.

Cuestiones relacionadas