Как показать направление (направление) объекта в ggplot2 - PullRequest
4 голосов
/ 13 марта 2020

Как я могу показать направление (направление) наблюдений, используя ggplot2? Есть ли способ настроить shape=17 (треугольник) так, чтобы он "указывал" на последующие наблюдения за временем?

Пример кода

library(ggplot2)

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


ggplot(dat, aes(x, y, color=factor(id))) + 
  geom_point(shape=17) + 
  # geom_line() +
  NULL

enter image description here

Ответы [ 2 ]

3 голосов
/ 13 марта 2020

Мы можем использовать 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

Редактировать:

но я просто хочу, чтобы стрелка указывала без линий.

Я не уверен, как мы должны обрабатывать вторую точку для каждого идентификатора (так как он имеет не направление ), но если мы хотим опустить их на графике, мы можем сделать:

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

или если мы хотим, чтобы стрелки указывали на следующее измерение, независимо от цвета, мы можем использовать код ниже (теперь отсутствует только последняя точка из-за отсутствия направления):

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 слой ...

2 голосов
/ 13 марта 2020

Объединение идей из ответа дарио , Как масштабировать 2D-вектор и сохранять направление и Прекрасно расположить стрелки между точками в ggplot2

library(dplyr)
library(tidyr)
library(ggplot2)

dat %>% 
  pivot_wider(names_from = time, values_from = c(x, y)) %>% 
  group_by(id) %>% 
  mutate(x_v = x_2 - x_1, y_v = y_2 - y_1) %>% 
  mutate_at(vars("x_v", "y_v"), 
            list(units =~ (. / sqrt((x_v)^2 + (y_v)^2))/1000)) %>% 
  ggplot(aes(x=x_1, y=y_1, colour = factor(id))) + 
  geom_segment(aes(xend = x_1 + x_v_units, yend = y_1 + y_v_units),
              show.legend = F,
               arrow = arrow(length = unit(.3,"cm"), type="closed", angle = 20)) +
  geom_point(data = (dat %>% filter(time == 2)), aes(x, y), shape=15, size=2) +
  labs(x="x", y="y", colour="id") +
  theme_bw()

Данные:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...