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

Posted

技术标签:

【中文标题】如何绘制两个不同系列的箱线图?【英文标题】:How do I plot boxplots of two different series? 【发布时间】:2014-07-16 17:19:48 【问题描述】:

我有 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(factor(combine), value)) +geom_boxplot(aes(fill = factor(variable)))

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

【问题讨论】:

基于每个数据框中的哪一列(对于 y)的箱线图? “CM0016、CM0017、CM0018”名称与“CM0001、CM0002、CM0003”名称有何关系? 它们是不同的案例,它们彼此不相关(这是两个独立的实验) @joran 是的,对于每个 x 值,2 个数据帧共享相同的行 id,(x 轴)我试图从 2 个数据帧中获取 2 个箱线图(箱线图代表所有行的值每个 x ,例如给定位置的示例,我试图获得一个对应于 (CM0016 CM0017 CM0018) 的箱线图和一个对应于 (CM0001 CM0002 CM0003) 的箱线图 您所描述的表明三对箱线图的最终结果(仅使用问题中的数据),并且每个箱线图将仅使用 3 个值创建。对吗? 【参考方案1】:

如果这些是您的输入表

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")

看起来像

【讨论】:

非常酷,是的,这就是我所做的修复,但你的代码更漂亮:) 谢谢

以上是关于如何绘制两个不同系列的箱线图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在ggplot的箱线图中按组绘制平均值

如何按中值对熊猫中的箱线图进行排序?

如何通过迭代方法创建一系列带有统计注释的箱线图

具有多个类别的箱线图和小提琴图

没有连接线的 ggpaired() 箱线图

使用熊猫的箱线图