首页 > 解决方案 > 如何在ggplot2中显示obs的方向(标题)

问题描述

如何使用 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

在此处输入图像描述

标签: rggplot2visualization

解决方案


我们可以在使用andggplot2::geom_segment重塑数据后使用 :dplyrtidyr::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

编辑:

但我只希望箭头指向没有线条。

我不确定我们应该如何处理每个 id 的第二点(因为它没有方向)但是如果我们想从图中省略它们,我们可以这样做:

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

没有线条或点

或者,如果我们希望箭头指向下一个测量值,与颜色无关,我们可以使用下面的代码(现在由于没有方向,只缺少最后一个点):

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另一层......


推荐阅读