3

我找到了一些解决方案,但不完全是我想要的。我在 R 中有 5 个数据框,每个数据框有 4 列:

假设第一个数据框的名称是“Gene1”

工业 1 工业 2 工业 3 工业 4
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”,依此类推。

如果问题不清楚,请告诉我。

4

2 回答 2

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]]withget(paste0("Gene", i))my.ylim <- ...withmin(c(min(Gene1), min(Gene2) ...等。

于 2012-10-08T15:26:54.107 回答
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()

给你这样的输出:

在此处输入图像描述

这应该做你想要的,对代码进行非常小的改动。感谢JoranR 聊天中关于闪避的提示。

ggplot(combined_data_melt, aes(.id, value, dodge = variable)) +
  geom_boxplot(position = position_dodge(width = 0.8)) +
  theme_bw()

在此处输入图像描述

于 2012-10-08T15:14:07.790 回答