R-ggplot躲避geom_lines

Mik*_* H. 5 plot r 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
Run Code Online (Sandbox Code Playgroud)

产生:

在此处输入图片说明

在这里,“组2”行隐藏了所有“组1”行,这不是我想要的。相反,我希望“组2”行位于“组1”行之下。我环顾四周,发现了上一篇文章:ggplot2 offset散点图点,但是当使用单独的数据帧时,我似乎无法适应该代码以使两条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
Run Code Online (Sandbox Code Playgroud)

给我我想要的输出:

所需的输出:

所需的输出

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

Sti*_*ibu 5

实际上,这里有两个问题:

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

  2. position_dodge()用于在水平方向上躲避。标准示例是条形图,您可以在其中将各种条形放置在彼此相邻的位置(而不是彼此叠置)。但是,您想在垂直方向上躲避。

通过将数据帧合并为一个来解决问题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
Run Code Online (Sandbox Code Playgroud)

注意设置是如何.id = "Group"bind_rows()创建一个列group有来自被一起使用的名称所采取的标签df1df2

然后,您可以用一条线绘制两条线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"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我还曾经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"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

然后,最后一步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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明