Génération de cartes thermiques de densité visuellement attrayantes dans R


27

Bien que je sache qu'il existe une série de fonctions pour générer des cartes thermiques dans R, le problème est que je ne peux pas produire de cartes visuellement attrayantes. Par exemple, les images ci-dessous sont de bons exemples de cartes thermiques que je veux éviter. Le premier manque clairement de détails, tandis que l'autre (basé sur les mêmes points) est trop détaillé pour être utile. Les deux tracés ont été générés par la fonction densité () dans le package spatstat R.

Comment puis-je obtenir plus de "flux" dans mes parcelles? Ce que je vise, c'est davantage l'aspect que les résultats du logiciel commercial SpatialKey ( capture d'écran ) sont capables de produire.

Des astuces, des algorithmes, des packages ou des lignes de code qui pourraient me conduire dans cette direction?

entrez la description de l'image ici


avez-vous regardé la fonction image ()? L'augmentation du nombre de pauses augmente la résolution.
Macro

Réponses:


28

Il y a deux choses qui auront un impact sur la fluidité du tracé, la bande passante utilisée pour votre estimation de densité de noyau et les coupures auxquelles vous affectez des couleurs dans le tracé.

D'après mon expérience, pour l'analyse exploratoire, j'ajuste simplement la bande passante jusqu'à ce que j'obtienne un tracé utile. Démonstration ci-dessous.

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

entrez la description de l'image ici

Changer simplement le jeu de couleurs par défaut n'aidera pas du tout, ni changera la résolution des pixels (si quoi que ce soit, la résolution par défaut est trop précise, et vous devriez réduire la résolution et agrandir les pixels). Bien que vous souhaitiez peut-être modifier le jeu de couleurs par défaut à des fins esthétiques, il est censé être très discriminant.

Les choses que vous pouvez faire pour aider la couleur sont de changer le niveau d'échelle en logarithmes (cela n'aidera vraiment que si vous avez un processus très inhomogène), modifiez la palette de couleurs pour varier davantage à l'extrémité inférieure (biais en termes de spécification de la rampe de couleur dans R), ou ajustez la légende pour avoir des bacs discrets au lieu de continus.

Exemples de biais dans la légende adaptée d' ici , et j'ai un autre post sur le site SIG expliquant la coloration des bacs discrets dans un exemple assez simple ici . Cela n'aidera pas si le motif est plus ou moins bien lissé pour commencer.

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

entrez la description de l'image ici


Pour rendre les couleurs transparentes dans la dernière image (où le premier bac de couleur est blanc), il suffit de générer la rampe de couleurs, puis de remplacer la spécification RVB par des couleurs transparentes. Exemple ci-dessous utilisant les mêmes données que ci-dessus.

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)

entrez la description de l'image ici


Merci, réponse très clairement ressentie. Ceci combiné avec la commande "spatstat.options (npixel = c (100,100))" que vous avez aligné a fait l'affaire. Si je peux vous déranger encore plus: Savez-vous comment je peux rendre la couleur "d'arrière-plan" transparente?
Figaro

1
@Figaro, j'ai mis à jour avec un exemple de rendre les couleurs semi-transparentes.
Andy W

Merci. Encore une chose. Bien que cela puisse être légèrement hors sujet: Comment exporter ces heatmaps dans un fichier Shape? Ou dois-je les traiter uniquement comme des rasters?
Figaro

Je n'ai jamais eu à faire ça, donc je ne peux pas le dire à la légère. Probablement une bonne question pour le gourou R sur stackoverflow.
Andy W

Une carte thermique peut-elle être présentée autrement que comme un raster?
Figaro

2

Vous pouvez bénéficier de la fonction interp du package akima. Cela vous permettra d'interpoler votre matrice vers une autre résolution si nécessaire. Pour créer quelque chose comme votre exemple lié, vous devez interpoler sur une grille assez fine (peut-être avec les arguments xo et yo d'une longueur de ~ 1000). Cela vous donnera une nouvelle matrice que vous pouvez tracer avec image (). Si vous voulez de la transparence, cela demandera un travail supplémentaire. Ce n'est pas facile de le faire avec une palette de couleurs, vous devrez donc finir par tracer chaque grille comme un polygone avec une couleur assignée.


Avez-vous de l'expérience dans la création de la transparence? Y a-t-il des exemples? Ce serait la prochaine étape.
Figaro

Comment créer les valeurs x, y, z nécessaires pour l'interp ()? Par exemple, si la densité () utilise une grille 100x100, j'ai les valeurs z pour chaque point, mais je n'ai pas le x & y dans le format vectoriel requis (je n'ai que les coordonnées des essieux).
Figaro

Vous avez fait une boucle pour obtenir les paires de coordonnées, mais y a-t-il une fonction pour cela?
Figaro

2
On dirait que l'image peut accepter des couleurs transparentes après tout. Voir: menugget.blogspot.de/2012/04/… . Dans le cas où vous souhaitez toujours utiliser interp, vous pouvez générer vos combinaisons de coordonnées xy pour vos niveaux z avec: "grid <- expand.grid (x = x, y = y)"
Marc dans la case

1

Vous voudrez peut-être examiner ggplot2. Il semble que le package que vous avez essayé n'ait pas de superbes couleurs ou "flux" - jetez un œil à RColorBrewer. Il y a un blog où il a implémenté ces packages avec un exemple simple.

Je ne sais pas si vous essayez de tracer des données géographiques comme indiqué dans votre exemple lié, mais si vous le savez, je sais que Google propose le "Guide du développeur Static Maps API V2" et vous pouvez combiner Google et R avec un package appelé, RgoogleMaps .

Bonne chance dans vos recherches.


Désolé si je n'ai pas été clair, mais pour l'instant, le problème n'est pas le jeu de couleurs lui-même. J'ai cependant essayé RColorBrewer plus tôt dans la journée: un super petit pacakge! Ce sont des données spatiales, je ne suis pas sûr de vouloir utiliser les API Google, mais je pourrais y jeter un œil.
Figaro

0

Avez-vous essayé d'augmenter la résolution density? Essayez l'argument dimyx=c(512, 512)ou plus.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.