【问题标题】:ggplot2 geom_line() arrow direction between specific valuesggplot2 geom_line() 特定值之间的箭头方向
【发布时间】:2019-03-10 19:01:30
【问题描述】:

我正在尝试做类似于这篇文章here 的事情,使用箭头连接基于分组(在本例中为站点)的点,并根据特定值(年份)指定箭头方向。我无法让箭头的方向正常工作。我希望始终让箭头的方向从 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 年)的箭头。我看过很多类似的帖子,但不太清楚,所以谢谢。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    一种方法是按year 对数据进行排序并使用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")))
    

    请注意,shape 参数需要在 aes() 内,如果您希望每年使用不同的形状。

    【讨论】:

    • 感谢您的回复。一个想法是,如果站点对中缺少年份/值,这仍然可以正常工作吗?这意味着如果站点 2 中缺少 2018 年,那么排序和后续行是否会出错?
    • @knn 我认为应该为每个组画一条线,即使某些组缺少数据。
    • 谢谢。我会对此进行测试并报告。
    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多