Тепловая карта со значением вместо количества на ggmap (contour & geom_hex)

Для визуализации моих прогнозных моделей спроса на зарядку электромобилей я хотел бы создать тепловые карты, показывающие горячие точки спроса на зарядку в нескольких городах. Я хотел бы использовать два разных типа тепловых карт — контурные тепловые карты и тепловые карты плотности, распределенные по карте в виде шестиугольников (для прогнозирования я разделил свои данные на шестиугольные ячейки).

К сожалению, мне удалось создать тепловые карты только с подсчетами, но не с фактическими значениями (требование зарядки). Я пробовал плевать/вырезать данные, удостоверился, что используются только наблюдения > 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)

person Jonathan    schedule 06.06.2017    source источник
comment
geom_point с colour эстетикой, установленной на charging_demand, может быть более подходящим, если вы хотите отобразить фактическое значение, но не считать.   -  person www    schedule 07.06.2017
comment
Могу ли я каким-либо образом заставить это быть внутри моих шестиугольников? В конце концов, нанесение 3000 отдельных точек на карту выглядит не очень профессионально.   -  person Jonathan    schedule 07.06.2017
comment
Возможно, вычисление среднего значения charging_demand для каждого шестиугольника, а затем построение среднего значения.   -  person www    schedule 07.06.2017
comment
У меня уже есть среднее значение (я агрегировал за месяц, а затем только сохранил среднее значение). Как я смогу заполнить шестиугольник средним значением? Или контурная тепловая карта?   -  person Jonathan    schedule 07.06.2017
comment
Если вы уже работаете со сводными данными, вы можете нанести среднее значение в виде точек. Общее количество точек, вероятно, меньше 3000. Другая идея - посмотреть этот поток (stackoverflow.com/questions/16894460/), чтобы узнать, есть ли какие-либо обходные пути.   -  person www    schedule 07.06.2017
comment
И просто для ясности: когда я говорю о среднем, я говорю о среднем в пространстве. Не среднее значение во времени. Моя идея заключается в том, что вы можете агрегировать данные по долготе и широте и вычислить среднее значение.   -  person www    schedule 07.06.2017
comment
Да, все это уже агрегировано на уровне ячейки, никаких проблем. Однако, если я использую ggplot(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
comment
Используйте 1_   -  person Brian    schedule 07.06.2017