Domanda

Sto creando alcune mappe da file raster utilizzando il pacchetto "raster" in R. Mi piacerebbe creare raster di confronto, che mostra diverse mappe fianco a fianco. E 'importante per questo che le scale di colore utilizzati sono gli stessi per tutte le mappe, indipendentemente dai valori di ogni mappa. Ad esempio, se la mappa 1 ha valori 0-1, e mappare 2 ha valori compresi tra 0-0,5, cellule con un valore di 0,5 dovrebbero avere lo stesso colore su entrambe le mappe.

Ad esempio:

  • mappa 1 ha valori da 0 a 1
  • Mappa 2 ha valori da 0 a 0,5
  • il colore va dal rosso (più basso) a verde (più alto)

Vorrei un valore di 0,5 per avere lo stesso colore in entrambe le mappe (cioè giallo, come a metà strada tra rosso e verde). Il comportamento attuale è che è giallo nella mappa 1, e verde in mappa 2.

Non riesco a trovare un modo per fare questo lavoro. Non riesco a vedere alcun modo per impostare l'intervallo di valori di pixel da utilizzare con la funzione di stampa. setMinMax () non aiuta (come 'plot' calcola sempre i valori). Anche cercando di impostare i valori a mano (ad esempio g1 @ @ dati max <- 10). Non funziona (questi sono ignorati durante la stampa)

Infine, facendo una pila di carte (che potrebbe essere previsto per trama tutto sulla stessa scala colore) non funziona nemmeno -. Ogni mappa ha ancora il proprio scala di colori

Ogni pensiero su come fare questo?

EDIT:

La soluzione che ho finito per usare è:

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

Soluzione

Dal momento che le specifica funzione di immagine :: raster che gli argomenti immagine :: base possono essere passati (e suggerisce che l'immagine :: base è probabilmente utilizzato), sarebbe non solo specificare lo stesso col = e pause = argomenti a tutti chiamate a immagine raster ::? do necessità di ottenere le pause e gli argomenti col "in sincronia". Il numero di bisogni colori da uno in meno del numero di interruzioni. L'esempio che segue si basa sui dati vulcano classici e il secondo mostra di versione come un intervallo di valori può essere esclusa da un'immagine:

 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)

Un esempio specifico potrebbe aiutare questo sforzo.

Altri suggerimenti

C'è più lavoro da fare qui in 'raster' ma qui è un hack:

 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)

È inoltre possibile utilizzare la funzione spplot (pacchetto sp)

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

È inoltre possibile inviare i valori per ggplot (la ricerca di archivi r-sig-geo per gli esempi) Se i collegamenti raster ad un file molto grande, si potrebbe prima fare, prima di andare a ggplot

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

e poi magari

m <- as.matrix(r)

Aggiunto come una risposta in risposta a @Tomas

La risposta che ho finito per usare è:

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

soluzione facile ora è quella di utilizzare l'opzione zlim.

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ),zlim=c(0,1) )

Non ha funzionato per me. Ho usato questo script per dividere la scala di colori e selezionare quello più adatto secondo i miei dati:

plot(d, col=rev(heat.colors(8, alpha = 1)), breaks = seq(0, 0.40, by = 0.05))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top