Как сделать профиль скорости движущегося объекта? - PullRequest
0 голосов
/ 03 декабря 2018

Я начинающий пользователь R и столкнулся со следующей проблемой.У меня есть следующий фрейм данных:

       distance speed
1      61.0  36.4
2      51.4  35.3
3      42.2  34.2
4      33.4  32.8
5      24.9  31.3
6      17.5  28.4
7      11.5  24.1
8       7.1  19.4
9       3.3  16.9
10      0.5  15.5
11      4.4  15.1
12      8.5  15.5
13     13.1  17.3
14     18.8  20.5
15     25.7  24.1
16     33.3  26.3
17     41.0  27.0
18     48.7  27.7
19     56.6  28.4
20     64.8  29.2
21     73.6  31.7
22     83.3  34.2
23     93.4  35.3

Расстояние столбца представляет собой расстояние следующего объекта до определенной точки, а скорость столбца - скорость объекта.Как вы можете видеть, объект приближается к точке, а затем уходит.Я пытаюсь сделать свой профиль скорости.Я попробовал следующий код, но он не дал мне нужный график (потому что я хочу показать, как меняется его скорость, когда движущийся объект перемещается ближе и дальше контрольной точки)

    ggplot(speedprofile, aes(x = distance, y = speed)) +  #speedprofile is the data frame
  geom_line(color = "red") +
  geom_smooth() + 
  geom_vline(xintercept = 0) # the vline is the reference line

Графикследующее:

enter image description here

Затем я попытался вручную установить первые 10 расстояний как отрицательные, которые предшествуют нулю (0).Таким образом, я получаю сюжет ближе к тому, что хочу:

enter image description here

Но есть проблема.Расстояние не может быть определено как отрицательное.Подводя итог, ожидаемый сюжет следующий (и я извиняюсь за качество).

enter image description here

У вас есть какие-либо идеи о том, как решитьэтот?Заранее спасибо!

1 Ответ

0 голосов
/ 03 декабря 2018

Вы можете сделать что-то вроде этого, чтобы автоматически вычислить точку изменения (чтобы узнать, когда расстояние должно быть отрицательным), а затем установить метки оси как положительные.

Ваши данные (на случай, если это кому-то понадобится)ответить):

read.table(text="distance speed
61.0  36.4
51.4  35.3
42.2  34.2
33.4  32.8
24.9  31.3
17.5  28.4
11.5  24.1
7.1  19.4
3.3  16.9
0.5  15.5
4.4  15.1
8.5  15.5
13.1  17.3
18.8  20.5
25.7  24.1
33.3  26.3
41.0  27.0
48.7  27.7
56.6  28.4
64.8  29.2
73.6  31.7
83.3  34.2
93.4  35.3", stringsAsFactors=FALSE, header=TRUE) -> speed_profile

Теперь вычислите «реальное» расстояние (отрицательное для приближения, положительное для отступания):

speed_profile$real_distance <- c(-1, sign(diff(speed_profile$distance))) * speed_profile$distance

Теперь вычислите разрывы оси X заблаговременно:

breaks <- scales::pretty_breaks(10)(range(speed_profile$real_distance))

ggplot(speed_profile, aes(real_distance, speed)) +
  geom_smooth(linetype = "dashed") +
  geom_line(color = "#cb181d", size = 1) +
  scale_x_continuous(
    name = "distance",
    breaks = breaks,
    labels = abs(breaks) # make all the labels for the axis positive
  )

enter image description here

При условии, что шрифты хорошо работают в вашей системе, вы можете даже:

labels <- abs(breaks)
labels[(!breaks == 0)] <- sprintf("%s\n→", labels[(!breaks == 0)])

ggplot(speed_profile, aes(real_distance, speed)) +
  geom_smooth(linetype = "dashed") +
  geom_line(color = "#cb181d", size = 1) +
  scale_x_continuous(
    name = "distance",
    breaks = breaks,
    labels = labels,
  )

enter image description here

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