如何制作移动物体的速度曲线?

How to make the speed profile of a moving object?

我是一名 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

剧情如下:

然后,我尝试将前 10 个距离手动设置为负数,这些距离在零 (0) 之前。所以我得到了一个更接近我想要的情节:

但是有个问题。距离不能定义为负数。 综上所述,期待剧情如下(画质见谅)

你有什么解决办法吗? 先感谢您!

您可以执行类似这样的操作来自动计算变化点(以了解距离何时应为负),然后将轴标签设置为正。

您的数据(以防有人需要它来回答):

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

现在,计算 "real" 距离(接近为负,后退为正):

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
  )

如果字体在您的系统上运行良好,您甚至可以这样做:

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,
  )