Наша цель - создать что-то вроде http://rentheatmap.com/sanfrancisco.html.
Я получил карту с ggmap и могу наносить точки поверх нее.
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)
Это хорошее изображение, основанное на плотности. Кто-нибудь знает, как сделать что-то, что выглядит так же, но использует свойство position $ для построения контуров и масштабирования?
Я внимательно просмотрел stackoverflow.com и не нашел решения.
ИЗМЕНИТЬ 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")
Результаты в пяти независимых графиках stat_de density:
ИЗМЕНИТЬ 2 (из 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)
Результат в:
Это также создает достойную картину на реальных данных. Это пока лучший результат. Дополнительные предложения приветствуются.
РЕДАКТИРОВАТЬ 3: Вот тестовые данные и результаты описанного выше метода:
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")
Я считаю, что должен быть какой-то метод, который использует не ядро плотности для вычисления правильных многоугольников. Вроде бы функция должна быть в ggplot из коробки, но я не могу ее найти.
РЕДАКТИРОВАТЬ 4: Я ценю ваше время и усилия, чтобы найти правильное решение этого, казалось бы, не слишком сложного вопроса. Я проголосовал за оба ваших ответа как за хорошее приближение к цели.
Я обнаружил одну проблему: данные с кружками слишком искусственны, и подходы не так хорошо работают с данными мира чтения.
Подход Пола дал мне сюжет:
Кажется, что он фиксирует шаблоны данных, что здорово.
Подход jazzurro дал мне следующий сюжет:
У него тоже есть шаблоны. Однако оба графика не кажутся такими красивыми, как график stat_de density2d по умолчанию. Я все равно подожду пару дней, чтобы посмотреть, придет ли какое-то другое решение. Если нет, я награжу jazzurro, так как это будет результат, который я буду использовать.
Существует открытая версия необходимого кода на python + google_maps. Может быть, здесь кто-то найдет вдохновение: https://github.com/jeffkaufman/apartment_prices
positions$price_cuts <- cut(positions$price, breaks=5)
, а затем использовалиprice_cuts
вместо..level..
для заливки? - person hrbrmstr   schedule 15.09.2014geom_hex(data=positions, aes(fill=price_cuts), alpha=0.3)
может приблизить вас к тому, что вы ищете (с некоторыми изменениями цвета) - person hrbrmstr   schedule 15.09.2014