28 votos

Generación de mapas de calor de densidad visualmente atractivos en R

Aunque sé que hay una serie de funciones para generar mapas de calor en R, el problema es que soy incapaz de producir mapas visualmente atractivos. Por ejemplo, las imágenes de abajo son buenos ejemplos de mapas de calor que quiero evitar. El primero carece claramente de detalles, mientras que el otro (basado en los mismos puntos) es demasiado detallado para ser útil. Ambos gráficos han sido generados por la función density() del programa spatstat Paquete R.

¿Cómo puedo conseguir más "flujo" en mis parcelas? Lo que pretendo es que se vean más los resultados del comercial SpatialKey ( captura de pantalla ) es capaz de producir.

¿Alguna pista, algoritmo, paquete o línea de código que pueda llevarme en esta dirección?

enter image description here

28voto

Judioo Puntos 625

Hay dos cosas que afectarán a la suavidad del gráfico: el ancho de banda utilizado para la estimación de la densidad del núcleo y los cortes que se asignan a los colores en el gráfico.

En mi experiencia, para el análisis exploratorio simplemente ajusto el ancho de banda hasta que obtengo un gráfico útil. Demostración a continuación.

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

enter image description here

El simple hecho de cambiar la combinación de colores por defecto no ayudará en nada, ni tampoco cambiar la resolución de los píxeles (en todo caso, la resolución por defecto es demasiado precisa, y debería reducir la resolución y hacer los píxeles más grandes). Aunque es posible que quieras cambiar el esquema de colores por defecto por motivos estéticos, está pensado para ser muy discriminante.

Las cosas que puedes hacer para ayudar al color son cambiar el nivel de la escala a logaritmos (realmente sólo ayudará si tienes un muy proceso no homogéneo), cambiar la paleta de colores para que varíe más en el extremo inferior (sesgo en términos de la especificación de la rampa de color en R), o ajustar la leyenda para que tenga bins discretos en lugar de continuos.

Ejemplos de sesgo en la leyenda adaptada de aquí Y tengo otro post en el sitio de GIS que explica la coloración de los recipientes discretos en un ejemplo bastante simple aquí . Sin embargo, esto no servirá de nada si el patrón está demasiado o poco alisado para empezar.

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

enter image description here


Para hacer que los colores sean transparentes en la última imagen (donde el primer bin de color es blanco) se puede simplemente generar la rampa de color y luego reemplazar la especificación RGB con colores transparentes. Ejemplo abajo usando los mismos datos que arriba.

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)

enter image description here

2voto

Jake Puntos 3853

Puede beneficiarse de la función interp del paquete akima. Esto le permitirá interpolar su matriz a otra resolución si es necesario. Para hacer algo como tu ejemplo vinculado, tendrías que interpolar a una cuadrícula bastante fina (quizás con los argumentos xo y yo siendo ~ 1000 de longitud). Esto le dará una nueva matriz que puede trazar con image(). Si quieres transparencia, esto requerirá algo de trabajo adicional. No es fácil hacerlo con una paleta de colores, así que puede terminar teniendo que trazar cada cuadrícula como un polígono con un color asignado.

1voto

Alex Puntos 166

Puede que quieras buscar en ggplot2. Parece que el paquete que has probado no tiene un gran esquema de colores o "flujo" -- echa un vistazo a RColorBrewer. Hay un blog donde implementó estos paquetes con un sencillo ejemplo.

No estoy seguro de si estás tratando de trazar datos geográficos como se muestra en tu ejemplo vinculado, pero si lo haces sé que Google ofrece "Static Maps API V2 Developer Guide" y puedes combinar Google y R con un paquete llamado, RgoogleMaps.

Buena suerte con su investigación.

0voto

Loren Pechtel Puntos 2212

¿Has probado a subir la resolución en density ? Prueba el argumento dimyx=c(512, 512) o superior.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X