2017-07-26 2 views
3

basierend generiert Ich möchte eine Choroplethenkarte mit den folgenden Datenpunkten erzeugen:räumlichen Heatmap über ggmap in R auf einem Wert

  • Longitude
  • Latitude
  • Preis

Hier ist der Datensatz - https://www.dropbox.com/s/0s05cl34bko7ggm/sample_data.csv?dl=0.

Ich möchte die Karte zeigen die Bereiche, wo der Preis höher ist und wo der Preis niedriger ist. Es sollte die meisten aussehen wahrscheinlich wie dieses (Beispielbild):

enter image description here

Hier ist mein Code:

library(ggmap) 

map <- get_map(location = "austin", zoom = 9) 
data <- read.csv(file.choose(), stringsAsFactors = FALSE) 
data$average_rate_per_night <- as.numeric(gsub("[\\$,]", "", 
data$average_rate_per_night)) 
ggmap(map, extent = "device") + 
stat_contour(data = data, geom="polygon", 
      aes(x = longitude, y = latitude, z = average_rate_per_night, 
fill = ..level..)) + 
scale_fill_continuous(name = "Price", low = "yellow", high = "red") 

Ich erhalte die folgende Fehlermeldung:

2: Computation failed in `stat_contour()`: 
Contour requires single `z` at each combination of `x` and `y`. 

I Ich würde wirklich jede Hilfe schätzen, wie dies behoben werden kann, oder jede andere Methode, um diese Art von Heatmap zu erstellen. Bitte beachten Sie, dass ich im Gewicht des Preises interessiert bin, nicht die Dichte der Datensätze.

+0

Sind Sie sicher, dass Sie nach einer Choroplethe suchen? Soweit ich weiß, benutzen die meisten Choroplethen administrative Regionen, nicht Breitengrad/Längengrad. –

+0

Ich stimme zu. Ich denke, der richtige Ausdruck sollte Konturkarte sein. – user709413

+0

Ich konnte die "Single z bei jeder Kombination" -Fehlermeldung loswerden, indem ich die Raten pro Nacht mittelte (einige x- und y-Kombinationen hatten mehrere durchschnittliche Raten, ich nehme an, dass die Koordinaten abgerundet wurden). Aber die Kontur zeichnete immer noch nicht.Ich weiß nicht warum und es hat nicht gesagt. Das Konturlinien-Plot funktioniert für Raster. Sie können es also zum Laufen bringen, indem Sie den Datenrahmen in Raster ändern und fehlende Werte ersetzen. Ich gebe jetzt auf ... –

Antwort

2

Wenn Sie darauf bestehen, die Kontur Ansatzes zur Verwendung dann müssen Sie für jeden möglichen x einen Wert schaffen, y Kombination in Ihren Daten koordinieren. Um dies zu erreichen, würde ich sehr empfehlen, den Platz zu rasterieren und einige Übersichtsstatistiken pro Bin zu generieren.

lege ich ein funktionierendes Beispiel unten auf der Grundlage der von Ihnen angegebenen Daten:

library(ggmap) 
library(data.table) 

map <- get_map(location = "austin", zoom = 12) 
data <- setDT(read.csv(file.choose(), stringsAsFactors = FALSE)) 

# convert the rate from string into numbers 
data[, average_rate_per_night := as.numeric(gsub(",", "", 
     substr(average_rate_per_night, 2, nchar(average_rate_per_night))))] 

# generate bins for the x, y coordinates 
xbreaks <- seq(floor(min(data$latitude)), ceiling(max(data$latitude)), by = 0.01) 
ybreaks <- seq(floor(min(data$longitude)), ceiling(max(data$longitude)), by = 0.01) 

# allocate the data points into the bins 
data$latbin <- xbreaks[cut(data$latitude, breaks = xbreaks, labels=F)] 
data$longbin <- ybreaks[cut(data$longitude, breaks = ybreaks, labels=F)] 

# Summarise the data for each bin 
datamat <- data[, list(average_rate_per_night = mean(average_rate_per_night)), 
       by = c("latbin", "longbin")] 

# Merge the summarised data with all possible x, y coordinate combinations to get 
# a value for every bin 
datamat <- merge(setDT(expand.grid(latbin = xbreaks, longbin = ybreaks)), datamat, 
       by = c("latbin", "longbin"), all.x = TRUE, all.y = FALSE) 

# Fill up the empty bins 0 to smooth the contour plot 
datamat[is.na(average_rate_per_night), ]$average_rate_per_night <- 0 

# Plot the contours 
ggmap(map, extent = "device") + 
    stat_contour(data = datamat, aes(x = longbin, y = latbin, z = average_rate_per_night, 
       fill = ..level.., alpha = ..level..), geom = 'polygon', binwidth = 100) + 
    scale_fill_gradient(name = "Price", low = "green", high = "red") + 
    guides(alpha = FALSE) 

enter image description here

Sie können dann mit der Binabmessung und die Kontur binwidth spielen, um das gewünschte Ergebnis zu erhalten, aber Sie können zusätzlich eine Glättungsfunktion auf dem Raster anwenden, um ein noch glatteres Konturdiagramm zu erhalten.

+0

Das funktioniert gut. Ich werde mit 'binwidth' und bin size spielen. – user709413

+0

Ich habe eine Frage - sollten wir nicht xbreak und ybreaks als Längen- und Breitengrad nehmen? Könnten Sie bitte erklären? – user709413

+1

Sie könnten aber Ihre Daten decken nicht einheitlich das gesamte Gebiet ab. Dies bedeutet, dass Sie am Ende Buckets mit ungleichmäßigen Größen haben und daher das Konturdiagramm möglicherweise nicht so glatt ist wie im Beispiel. Mit dem vorgeschlagenen Ansatz stellen Sie außerdem sicher, dass Sie die Konturplotdaten für alle x, y-Kombinationen angeben. – gcons

0

Sie können den stat_summary_2d() oder stat_summary_hex() Funktion verwenden, um ein ähnliches Ergebnis zu erzielen. Diese Funktionen teilen die Daten in Bins auf (definiert durch x und y), und dann werden die Z-Werte für jeden Bins basierend auf einer gegebenen Funktion zusammengefasst. Im folgenden Beispiel habe ich den Mittelwert als Aggregationsfunktion ausgewählt, und die Karte zeigt im Grunde den Durchschnittspreis in jeder Klasse.

Hinweis: Ich musste Ihre durchschnittliche_rate_per_night-Variable entsprechend behandeln, um sie in Zahlen umzuwandeln (entfernt das $ -Zeichen und das Komma).

library(ggmap) 
library(data.table) 

map <- get_map(location = "austin", zoom = 12) 
data <- setDT(read.csv(file.choose(), stringsAsFactors = FALSE)) 
data[, average_rate_per_night := as.numeric(gsub(",", "", 
    substr(average_rate_per_night, 2, nchar(average_rate_per_night))))] 

ggmap(map, extent = "device") + 
    stat_summary_2d(data = data, aes(x = longitude, y = latitude, 
     z = average_rate_per_night), fun = mean, alpha = 0.6, bins = 30) + 
    scale_fill_gradient(name = "Price", low = "green", high = "red") 

enter image description here

+0

Danke für die Hilfe, aber ich bin auf der Suche nach so etwas - https://sromalewski.files.wordpress.com/2011/09/bike-share-station-suggestions-091911- 913x1024.png – user709413