2016-03-25 67 views
3

这一直是我一直在尝试找到一个解决方案的一段时间,但基本上我想知道是否有一个快速的方法来“闪避”线性图两个不同的数据集在ggplot2。R - ggplot dodge geom_lines

我的代码是目前:

#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

这里的 “组2” 线隐藏所有的 “1组” 行的是不是我想。相反,我希望“第2组”行低于“第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值转换为因子,将它们更改为数值,然后将这些值合并到第二个数据集中,因此更快捷的方法将更可取。在此先感谢您的帮助!

+2

您需要将这两个数据集合并成一个数据集才能进行回避工作 – Thierry

+0

如果您的真实数据集确实如此simi大家可以很容易地将它们堆叠在一起,并使用* dplyr *中的'bind_rows'来添加组索引。 – aosmith

回答

3

你实际上是两个问题在这里:

  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 

注意如何设置.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")) 

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

+0

感谢您的彻底解答!我曾认为这两条线不知道每一条都会导致闪避不起作用,但感谢您的确认。不幸的是,没有更简单的解决方案。 –