Erstellen von visuell ansprechenden Dichte-Heatmaps in R

27

Obwohl ich weiß, dass es in R eine Reihe von Funktionen zum Generieren von Wärmekarten gibt, besteht das Problem darin, dass ich keine optisch ansprechenden Karten erstellen kann. Die folgenden Bilder sind beispielsweise gute Beispiele für Heatmaps, die ich vermeiden möchte. Dem ersten fehlt es eindeutig an Details, während das andere (basierend auf denselben Punkten) zu detailliert ist, um nützlich zu sein. Beide Diagramme wurden mit der density () - Funktion im spatstat R-Paket erstellt.

Wie kann ich mehr "fließen" in meine Grundstücke? Was ich anstrebe, ist mehr das Aussehen, das die Ergebnisse der kommerziellen SpatialKey- Software ( Screenshot ) erzeugen können.

Irgendwelche Hinweise, Algorithmen, Pakete oder Codezeilen, die mich in diese Richtung führen könnten?

Bildbeschreibung hier eingeben

Figaro
quelle
hast du dir die image () funktion angeschaut? Durch Erhöhen der Anzahl der Pausen wird die Auflösung erhöht.
Makro

Antworten:

28

Es gibt zwei Faktoren, die sich auf die Glätte des Diagramms auswirken, die Bandbreite, die für die Schätzung der Kerneldichte verwendet wird, und die Unterbrechungen, denen Sie Farben im Diagramm zuweisen.

Meiner Erfahrung nach passe ich für eine explorative Analyse nur die Bandbreite an, bis ich ein nützliches Diagramm erhalte. Demonstration unten.

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

Bildbeschreibung hier eingeben

Das einfache Ändern des Standardfarbschemas hilft weder, noch ändert es die Auflösung der Pixel (wenn die Standardauflösung zu genau ist, sollten Sie die Auflösung reduzieren und die Pixel vergrößern). Obwohl Sie das Standardfarbschema aus ästhetischen Gründen möglicherweise ändern möchten, ist es sehr diskriminierend.

Was Sie tun können, um die Farbe zu verbessern, ist, die Skalierungsstufe in Logarithmen zu ändern (dies ist nur dann hilfreich, wenn Sie einen sehr inhomogenen Prozess haben). Ändern Sie die Farbpalette so, dass sie am unteren Ende stärker variiert (Abweichung in Bezug auf die Farbverlaufsspezifikation in R), oder passen Sie die Legende so an, dass sie diskrete Fächer anstelle von fortlaufenden Fächern enthält.

Beispiele für Bias in der Legende angepasst von hier , und ich habe eine andere Stelle auf der GIS - Website erklärt die diskreten Bins in einem ziemlich einfachen Beispiel Färbung hier . Dies hilft jedoch nicht, wenn das Muster zu Beginn über- oder untergeglättet ist.

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

Bildbeschreibung hier eingeben


Um die Farben im letzten Bild transparent zu machen (wobei das erste Farbfach Weiß ist), können Sie einfach den Farbverlauf generieren und dann die RGB-Spezifikation durch transparente Farben ersetzen. Beispiel unten mit den gleichen Daten wie oben.

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)

Bildbeschreibung hier eingeben

Andy W
quelle
Vielen Dank, sehr deutlich ärgerliche Antwort. Dies kombiniert mit dem Befehl "spatstat.options (npixel = c (100,100))", mit dem Sie den Trick ausgeführt haben. Wenn ich Sie noch mehr stören kann: Wissen Sie, wie ich die "Hintergrund" -Farbe transparent machen kann?
Figaro
1
@Figaro, ich habe mit einem Beispiel aktualisiert, das die Farben halbtransparent macht.
Andy W
Vielen Dank. Eine Sache noch. Dies ist möglicherweise ein wenig ungewöhnlich: Wie exportiere ich diese Heatmaps in eine Shape-Datei? Oder muss ich sie nur als Raster behandeln?
Figaro
Ich musste das nie tun, daher kann ich das nicht ohne weiteres sagen. Wahrscheinlich eine gute Frage für den R-Guru zum Stackoverflow.
Andy W
Kann eine Heatmap als etwas anderes als ein Raster dargestellt werden?
Figaro
2

Sie können von der Interp-Funktion aus dem Akima-Paket profitieren. Auf diese Weise können Sie Ihre Matrix bei Bedarf auf eine andere Auflösung interpolieren. Um so etwas wie Ihr verknüpftes Beispiel zu erstellen, müssten Sie in ein ziemlich feines Raster interpolieren (möglicherweise mit den Argumenten xo und yo, die eine Länge von ~ 1000 haben). Dadurch erhalten Sie eine neue Matrix, die Sie mit image () zeichnen können. Wenn Sie Transparenz wünschen, sind einige zusätzliche Arbeiten erforderlich. Mit einer Farbpalette ist dies nicht einfach. Daher müssen Sie möglicherweise jedes Raster als Polygon mit einer zugewiesenen Farbe zeichnen.

Marc in der Kiste
quelle
Haben Sie Erfahrung mit der Schaffung der Transparenz? Gibt es Beispiele? Das wäre der nächste Schritt.
Figaro
Wie erstelle ich die für interp () benötigten x-, y- und z-Werte? Wenn beispielsweise density () ein 100x100-Gitter verwendet, habe ich die z-Werte für jeden Punkt, aber ich habe nicht die x & y im erforderlichen Vektorformat (ich habe nur die Koordinaten der Achsen).
Figaro
Machte eine Schleife, um die Koordinatenpaare zu erhalten, aber gibt es eine Funktion dafür?
Figaro
2
Sieht so aus, als ob das Bild schließlich transparente Farben annehmen kann. Siehe: menugget.blogspot.de/2012/04/… . Falls Sie immer noch interp verwenden möchten, können Sie Ihre xy-Koordinatenkombinationen für Ihre z-Ebenen generieren mit: "grid <- expand.grid (x = x, y = y)"
Marc in der Box
1

Vielleicht möchten Sie in ggplot2 suchen. Es scheint, dass das Paket, das Sie ausprobiert haben, keine großartigen Farbschemata oder "Flüsse" aufweist - werfen Sie einen Blick auf RColorBrewer. Es gibt einen Blog, in dem dieses Paket mit einem einfachen Beispiel implementiert wurde.

Ich bin mir nicht sicher, ob Sie versuchen, geografische Daten wie in Ihrem verknüpften Beispiel darzustellen , aber wenn Sie wissen, dass Google "Static Maps API V2 Developer Guide" anbietet und Sie Google und R mit einem Paket mit dem Namen RgoogleMaps kombinieren können .

Viel Glück bei Ihrer Recherche.

Ken
quelle
Es tut mir leid, wenn ich unklar war, aber im Moment ist das Problem nicht das Farbschema selbst. Ich habe RColorBrewer heute jedoch früher ausprobiert: ein tolles kleines Päckchen! Es handelt sich um räumliche Daten. Ich bin mir nicht sicher, ob ich Google-APIs verwenden möchte, aber ich könnte einen Blick darauf werfen.
Figaro
0

Haben Sie versucht, die Auflösung zu erhöhen density? Versuchen Sie es mit argument dimyx=c(512, 512)oder höher.

Wayne
quelle