3

私はいくつかの解決策を見つけましたが、私が望むものではありません。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 つのボックス プロットすべて) である必要があり、次にプロット内に少しスペースを空けて、再び x 軸の名前が「Gene2」の 4 つのボックス プロットなどです。 .

すべてのボックス プロットを 1 つのプロットに簡単にプロットできますが、データフレームを区別できません。つまり、最初の 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]]get(paste0("Gene", i))andmy.ylim <- ...min(c(min(Gene1), min(Gene2) ...etcに置き換えます。

于 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()

出力として次のようなものが得られます。

ここに画像の説明を入力

これは、コードへのかなり小さな変更で、あなたが望むことをするはずです。Dodge に関するR チャットのヒントについてJoranに感謝します。

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 に答える