2017-06-25 1 views
0

Ich habe statische Heatmaps mit der library(ggmap) und stat_density2d() Funktion gemacht. Ich suche, um das in einer glänzenden App auf einer dynamischen leaflet Karte neu zu erstellen, fand ich addHeatmap(). Die resultierenden Bilder sind jedoch unähnlich, wobei die ggmap-Version scheinbar das richtige Ergebnis bietet.r heatmap - stat_density2d (ggmap) vs. addHeatmap (glänzende Broschüre)

GGMAP

Heatmap on ggmap

LEAFLET

Heatmap on leaflet

Was diesen Unterschied verursacht?

Um die beiden unten aufgeführten Beispiele auszuführen, können Sie einige Daten (csv-Datei) herunterladen, die ich hier eingefügt habe. https://drive.google.com/drive/folders/0B8_GTHBuoKSRR1VIRmhOUTJKYU0?usp=sharing

Beachten Sie, dass das leaflet Ergebnis mit Zoom-Ebene unterscheidet, aber nie übereinstimmt ggmap Ergebnis (zum Beispiel in Bezug auf Ort maximaler Hitze).

Dies ist der ggmap Code.

library(ggmap) 
data <- read.csv("DATA.csv", sep=";") 
data <- subset(data, !is.na(CrdLatDeg)) 
xmin <- min(data$CrdLonDeg) 
xmax <- max(data$CrdLonDeg) 
ymin <- min(data$CrdLatDeg) 
ymax <- max(data$CrdLatDeg) 
lon <- c(xmin,xmax) 
lat <- c(ymin,ymax) 
map <- get_map(location = c(lon = mean(lon), lat = mean(lat)), zoom = 17, 
       maptype = "satellite", source = "google") 
ggmap(map) + 
    labs(x="longitude", y="latitude") + 
    stat_density2d(data=data, aes(x=CrdLonDeg, y=CrdLatDeg, alpha= ..level.., fill= ..level..), colour=FALSE, 
       geom="polygon", bins=100) + 
    scale_fill_gradientn(colours=c(rev(rainbow(100, start=0, end=.7)))) + scale_alpha(range=c(0,.8)) + 
    guides(alpha=FALSE,fill=FALSE) 

Dies ist der leaflet Code.

library(leaflet.extras) 
data <- read.csv("DATA.csv", sep=";") 
data <- subset(data, !is.na(CrdLatDeg)) 
leaflet(data) %>% 
    addTiles(group="OSM") %>% 
    addHeatmap(group="heat", lng=~CrdLonDeg, lat=~CrdLatDeg, max=.6, blur = 60) 
+0

Wie sehen die Bilder aus? Es ist schwierig, den Unterschied zu erkennen, ohne sie anzusehen. – IvanSanchez

+0

@IvanSanchez: Ich habe Daten und Code zur Verfügung gestellt, also sollten Sie in der Lage sein, die Bilder selbst zu erstellen? Ich bin (noch) nicht berechtigt, Bilder hier einzubetten, also habe ich die Bildergebnisse auf den gleichen Link hochgeladen, auf den ich die Daten gesetzt habe. –

+0

Persönlich kenne ich Leaflet- und Heatmap-Algorithmen, aber ich weiß nicht, was als erstes über R steht. Auch das Ausführen der Beispiele bedeutet, dass ich viel Zeit mit dem Ausführen der Beispiele verbringe. Es ist eine gute Sache, die Daten und den Code zu haben, aber wenn du kannst, solltest du es anderen erleichtern, das Problem zu sehen. Wenn Sie die Bilder irgendwo hochladen, kann ich Ihren Beitrag bearbeiten und einbinden. – IvanSanchez

Antwort

2

Die Bilder sehen anders aus, weil die Algorithmen unterschiedlich sind.

stat_density2d() extrapoliert einen probability density function aus den diskreten Daten.

Die Leaflet-Implementierung von Heatmaps beruht auf Bibliotheken wie simpleheat, heatmap.js oder webgl-heatmap. Diese Heatmaps nicht verlassen sich auf Wahrscheinlichkeitsdichte. (Ich bin mir nicht ganz sicher, welche davon von r-leaflet verwendet wird).

Stattdessen arbeiten diese Heatmaps, indem sie für jeden Punkt einen unscharfen Kreis zeichnen, den Wert jedes Pixels um einen Betrag erhöhen, der direkt proportional zur Intensität des Punktes ist (in Ihrem Fall konstant) und umgekehrt proportional zum Abstand zwischen den Punkt und der Kreis. Jeder Datenpunkt wird in der Heatmap als Kreis dargestellt.Sie können sehen, das in der oberen rechten Ecke des Bildes an diesem einsamen Punkt in the heatmap.js webpage mit dem Maus-Cursor durch das Spiel, oder indem man:

heatmap of a lone point

Denken Sie an einer Heatmap wie eine Visualisierung der Funktion

f (pixel) = Σ (max (0, radius - Abstand (pixel, Punkt)) · Intensität (Punkt))

Man kann den Radius und die Intensität des Heatmaps zwicken, aber das Ergebnis wird ne ver gleich einer statistischen Dichteabschätzung sein.

+0

Danke! Dann schätze ich, dass ich addPolygons verwenden und die berechnete Dichteschätzung verwenden werde. –

1

Beide verwenden einen anderen Algorithmus. Sie müssen die radius und blur Argumente von addHeatmap und das h Argument von stat_density2d zwicken, um etwas ähnliche Resultate zu erhalten.

+0

Nun, ich habe ein bisschen nachgebessert, aber sie sehen nie gleich aus. Ich möchte eine "Flugblatt" -Option, die die Dichte der Punkte zeigt. Dies scheint bei meiner derzeitigen Verwendung von 'addHeatmap' nicht der Fall zu sein, da es Bereiche mit weniger als maximaler Dichte mit der wärmsten Farbe (rot) hervorhebt, scheinbar unabhängig von den Werten, die den Argumenten geliefert werden. –

Verwandte Themen