如何根据geom_path中的方向为箭头着色

时间:2018-06-19 21:57:43

标签: r ggplot2

我正在尝试使用ggplot2中的geom_path根据箭头的方向为代码涂色。我在单独的行中有多年的数据,并且希望有一个箭头,指示从最早的数据点到最新的数据点,并用彩色表示要使其更易于解释的方向。这些点是按Lake_ID分组的,并且因为每年都有很多行,所以我遇到了麻烦。

以下是基本数据:

    Lake_ID Year    Gear    psd BioVolume
    16  2012    EF  0.370967742 0.095585695
    16  2012    GN  1   0.095585695
    16  2012    TN  0   0.095585695
    16  2012    Whole   0.375   0.095585695
    16  2017    EF  0.214285714 0.100623115
    16  2017    GN  1   0.100623115
    16  2017    TN  0   0.100623115
    16  2017    Whole   0.179487179 0.100623115

Basic Graph

    ggplot(blg.dup.year,aes(BioVolume,psd,group=Lake_ID,label=Year))+
        geom_point(aes(BioVolume,psd,colour=Year))+theme_bw()+
        facet_grid(Gear~.,scales = "free_y")+
        labs(title="Bluegill PSD",y="PSD",x="Littoral BioVolume")+
        geom_path(arrow=arrow(angle=30,length=unit(0.1,"inches"),
            type="closed"),aes(group=Lake_ID))

谢谢!

1 个答案:

答案 0 :(得分:0)

假设您所指的方向是此处箭头是向上还是向下,这是一种解决方案。 将原始图分配给变量:

p1 <- ggplot(blg.dup.year,aes(BioVolume,psd,group=Lake_ID,label=Year))+
  geom_point(aes(BioVolume,psd,colour=Year))+theme_bw()+
  facet_grid(Gear~.,scales = "free_y")+
  labs(title="Bluegill PSD",y="PSD",x="Littoral BioVolume")+
  geom_path(arrow=arrow(angle=30,length=unit(0.1,"inches"),
                        type="closed"),aes(group=Lake_ID))

从图层获取数据(您的箭头是第二个几何图形):

arrow_data <- layer_data(p1, 2) 

从y轴获取方向,然后根据符号分配颜色:

directions <- diff(arrow_data$y)[seq(1,nrow(arrow_data),2)]
colors <- case_when(sign(directions) == -1 ~ "red",
                    sign(directions) == 0 ~ "orange",
                    sign(directions) == -1 ~ "green", 
                    TRUE ~ "grey50")

您需要将颜色加倍,因为ggplot需要起点和终点的颜色。

colors <- rep(colors,each = 2)

最后将颜色添加到geom:

ggplot(blg.dup.year,aes(BioVolume,psd,group=Lake_ID,label=Year))+
   geom_point(aes(BioVolume,psd,colour=Year))+theme_bw()+
   facet_grid(Gear~.,scales = "free_y")+
   labs(title="Bluegill PSD",y="PSD",x="Littoral BioVolume") +
   geom_path(arrow=arrow(angle=30,length=unit(0.1,"inches"),
                         type="closed"),aes(group=Lake_ID), color = colors)

因此对于您的示例,您将获得:

enter image description here