mappa termica ggplot2 con colors per valori a distanza

Voglio fare una heatmap in ggplot2. I miei dati e il codice del mio giocattolo sono:

set.seed(12345) dat <- data.frame( Row = rep(x = LETTERS[1:5], times = 10) , Col = rep(x = LETTERS[1:10], each = 5) , Y = rnorm(n = 50, mean = 0, sd = 1) ) library(ggplot2) p <- ggplot(data = dat, aes(x = Row, y = Col)) + geom_tile(aes(fill = Y), colour = "white") + scale_fill_gradient(low = "white", high = "steelblue") p 

Voglio avere uno schema di colors per valori a distanza come questo:

 -3 <= Y  Dark Blue -2 <= Y  Blue -1 <= Y  Light Blue 0 <= Y  Light Green 1 <= Y  Green 2 <= Y  Dark Green 

Qualsiasi aiuto sarà molto apprezzato. Grazie

Hai diverse opzioni per qualcosa di simile, ma qui è uno come punto di partenza.

Innanzitutto, usa il cut per creare un fattore da Y con gli intervalli appropriati:

 dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE) 

Quindi traccia usando una tavolozza da RColorBrewer :

 ggplot(data = dat, aes(x = Row, y = Col)) + geom_tile(aes(fill = Y1), colour = "white") + scale_fill_brewer(palette = "PRGn") 

inserisci la descrizione dell'immagine qui

Questa combinazione di colors è più viola del blu nella parte bassa, ma è la più vicina che ho trovato tra le palette della birra.

Se si voleva creare il proprio, si potrebbe semplicemente usare scale_fill_manual e specificare il vettore di colors desiderato per l'argomento values .

Non è chiaro se vuoi colors discreti o se i colors che elenchi sono solo indicatori lungo l’intervallo di Y Mostrerò entrambi

Per i colors discreti, usa Y1 come lo definisce joran

 dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE) 

Quindi puoi ottenere una trama con i colors specifici che elenchi utilizzando una scala manuale

 p <- ggplot(data = dat, aes(x = Row, y = Col)) + geom_tile(aes(fill = Y1)) + scale_fill_manual(breaks=c("\[-Inf,-3)", "\[-3,-2)", "\[-2,-1)", "\[-1,0)", "\[0,1)", "\[1,2)", "\[2,3)", "\[3, Inf)"), values = c("white", "darkblue", "blue", "lightblue", "lightgreen", "green", "darkgreen", "white")) p 

Non sapevo cosa volevi per i colors oltre -3 e 3, quindi ho usato il bianco.

Se si desidera un colore continuo, passando dal blu al negativo passando dal bianco allo 0 al verde del positivo, scale_fill_gradient2 funzionerebbe.

 ggplot(data = dat, aes(x = Row, y = Col)) + geom_tile(aes(fill = Y)) + scale_fill_gradient2(low="darkblue", high="darkgreen", guide="colorbar") 

inserisci la descrizione dell'immagine qui

Se vuoi un controllo preciso dei dettagli del colore, in modo che la mapping sia "darkblue" a 3, "blue" a 2, "lightblue" a 1, "white" a 0, ecc., Quindi scale_fill_gradientn funzionerà per te:

 library("scales") ggplot(data = dat, aes(x = Row, y = Col)) + geom_tile(aes(fill = Y)) + scale_fill_gradientn(colours=c("darkblue", "blue", "lightblue", "white", "lightgreen", "green", "darkgreen"), values=rescale(c(-3, -2, -1, 0, 1, 2, 3)), guide="colorbar")