ggplot2 geom_line():特定数值之间的箭头方向

3
我试图完成类似于这篇文章(链接)的内容,根据分组(在这种情况下是站点)连接点,并使用箭头指定基于特定值(年份)的箭头方向。我无法正确地使箭头方向正常工作。我希望箭头的方向总是从2017年指向2018年(对于每个不同的站点)。以下是迄今为止我的代码和样本数据(这是一个排序的前4行输出的示例)。
ggplot() +
  geom_point(data = data.scores[1:4,], aes(x = NMDS1, y = NMDS2), 
    shape = year[1:4]) + 
  geom_line(data = data.scores[1:4,], aes(x=NMDS1, y=NMDS2, group = site), 
    arrow = arrow(length = unit(0.15, "cm")))

样本数据应该长这样:

>data.scores
        NMDS1        NMDS2  site year
1 -0.009286247 -0.009874382   1  2018  
2 -0.099650245  0.021869952   1  2017  
3  0.034465891  0.043034188   2  2018  
4  0.040777968  0.028120489   2  2017 

因此,这个输出将会是从点2(网站1,2017年)到点1(网站1,2018年)的箭头。我看过许多类似的帖子,但还是有些不理解,感谢您的帮助。

1个回答

2
一种方法是按照“年份”对数据进行排序,使用geom_path而不是geom_line,后者按照x变量的顺序绘制而不是按照数据顺序绘制。
library(dplyr) #for arrange and %>%
library(ggplot2)

data.scores %>% 
   arrange(year) %>% #sort ascending so that 2018 is plotted last
   ggplot() +
   geom_point(aes(x = NMDS1, y = NMDS2, shape = factor(year)), 
              size = 3) + #I've made it bigger so you can see it better!
   geom_path(aes(x = NMDS1, y = NMDS2, group = site), 
             arrow = arrow(length = unit(0.55, "cm")))

enter image description here

请注意,如果您想要每年的形状不同,则需要将shape参数放在aes()内部。

谢谢您的回复。我在想如果网站组合中缺少某一年份/值,这个程序是否依然能正常运行呢?比如说,在第二个网站中缺少了2018年,那么排序以及随后的计算结果会不会出现错误呢? - KNN
@knn 我认为它应该为每个组绘制一条线,即使有些组缺少数据。 - Andrew Gustar
谢谢。我会测试并回报。 - KNN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接