Мы можем использовать ggplot2::geom_segment
после того, как мы изменили данные, используя dplyr
и tidyr::pivot_wider
:
dat <- data.frame(id = c(1, 1, 2, 2, 3, 3),
time = c(1, 2, 1, 2, 1, 2),
x = c(.1, .2, .3, .4, .5, .6),
y = c(.6, .25, .4, .33, .2, .51))
library(dplyr)
library(tidyr)
library(ggplot2)
dat %>%
pivot_wider(names_from = time, values_from = c(x, y)) %>%
ggplot(aes(x=x_1, y=y_1, color=factor(id))) +
geom_segment(aes(xend = x_2, yend = y_2),
arrow = arrow(length = unit(.3,"cm"))) +
labs(x="x", y="y", color="id")
![ggplot with arrows](https://i.stack.imgur.com/GnqZP.png)
Редактировать:
но я просто хочу, чтобы стрелка указывала без линий.
Я не уверен, как мы должны обрабатывать вторую точку для каждого идентификатора (так как он имеет не направление ), но если мы хотим опустить их на графике, мы можем сделать:
library(dplyr)
library(tidyr)
library(ggplot2)
dat %>%
group_by(id) %>%
arrange(id, time) %>%
mutate(x_2 = x + 0.0001 * (lead(x) - x),
y_2 = y + 0.0001 * (lead(y) - y)) %>%
filter(!is.na(x_2)) %>%
ggplot(aes(x=x, y=y, color=factor(id))) +
geom_segment(aes(xend = x_2, yend = y_2),
arrow = arrow(length = unit(.3,"cm"))) +
labs(x="x", y="y", color="id")
![no lines or dots](https://i.stack.imgur.com/RUoc2.png)
или если мы хотим, чтобы стрелки указывали на следующее измерение, независимо от цвета, мы можем использовать код ниже (теперь отсутствует только последняя точка из-за отсутствия направления):
library(dplyr)
library(tidyr)
library(ggplot2)
dat %>%
arrange(id, time) %>%
mutate(x_2 = x + 0.0001 * (lead(x) - x),
y_2 = y + 0.0001 * (lead(y) - y)) %>%
filter(!is.na(x_2)) %>%
ggplot(aes(x=x, y=y, color=factor(id))) +
geom_segment(aes(xend = x_2, yend = y_2),
arrow = arrow(length = unit(.3,"cm"))) +
labs(x="x", y="y", color="id")
Если мы хотим сохранить «последние» меры мы могли бы добавить их в другой geom_point
слой ...