Generazione di mappe termiche di densità visivamente attraenti in R


27

Mentre so che ci sono una serie di funzioni per generare mappe di calore in R, il problema è che non sono in grado di produrre mappe visivamente attraenti. Ad esempio, le immagini seguenti sono buoni esempi di mappe di calore che voglio evitare. Il primo è chiaramente privo di dettagli, mentre l'altro (basato sugli stessi punti) è troppo dettagliato per essere utile. Entrambi i grafici sono stati generati dalla funzione densità () nel pacchetto spazstat R.

Come posso ottenere più "flusso" nelle mie trame? Quello a cui sto puntando è più dell'aspetto che i risultati del software commerciale SpatialKey ( screenshot ) sono in grado di produrre.

Qualche suggerimento, algoritmo, pacchetto o riga di codice che potrebbe portarmi in questa direzione?

inserisci qui la descrizione dell'immagine


hai visto la funzione image ()? Aumentando il numero di pause aumenta la risoluzione.
Macro,

Risposte:


28

Ci sono due cose che influenzeranno la fluidità della trama, la larghezza di banda utilizzata per la stima della densità del kernel e le interruzioni alle quali si assegnano i colori nella trama.

Nella mia esperienza, per l'analisi esplorativa ho appena regolato la larghezza di banda fino a quando non ho ottenuto una trama utile. Dimostrazione di seguito.

library(spatstat)
set.seed(3)
X <- rpoispp(10)
par(mfrow = c(2,2))
plot(density(X, 1))
plot(density(X, 0.1))
plot(density(X, 0.05))
plot(density(X, 0.01))

inserisci qui la descrizione dell'immagine

La semplice modifica della combinazione di colori predefinita non sarà di alcun aiuto, né cambierà la risoluzione dei pixel (semmai la risoluzione predefinita è troppo precisa e dovresti ridurre la risoluzione e ingrandire i pixel). Anche se potresti voler cambiare la combinazione di colori predefinita per scopi estetici, è inteso per essere altamente discriminante.

Le cose che puoi fare per aiutare il colore a cambiare il livello di scala in logaritmi (aiuterà davvero solo se hai un processo molto inomogeneo), cambiare la tavolozza dei colori per variare maggiormente all'estremità inferiore (distorsione in termini di specifiche della rampa di colore in R) oppure regola la legenda in modo da disporre di contenitori discreti anziché continui.

Esempi di pregiudizi nella leggenda adattati da qui , e ho un altro post sul sito GIS che spiega come colorare i contenitori discreti in un esempio piuttosto semplice qui . Questi non aiuteranno però se il motivo è sopra o sotto levigato anche se per cominciare.

Z <- density(X, 0.1)
logZ <- eval.im(log(Z))
bias_palette <- colorRampPalette(c("blue", "magenta", "red", "yellow", "white"), bias=2, space="Lab")
norm_palette <- colorRampPalette(c("white","red"))
par(mfrow = c(2,2))
plot(Z)
plot(logZ)
plot(Z, col=bias_palette(256))
plot(Z, col=norm_palette(5))

inserisci qui la descrizione dell'immagine


Per rendere trasparenti i colori nell'ultima immagine (dove il primo contenitore dei colori è bianco) è possibile generare semplicemente la scala dei colori e quindi sostituire la specifica RGB con colori trasparenti. Esempio sotto usando gli stessi dati di cui sopra.

library(spatstat)
set.seed(3)
X <- rpoispp(10)
Z <- density(X, 0.1)
A <- rpoispp(100) #points other places than density


norm_palette <- colorRampPalette(c("white","red"))
pal_opaque <- norm_palette(5)
pal_trans <- norm_palette(5)
pal_trans[1] <- "#FFFFFF00" #was originally "#FFFFFF" 

par(mfrow = c(1,3))
plot(A, Main = "Opaque Density")
plot(Z, add=T, col = pal_opaque)
plot(A, Main = "Transparent Density")
plot(Z, add=T, col = pal_trans)


pal_trans2 <- paste(pal_opaque,"50",sep = "")
plot(A, Main = "All slightly transparent")
plot(Z, add=T, col = pal_trans2)

inserisci qui la descrizione dell'immagine


Grazie, risposta chiaramente risentita. Questo combinato con il comando "spatstat.options (npixel = c (100.100))" con cui hai allineato ha fatto il trucco. Se posso disturbarti ancora: sai come posso rendere trasparente il colore di "sfondo"?
Figaro,

1
@Figaro, ho aggiornato con un esempio di rendere i colori semi-trasparenti.
Andy W

Grazie. Un'altra cosa. Anche se questo potrebbe essere leggermente fuori tema: come posso esportare queste mappe di calore in un file Shape? O sono tenuto a trattarli solo come raster?
Figaro,

Non ho mai dovuto farlo, quindi non posso dirlo con disinvoltura. Probabilmente una buona domanda per i Guru su StackOverflow.
Andy W

Una mappa di calore può essere presentata come qualcosa di diverso da un raster?
Figaro,

2

Puoi trarre vantaggio dalla funzione interp dal pacchetto akima. Questo ti permetterà di interpolare la tua matrice ad un'altra risoluzione, se necessario. Per creare qualcosa come il tuo esempio collegato, dovresti interpolare una griglia piuttosto fine (forse con gli argomenti xo e yo di lunghezza ~ 1000). Questo ti darà una nuova matrice che puoi tracciare con image (). Se si desidera la trasparenza, ci vorrà del lavoro aggiuntivo. Non è facile farlo con una tavolozza di colori, quindi potresti finire per dover tracciare ogni griglia come un poligono con un colore assegnato.


Hai esperienza con la creazione della trasparenza? Ci sono esempi? Quello sarebbe il prossimo passo.
Figaro,

Come posso creare i valori x, y, z necessari per l'interp ()? Ad esempio, se density () utilizza una griglia 100x100, ho i valori z per ciascun punto, ma non ho x & y nel formato vettoriale richiesto (ho solo le coordinate degli assi).
Figaro,

Crea un ciclo per ottenere le coppie di coordinate, ma esiste una funzione per questo?
Figaro,

2
Sembra che l'immagine possa accettare colori trasparenti dopo tutto. Vedi: menugget.blogspot.de/2012/04/… . Se vuoi ancora usare interp, puoi generare le tue combinazioni di coordinate xy per i tuoi livelli z con: "grid <- expand.grid (x = x, y = y)"
Marc nella casella

1

Potresti voler esaminare ggplot2. Sembra che il pacchetto che hai provato non abbia una grande combinazione di colori o "flusso" - dai un'occhiata a RColorBrewer. C'è un blog in cui ha implementato questi pacchetti con un semplice esempio.

Non sono sicuro se stai cercando di tracciare i dati geografici come mostrato nell'esempio collegato, ma se lo fai so che Google offre "Guida per sviluppatori dell'API V2 di mappe statiche" e puoi combinare Google e R con un pacchetto chiamato, RgoogleMaps .

Buona fortuna con la tua ricerca.


Scusate se non ero chiaro, ma in questo momento il problema non è la combinazione di colori in sé. Tuttavia, ho provato RColorBrewer prima di oggi: un piccolo grande pacakge! Sono dati spaziali, non sono sicuro di voler utilizzare le API di Google, ma potrei dare un'occhiata.
Figaro,

0

Hai provato ad aumentare la risoluzione density? Prova argomento dimyx=c(512, 512)o superiore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.