Для визуализации моих прогнозных моделей спроса на зарядку электромобилей я хотел бы создать тепловые карты, показывающие горячие точки спроса на зарядку в нескольких городах. Я хотел бы использовать два разных типа тепловых карт — контурные тепловые карты и тепловые карты плотности, распределенные по карте в виде шестиугольников (для прогнозирования я разделил свои данные на шестиугольные ячейки).
К сожалению, мне удалось создать тепловые карты только с подсчетами, но не с фактическими значениями (требование зарядки). Я пробовал плевать/вырезать данные, удостоверился, что используются только наблюдения > 0, и попытался ограничить ось x/y - пока ничего не сработало. Я надеюсь, что у кого-то здесь есть отличная идея о том, как это сделать. Ниже образец данных и оба кода тепловых карт, которые теперь создают тепловые карты количества вместо тепловых карт значений (долгота/широта — это центроиды моих шестиугольных ячеек, в которые агрегируются данные):
+---+------------+-------------+----------------+
| | lon | lat |charging_demand |
+---+------------+-------------+----------------+
| 1 | 12.65783 | 55.58421 | 653.7 |
| 2 | 12.67671 | 55.59255 | 24.1 |
| 3 | 12.66813 | 55.59422 | 376.2 |
+---+------------+-------------+----------------+
Для быстрой репликации:
df.data <- data.frame(lon = c(12.64753, 12.64924, 12.55998, 12.51878, 12.52221, 12.58401, 12.55655, 12.57371, 12.59088, 12.58058),
lat = c(55.63091, 55.62924, 55.67594, 55.78267, 55.78601, 55.68261, 55.66593, 55.67927, 55.67927, 55.70596),
charging_demand = c(663.7, 627.4, 597.4, 14.5, 396.3, 300.0, 0.00, 256.9, 228.5, 0.2))
Пример шестиугольной тепловой карты (количество):
map <- get_map(location = "Copenhagen", zoom = 12)
ggmap(map) +
coord_cartesian() +
geom_hex(data = df.data, aes(x = lon, y = lat, colour = charging_demand),
alpha = 0.6, color = "black", show.legend = TRUE, stat = "binhex") +
guides(fill = FALSE, alpha = FALSE) +
scale_fill_gradientn (colours = c("green","red"))
Пример тепловой карты контура (количество):
ggmap(map, extent = "device") +
geom_density2d(data = df.data, aes(x = lon, y = lat), size = 0.3) +
stat_density2d(data = df.data, aes(x = lon, y = lat, fill = ..level.., alpha = ..level..),
size = 0.01, bins = 10, geom = "polygon") +
scale_fill_gradient(low = "green", high = "red") +
scale_alpha(range = c(0, 0.3), guide = FALSE)
Разрезание данных даже на 1000 штук тоже не помогло:
df.data$demand_cut <- cut(df.data$charging_demand, breaks = 1000)
geom_point
сcolour
эстетикой, установленной наcharging_demand
, может быть более подходящим, если вы хотите отобразить фактическое значение, но не считать. - person www   schedule 07.06.2017charging_demand
для каждого шестиугольника, а затем построение среднего значения. - person www   schedule 07.06.2017ggplot(df.data, aes(x=lon, y=lat, col=charging_demand_mean)) + geom_hex()
, все выглядит хорошо, значения потребности в зарядке объединяются в шестиугольники. Когда я хочу изобразить это на карте, хотяggmap(map, extent = "device", base_layer = ggplot(df.data, aes(x=lon, y=lat, col=charging_demand_mean))) + coord_cartesian() + geom_hex(stat="binhex")
пакет hexbin автоматически начинает подсчет наблюдений на шестиугольник и игнорирует предыдущую агрегацию потребности в оплате... - person Jonathan   schedule 07.06.2017