Generando mapas de calor de densidad visualmente atractivos en R

27

Si bien sé que hay una serie de funciones para generar mapas de calor en R, el problema es que no puedo producir mapas visualmente atractivos. Por ejemplo, las imágenes a continuación 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. Ambas gráficas han sido generadas por la función de densidad () en el paquete spatstat R.

¿Cómo puedo obtener más "flujo" en mis parcelas? Lo que busco es más del aspecto que pueden producir los resultados del software comercial SpatialKey ( captura de pantalla ).

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

ingrese la descripción de la imagen aquí

Figaro
fuente
¿Has mirado la función image ()? Aumentar el número de descansos aumenta la resolución.
Macro

Respuestas:

28

Hay dos cosas que afectarán la suavidad de la trama, el ancho de banda utilizado para la estimación de la densidad del núcleo y los saltos a los que asigna colores en la trama.

En mi experiencia, para el análisis exploratorio solo ajusto el ancho de banda hasta obtener una gráfica ú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))

ingrese la descripción de la imagen aquí

Simplemente cambiar el esquema de color predeterminado no ayudará a nada, ni tampoco cambiará la resolución de los píxeles (en todo caso, la resolución predeterminada es demasiado precisa, y debe reducir la resolución y hacer que los píxeles sean más grandes). Aunque es posible que desee cambiar el esquema de color predeterminado con fines estéticos, se pretende que sea muy discriminatorio.

Lo que puede hacer para ayudar al color es cambiar el nivel de escala a logaritmos (en realidad solo ayudará si tiene un proceso muy poco homogéneo), cambiar la paleta de colores para variar más en el extremo inferior (sesgo en términos de la especificación de la rampa de color en R), o ajuste la leyenda para tener bins discretos en lugar de continuos.

Ejemplos de sesgo en la leyenda adaptados de aquí , y tengo otra publicación en el sitio SIG que explica cómo colorear los contenedores discretos en un ejemplo bastante simple aquí . Sin embargo, esto no ayudará si el patrón se suaviza demasiado o menos 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))

ingrese la descripción de la imagen aquí


Para hacer que los colores sean transparentes en la última imagen (donde el primer contenedor de color es blanco) uno puede generar la rampa de color y luego reemplazar la especificación RGB con colores transparentes. Ejemplo a continuación 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)

ingrese la descripción de la imagen aquí

Andy W
fuente
Gracias, respuesta muy claramente resentida. Esto combinado con el comando "spatstat.options (npixel = c (100,100))" al que alineaste hizo el truco. Si puedo molestarte un poco más: ¿Sabes cómo puedo hacer que el color de "fondo" sea transparente?
Figaro
1
@Figaro, he actualizado con un ejemplo de hacer que los colores sean semitransparentes.
Andy W
Gracias. Una cosa más. Si bien esto podría estar ligeramente fuera de tema: ¿Cómo exporto estos mapas de calor a un archivo Shape? ¿O debo tratarlos solo como rásteres?
Figaro
Nunca he tenido que hacer eso, así que no puedo decirlo de improviso. Probablemente sea una buena pregunta para los gurús R en stackoverflow.
Andy W
¿Se puede presentar un mapa de calor como algo más que un ráster?
Figaro
2

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 su ejemplo vinculado, necesitaría interpolar a una cuadrícula bastante fina (quizás con los argumentos xo y yo con una longitud de ~ 1000). Esto le dará una nueva matriz que puede trazar con image (). Si desea transparencia, esto requerirá un trabajo adicional. No es fácil hacerlo con una paleta de colores, por lo que puede terminar trazando cada cuadrícula como un polígono con un color asignado.

Marc en la caja
fuente
¿Tienes experiencia en la creación de la transparencia? ¿Hay ejemplos? Ese sería el siguiente paso.
Figaro
¿Cómo creo los valores x, y, z necesarios para el interp ()? Por ejemplo, si la densidad () usa una cuadrícula de 100x100, tengo los valores z para cada punto, pero no tengo las x & y en el formato vectorial requerido (solo tengo las coordenadas de los ejes).
Figaro
Hice un bucle para obtener los pares de coordenadas, pero ¿hay alguna función para esto?
Figaro
2
Parece que la imagen puede aceptar colores transparentes después de todo. Ver: menugget.blogspot.de/2012/04/… . En caso de que aún desee usar interp, puede generar sus combinaciones de coordenadas xy para sus niveles z con: "grid <- expand.grid (x = x, y = y)"
Marc en el cuadro
1

Es posible que desee ver en ggplot2. Parece que el paquete que ha probado no tiene excelentes esquemas de color o "flujo", eche un vistazo a RColorBrewer. Hay un blog donde implementó estos paquetes con un simple ejemplo.

No estoy seguro de si está tratando de trazar datos geográficos como se muestra en su ejemplo vinculado, pero si lo hace, sé que Google ofrece la "Guía para desarrolladores de Static Maps API V2" y puede combinar Google y R con un paquete llamado RgoogleMaps .

Buena suerte con tu investigación.

Conocer
fuente
Lo siento si no estaba claro, pero en este momento el problema no es el esquema de color en sí. Sin embargo, probé RColorBrewer más temprano hoy: ¡un pequeño paquete genial! Son datos espaciales, no estoy seguro de querer usar las API de Google, pero podría echar un vistazo.
Figaro
0

¿Has intentado poner en marcha la resolución density? Intentar argumento dimyx=c(512, 512)o superior.

Wayne
fuente