L'obiettivo è quello di costruire qualcosa di simile http://rentheatmap.com/sanfrancisco.htmlmappa di calore geografica di una proprietà personalizzata in R con ggmap
ho ottenuto mappa con ggmap e in grado di tracciare i punti su di esso.
library('ggmap')
map <- get_map(location=c(lon=20.46667, lat=44.81667), zoom=12, maptype='roadmap', color='bw')
positions <- data.frame(lon=rnorm(100, mean=20.46667, sd=0.05), lat=rnorm(100, mean=44.81667, sd=0.05), price=rnorm(10, mean=1000, sd=300))
ggmap(map) + geom_point(data=positions, mapping=aes(lon, lat)) + stat_density2d(data=positions, mapping=aes(x=lon, y=lat, fill=..level..), geom="polygon", alpha=0.3)
Questa è una bella immagine in base alla densità. Qualcuno sa come creare qualcosa che sembra uguale, ma usa position $ property per costruire contorni e scale?
Ho guardato a fondo attraverso stackoverflow.com e non ho trovato una soluzione.
EDIT 1
positions$price_cuts <- cut(positions$price, breaks=5)
ggmap(map) + stat_density2d(data=positions, mapping=aes(x=lon, y=lat, fill=price_cuts), alpha=0.3, geom="polygon")
risultati in cinque appezzamenti stat_density indipendenti:
EDIT 2 (da hrbrmstr)
positions <- data.frame(lon=rnorm(10000, mean=20.46667, sd=0.05), lat=rnorm(10000, mean=44.81667, sd=0.05), price=rnorm(10, mean=1000, sd=300))
positions$price <- ((20.46667 - positions$lon)^2 + (44.81667 - positions$lat)^2)^0.5 * 10000
positions <- data.frame(lon=rnorm(10000, mean=20.46667, sd=0.05), lat=rnorm(10000, mean=44.81667, sd=0.05))
positions$price <- ((20.46667 - positions$lon)^2 + (44.81667 - positions$lat)^2)^0.5 * 10000
positions <- subset(positions, price < 1000)
positions$price_cuts <- cut(positions$price, breaks=5)
ggmap(map) + geom_hex(data=positions, aes(fill=price_cuts), alpha=0.3)
si traduce in:
Crea un'immagine decente anche sui dati reali. Questo è il miglior risultato finora. Altri suggerimenti sono benvenuti.
EDIT 3: Ecco i dati di test e risultati di un metodo di cui sopra:
https://raw.githubusercontent.com/artem-fedosov/share/master/kernel_smoothing_ggplot.csv
test<-read.csv('test.csv')
ggplot(data=test, aes(lon, lat, fill=price_cuts)) + stat_bin2d(, alpha=0.7) + geom_point() + scale_fill_brewer(palette="Blues")
Credo che non ci dovrebbero un certo metodo che usi diversi densità kernel per calcolare poligoni appropriati. Sembra che la funzione dovrebbe essere in ggplot, ma non riesco a trovarla.
EDIT 4: Apprezzo il tempo e lo sforzo per capire la soluzione adeguata a questa domanda apparentemente non troppo complicata. Ho votato entrambe le tue risposte come una buona approssimazione all'obiettivo.
Ho rilevato un problema: i dati con i cerchi sono troppo artificiali e gli approcci non funzionano altrettanto bene sui dati del mondo di lettura.
approccio di Paolo mi ha dato la trama:
Sembra che cattura i modelli di dati che è cool. approage
di jazzurro mi ha dato questa trama:
Ha ottenuto i modelli pure. Tuttavia, entrambi i grafici non sembrano così belli come la trama stat_density2d di default. Aspetterò ancora un paio di giorni per vedere se emergerà qualche altra soluzione.In caso contrario, assegnerò la taglia a jazzurro in quanto sarà il risultato che userò.
C'è una versione python + google_maps aperta del codice richiesto. Forse qualcuno troverà ispirazione qui: https://github.com/jeffkaufman/apartment_prices
Hai provato qualcosa come 'posizioni $ price_cuts <- taglia (posizioni $ prezzo, pause = 5)' e poi usa 'price_cuts' invece di '..level..' per il riempimento? – hrbrmstr
L'ho provato. Produce 5 livelli indipendenti con scale sfumate :( –
'geom_hex (dati = posizioni, aes (fill = price_cuts), alpha = 0.3)' potrebbe avvicinarti a quello che stai cercando (con alcune modifiche di colore) – hrbrmstr