如何绘制两个不同系列的箱线图?
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 轴上有 chrom
和 coord
组合(所以 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")
看起来像
【讨论】:
非常酷,是的,这就是我所做的修复,但你的代码更漂亮:) 谢谢以上是关于如何绘制两个不同系列的箱线图?的主要内容,如果未能解决你的问题,请参考以下文章