2014-07-19 10 views
5
v <- 2^(7:17) 
min_lon <- 6.164780 
max_lon <- 15.744857 
min_lat <- 47.228296 
max_lat <- 54.426407 
center_lon <- (min_lon + max_lon)/2 
center_lat <- (min_lat + max_lat)/2 

df <- data.frame(id = 1:sum(v)) 
df$T <- rep(paste("T", v, sep="_"), v) 
df$lon <- runif(sum(v),min_lon, max_lon) 
df$lat <- runif(sum(v),min_lat,max_lat) 

Fare una mappa termica con trasparenza = .. livello ..Heatmap trasparenza, colorazione e specificità che non soddisfano

gg_heatmap <- function(T){ 
    g <- ggmap(get_map(location=c(lat=center_lat, lon=center_lon), zoom=6, maptype="roadmap", source="google")) 
    g <- g + scale_fill_gradientn(colours=rev(rainbow(100, start=0, end=0.75))) 
    g <- g + stat_density2d(data=df[df$T == "T_1024",], aes(x = lon, y = lat,fill = ..level..,transparency=..level..), 
          size=1, bins=100, geom = 'polygon') 
    print(g) 
} 

system.time(gg_heatmap("T_1024")) 

enter image description here

Fare una mappa termica da alfa impostando = .05

gg_heatmap <- function(T){ 
    g <- ggmap(get_map(location=c(lat=center_lat, lon=center_lon), zoom=6, maptype="roadmap", source="google")) 
    g <- g + scale_fill_gradientn(colours=rev(rainbow(100, start=0, end=0.75))) 
    g <- g + stat_density2d(data=df[df$T == "T_1024",], aes(x = lon, y = lat,fill = ..level..), alpha=.05, 
          size=1, bins=100, geom = 'polygon') 
    print(g) 
} 

system.time(gg_heatmap("T_1024")) 

enter image description here

Entrambi i risultati non sono soddisfacenti. Preferirei vedere qualcosa come la seguente heatmap realizzata con QlikView e utilizzare lo stesso set di dati "T_1024".

enter image description here

ci sono tre aspetti che preferisco per la QV-versione:

  1. La trasparenza permette di vedere ancora la mappa sottostante ...
  2. ... mentre i colori sono ancora espressivi e non pallidi
  3. La colorazione consente di identificare più dettagli

Ho provato ad affrontare (1) sperimentando diversi modi di impostare il livello alfa in modo statico e relativo al livello .. Tuttavia, non sono riuscito a ottenere buoni risultati. La trasparenza non è mai veramente buona e se vedo la mappa i colori sono troppo pallidi.

(3) Ho pensato che potrei influenzare impostando un valore alto del contenitore.

Qualche idea su come ottimizzare il rendering della heatmap o almeno alcuni aspetti di esso?

+0

'transparency' è un argomento valido per' stat_density2d (...) '?? Perché non stai usando 'alpha = .. level..'? – jlhoward

risposta

7

Nota: credito a this post per la struttura di base della risposta.

Questo produce una heatmap in cui i contorni sono chiaramente distinti e la mappa sottostante è visibile. Le principali differenze al codice sono:

  1. rimossi size=... e bins=... argomenti. Non è necessario per size (non fa nulla qui).
  2. Sostituire transparency=..levels.. (che cos'è ??), con alpha=..levels...
  3. Aggiungi scale_alpha_continuous(...), impostazione dei limiti dell'intervallo in alfa e disattivazione della guida alfa.

.

library(ggplot2) 
library(ggmap) 
gg_heatmap <- function(){ 
    g <- ggmap(get_map(location=c(lat=center_lat, lon=center_lon), zoom=6, maptype="roadmap", source="google")) 
    g <- g + scale_fill_gradientn(colours=rev(rainbow(100, start=0, end=0.75))) 
    g <- g + stat_density2d(data=df[df$T == "T_1024",], aes(x = lon, y = lat,fill = ..level..,alpha=..level..), 
          geom = 'polygon') 
    g <- g + scale_alpha_continuous(guide="none",range=c(0,.4)) 
    print(g) 
} 
gg_heatmap() 

noti che ho usato set.seed(1) prima di creare df un esempio riproducibile. Dovrai aggiungere questo se vuoi la stessa trama.

EDIT Risposta al commento dell'OP.

stat_density2d(...) funziona definendo i contorni e disegnando i poligoni pieni per racchiuderli, quindi per definizione i contorni saranno "spigolosi". Se vuoi eliminare i contorni, probabilmente dovrai usare un approccio di piastrellatura. Sfortunatamente, ciò richiede il calcolo delle stime di densità kernal 2D fuori di ggplot:

gg_heatmap <- function(T){ 
    require(MASS) 
    require(ggplot2) 
    require(ggmap) 
    d <- with(df[df$T==T,], kde2d(lon,lat,h=c(1.5,1.5),n=100)) 
    d.df <- expand.grid(lon=d[[1]],lat=d[[2]]) 
    d.df$z <- as.vector(d$z) 
    g <- ggmap(get_map(location=c(lat=center_lat, lon=center_lon), zoom=6, maptype="roadmap", source="google")) 
    g <- g + scale_fill_gradientn(colours=rev(rainbow(100, start=0, end=0.75))) 
    g <- g + geom_tile(data=d.df, aes(x=lon,y=lat,fill=z),alpha=.8) 
    print(g) 
} 
gg_heatmap("T_1024") 

Dal punto di vista della visualizzazione dati, questa trama è nettamente inferiore al primo. Che sia "più carina" o meno è una questione di opinione.

+0

grazie mille per i tuoi approfondimenti. tuttavia con tutto il dovuto rispetto, signore, la vostra mappa termica sembra abbastanza brutta :) ottenere qualcosa di bello è centrale nella mia domanda. almeno riesco a vedere la mappa, ma non mi piace affatto la nervosità dei contorni. – Raffael

+0

È certamente * non * il mio obiettivo creare qualcosa che trovi "carino". L'obiettivo dovrebbe essere quello di creare una visualizzazione che trasmetta in modo più chiaro il contenuto delle informazioni nel set di dati. Vedi le mie modifiche. – jlhoward

+0

bene - ma dato che una heatmap è la visualizzazione di una funzione liscia di valore reale (la densità) una colorazione non tagliente non è solo più bella ma anche matematicamente più accurata. ma grazie per la spiegazione sul perché usare una geometria poligonale tende a dare un risultato più spigoloso. ma perché il secondo approccio più carino è inferiore rispetto a una prospettiva di dati virtuali che sono ancora curioso di conoscere. – Raffael