如何绘制两个不同系列的箱线图?

时间:2014-05-27 17:25:01

标签: r ggplot2 dataframe boxplot

我有2个数据帧共享相同的行ID但具有不同的列

这是一个例子

  chrom     coord               sID      CM0016      CM0017    CM0018
7     10   3178881 SP_SA036,SP_SA040 0.000000000 0.000000000 0.0009923
8     10  38894616 SP_SA036,SP_SA040 0.000434783 0.000467464 0.0000970
9     11 104972190 SP_SA036,SP_SA040 0.497802888 0.529319536 0.5479003

   chrom     coord            sID      CM0001      CM0002      CM0003
4     10   3178881 SP_SA036,SA040 0.526806527 0.544927536 0.565610860
5     10  38894616 SP_SA036,SA040 0.009049774 0.002849003 0.002857143
6     11 104972190 SP_SA036,SA040 0.451612903 0.401617251 0.435318275

我正在尝试创建一个复合箱图图,其中我在x轴上有chromcoord组合(所以3个点)和每个x值2个箱图并排对应两个数据帧?

这样做的最佳方式是什么?我应该以某种方式将两个数据帧合并在一起,以便只获得一个并通过3列循环显示箱形图?

关于如何做到这一点的任何想法?

问题是两个数据帧的行数相同但列数不同

>  dim(A)
[1] 99 20
>  dim(B)
[1] 99 28

我正在考虑转置数据框以获得相同数量的列,但是如何正确地丢失 提前致谢

更新

这就是我试图做的事情

  • 我将chrom和coord列合并在一起以创建单个ID
  • 我使用了reshape来融合数据帧
  • 我将2个融化的数据框合并为一个
  • 头部看起来像这样
  • 我有两个变量A2和A4对应于2个数据帧
  • 然后我用这个

    创建了一个箱形图

    ggplot(A2A4,aes(因子(组合),值))+ geom_boxplot(aes(fill = factor(variable)))

我认为它解决了我的问题,但是箱图看起来很忙,有99个x值,每个都有2个箱图

1 个答案:

答案 0 :(得分:2)

所以如果这些是你的输入表

d1<-structure(list(chrom = c(10L, 10L, 11L), 
coord = c(3178881L, 38894616L, 104972190L), 
sID = structure(c(1L, 1L, 1L), .Label = "SP_SA036,SP_SA040", class = "factor"), 
    CM0016 = c(0, 0.000434783, 0.497802888), CM0017 = c(0, 0.000467464, 
    0.529319536), CM0018 = c(0.0009923, 9.7e-05, 0.5479003)), .Names = c("chrom", 
"coord", "sID", "CM0016", "CM0017", "CM0018"), class = "data.frame", row.names = c("7", 
"8", "9"))

d2<-structure(list(chrom = c(10L, 10L, 11L), coord = c(3178881L, 
38894616L, 104972190L), sID = structure(c(1L, 1L, 1L), .Label = "SP_SA036,SA040", class = "factor"), 
    CM0001 = c(0.526806527, 0.009049774, 0.451612903), CM0002 = c(0.544927536, 
    0.002849003, 0.401617251), CM0003 = c(0.56561086, 0.002857143, 
    0.435318275)), .Names = c("chrom", "coord", "sID", "CM0001", 
"CM0002", "CM0003"), class = "data.frame", row.names = c("4", 
"5", "6"))

然后我会组合并重塑数据,以便更容易绘制。这就是我要做的事情

m1<-melt(d1, id.vars=c("chrom", "coord", "sID"))
m2<-melt(d2, id.vars=c("chrom", "coord", "sID"))
dd<-rbind(cbind(m1, s="T1"), cbind(m2, s="T2"))
mm$pos<-factor(paste(mm$chrom,mm$coord,sep=":"),
    levels=do.call(paste, c(unique(dd[order(dd[[1]],dd[[2]]),1:2]), sep=":")))

我首先melt两个输入表将列转换为行。然后我在每个表中添加一列,以便我知道数据的来源和rbind它们在一起。最后,我做了一些混乱的工作,使chr / coord对中的因子按正确的顺序排序。

完成所有这些后,我将制作如

的情节
ggplot(mm, aes(x=pos, y=value, color=s)) +
    geom_boxplot(position="dodge")

看起来像

resulting boxplot