我找到了一些solutions,但不完全是我想要的。我在R中有5个数据帧,每个数据帧有4列:
假设第一个数据帧的名称是“Gene1”
Ind1 Ind2 Ind3 Ind4 1 3 3.2 2.5 1 3 4 2 1.5 2 2.2 1 3.4 2 1 3
其余的数据帧称为“Gene2”,“Gene3”,“Gene4”,“Gene5”,类似。
我想在所有数据帧和所有列的相同图中并排绘制箱线图。我没有找到这样的情节,所以我无法上传图片,但我会尝试解释。
现在从上面的数据来看,该图将有20个箱形图。前4个盒子图应该彼此接近,x轴名称应该是“Gene1”(对于所有4个盒子图)然后在图中有一点空间,再次是4个盒子图,其中x轴名称为“Gene2”,依此类推
我可以轻松地在一个图中绘制所有框图,但我无法区分数据框。意思是,它应该清楚地告诉我们前4个箱形图来自“Gene1”,接下来的4个箱形图来自“Gene2”等等。
如果问题不明确,请告诉我。
答案 0 :(得分:11)
我怀疑这是你想要的,事实上,标准graphics
包中的绘图功能并不是很复杂。这些组被绘制为4个单独的面板,但是在外边距中绘制了共享的y轴和标题,它看起来像一个单独的图。
# Faking the data, since you didn't provide any
Gene <- data.frame(matrix(rweibull(100*4, 1), 100))
names(Gene) <- paste0("Ind", 1:4)
Gene <- rep(list(Gene), 4)
# Setup the panels
layout(t(1:4))
par(oma=c(2, 4, 4, 0), mar=rep(1, 4), cex=1)
# `mar` controls the space around each boxplot group
# Calculating the range so that the panels are comparable
my.ylim <- c(min(sapply(Gene, min)), max(sapply(Gene, max)))
# Plot all the boxes
for(i in 1:length(Gene)){
boxplot(Gene[[i]], ylim=my.ylim, axes=FALSE)
mtext(paste("Gene", i), 1, 0)
if(i == 1){
axis(2, las=1)
mtext("Expression or what you have", 2, 3)
}
}
title("Look at all my genes!", outer=TRUE)
顺便说一句,我建议将数据框存储在列表中,而不是通过命名它们“Gene1”,“Gene2”,“Gene3”和“Gene4”来模仿列表。以这种方式自动化要容易得多。如果您仍想将它们存储为单独的变量,请将Gene[[i]]
替换为get(paste0("Gene", i))
,将my.ylim <- ...
替换为min(c(min(Gene1), min(Gene2) ...
等。
答案 1 :(得分:6)
使用ggplot2
和相关工具,您可以在黑暗中拍摄照片。
library(ggplot2)
library(reshape2)
library(plyr)
Gene1 <- read.table(text = "Ind1 Ind2 Ind3 Ind4
1 3 3.2 2.5
1 3 4 2
1.5 2 2.2 1
3.4 2 1 3", header = TRUE)
#Make a copy of Gene1
Gene2 <- Gene1
#A Round about way to rbind these together with an ID column
combined_data <- ldply(list(Gene1 = Gene2, Gene2 = Gene2))
#Melt into the long format needed by ggplot2
combined_data_melt <- melt(combined_data, id.vars = 1)
#Plot and use facet_wrap for each data.frame
ggplot(combined_data_melt, aes(variable, value)) +
geom_boxplot() +
facet_wrap(~.id, ncol = 1) +
theme_bw()
给你这样的东西作为输出:
这应该做你想要的,对代码的微小改动。感谢Joran R chat提示有关闪避的提示。
ggplot(combined_data_melt, aes(.id, value, dodge = variable)) +
geom_boxplot(position = position_dodge(width = 0.8)) +
theme_bw()