R - ggplot躲避geom_lines

时间:2016-03-25 20:25:57

标签: r plot ggplot2

这一直是我一直在尝试找到一段时间的修复,但基本上我想知道是否有一种快速方法可以在ggplot2中“躲避”两个不同数据集的线图。

我的代码目前是:

#Example data
id <- c("A","A")
var <- c(1,10)
id_num <- c(1,1)
df1 <- data.frame(id,var,id_num)

id <- c("A","A")
var <- c(1,15)
id_num <- c(0.9,0.9)
df2 <- data.frame(id,var,id_num)


#Attempted plot
dodge <- position_dodge(width=0.5)
p<- ggplot(data= df1, aes(x=var, y=id))  +
  geom_line(aes(colour="Group 1"),position="dodge") + 
  geom_line(data= df2,aes(x=var, y=id,colour="Group 2"),position="dodge") +
  scale_color_manual("",values=c("salmon","skyblue2"))
p

产生:

enter image description here

这里的“Group 2”行隐藏了所有“Group 1”行,这不是我想要的。相反,我希望“Group 2”行低于“Group 1”行。我环顾四周,找到了上一篇文章:ggplot2 offset scatterplot points但我似乎无法调整代码,以便在使用单独的数据框时让两个geom_lines相互躲闪。

我一直在将我的y变量转换为数字并略微偏移它们以获得所需的输出,但我想知道是否有更快/更简单的方法来使用ggplot或其他的闪避功能获得相同的结果

我的代码工作很简单:

p<- ggplot(data= df1, aes(x=var, y=id_num))  +
  geom_line(aes(colour="Group 1")) + 
  geom_line(data= df2,aes(x=var, y=id_num,colour="Group 2")) +
  scale_color_manual("",values=c("salmon","skyblue2")) + 
  scale_y_continuous(lim=c(0,1))
p

给我我想要的输出:

期望的输出:

Desired output

当我尝试扩展它以适合我的实际数据时,数字方法可能有点麻烦。我必须将我的y值转换为因子,将它们更改为数字,然后将值合并到第二个数据集,因此更快的方式将更可取。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

这里实际上有两个问题:

  1. 如果使用两层geom_line()绘制两条线(因为您有两个数据帧),则每条线“不知道”另一条线。因此,他们不能互相躲闪。

  2. position_dodge()用于在水平方向躲闪。标准示例是条形图,您可以在其中放置各种条形图(而不是彼此重叠)。但是,你想要在垂直方向躲闪。

  3. 通过将数据帧合并为一个来解决问题1:

    library(dplyr)
    df_all <- bind_rows(Group1 = df1, Group2 = df2, .id = "group")
    df_all
    ## Source: local data frame [4 x 4]
    ## 
    ##    group     id   var id_num
    ##    (chr) (fctr) (dbl)  (dbl)
    ## 1 Group1      A     1    1.0
    ## 2 Group1      A    10    1.0
    ## 3 Group2      A     1    0.9
    ## 4 Group2      A    15    0.9
    

    请注意设置.id = "Group"如何bind_rows()创建一个列group,其中的标签取自与df1df2一起使用的名称。< / p>

    然后,您可以使用单个geom_line()绘制两行:

    library(ggplot2)
    ggplot(data = df_all, aes(x=var, y=id, colour = group))  +
       geom_line(position = position_dodge(width = 0.5)) +
       scale_color_manual("",values=c("salmon","skyblue2"))
    

    enter image description here

    我还使用position_dodge()明确地向您展示问题2。如果仔细观察,可以看到左侧的红线略微突出。这是两条线在垂直方向上相互躲避(不是非常成功)的结果。

    您可以通过交换x和y坐标来解决问题2。在那种情况下,水平躲避是正确的做法:

    ggplot(data = df_all, aes(y=var, x=id, colour = group))  +
       geom_line(position = position_dodge(width = 0.5)) +
       scale_color_manual("",values=c("salmon","skyblue2"))
    

    enter image description here

    最后一步是使用coord_flip()来获得所需的情节:

    ggplot(data = df_all, aes(y=var, x=id, colour = group))  +
       geom_line(position = position_dodge(width = 0.5)) +
       scale_color_manual("",values=c("salmon","skyblue2")) +
       coord_flip()
    

    enter image description here