Тепловая карта GPS с ggplot (geom_Path) - PullRequest
2 голосов
/ 06 апреля 2020

Я хотел бы создать что-то похожее на это:

Cool heatmap

С моими пробежками с использованием ggplot2:

Imho лучший способ добиться этого - использовать geom_path но я столкнулся с некоторыми проблемами. В моей базе данных есть 3 столбца: ID (идентификатор прогона, полезный для группировки данных). Lat Lon Вот пример: https://docs.google.com/spreadsheets/d/1lUUwVUzt4wCvbDLSrusfH9pVFXw-8icC8mLJ0QKBYKU/edit?usp=sharing

PS. Извините, данные слишком велики для dput

1: Как рассчитать интенсивность пути. Я думал о подсчете количества координат (широта, долгота) в пределах диапазона (например, 50 м). Итак, пара лат, долг с большим количеством координат рядом с ним. Это точка с высокой интенсивностью. Проблема в размерности данных. У меня есть тонны строк, и моя вычислительная мощность не может рассчитать эту большую матрицу (известная ошибка: не могу выделить вектор.). Мое решение обойти ошибку - al oop, которая вычисляет расстояние для каждой строки:

npoints_2<-c()
for (i in 1:nrow(db)){
  vector_distance<-distm(db[i,2:3], db[-i,2:3], fun = distHaversine)  #for each row calculate the distance between the point and the dataset
  npoints<-sum(vector_distance<50) #count points within 50m
  npoints_2<-c(npoints_2,npoints)
}

Поскольку это всего лишь oop, это решение очень медленное (и нереальное). Должно быть более разумное решение, но, вероятно, я слишком нуб, поэтому, пожалуйста, помогите мне.

Результат этого подхода с несколькими прогонами следующий:

ggplot(db, aes(lon,lat, group=id,color = log(n_punti_2))) + 
geom_path() +
scale_colour_continuous(low = "darkblue", high = "cyan")

Little sample

В связи с этим возникает вторая проблема: похожие маршруты с небольшими различиями в терминах координат.

A little zoom for better understanding

Какой наилучший способ объединить похожие маршруты? Имхо по графической причине лучше иметь одну единственную линию с высокой интенсивностью, чем 2/3 / n, довольно похожие линии с одинаковой интенсивностью

Заранее спасибо за вашу помощь. Это очень ценно !!!

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Трудно увидеть, используя ваши включенные данные, но это возможно.

Используя пакет sf и ggplot2, вы можете нанести точки дважды и изменить цвет и альфа во втором вызове.

library(tidyverse)
library(sf)

#Read File 
x <- read_csv(#Your file location here)

#Change file to sf object
x <- st_as_sf(x, coords = c('lon', 'lat')) %>% st_set_crs(4326)

# Plot the paths twice.  Once in white and again with a different color.
#  Set alpha level of second plot to allow a 'bleed through' of the
#  first color.
ggplot(x) + 
  geom_sf(color = 'orangered4', size = .1) +
  geom_sf(alpha = .03, color = 'white', size = .1) + 
  theme_void() + 
  theme(panel.background = element_rect(fill = 'black'))

Трасса, которую вы пробежали, выглядит ближе к белому, поскольку там много точек, а начало и конец трассы вдоль побережья темнее, когда точек меньше.

enter image description here

0 голосов
/ 06 апреля 2020

Я пытался подражать «Страве» - выглядеть немного лучше - каждый понимает, насколько велика работа, которую делают создатели этих карт. Если вы увеличите масштаб этих карт, вы увидите, что эти линии действительно хорошо прорисованы.

library(tidyverse)
library(ggpointdensity)

runs <- read.csv("your_path.csv", stringsAsFactors = FALSE)

ggplot(runs, aes(lon, lat)) +
  geom_pointdensity(size = .8) +
  scale_color_gradient2(low = "#340707", mid = "#d95e23", high = "#fffdee",
                        midpoint = 3500
                        ) +
  theme(panel.background = element_rect(fill = '#160e16'),
        panel.grid = element_blank())

Создано в 2020-04-07 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...