27

2 つの要因でグループ化された一連の箱ひげ図をRで作成しようとしています。なんとかプロットを作成できましたが、ボックスを正しい方向に並べることができません。

私が使用しているデータ ファームは次のようになります。

Nitrogen    Species    Treatment
2           G          L
3           R          M
4           G          H
4           B          L
2           B          M
1           G          H

私は試した:

boxplot(mydata$Nitrogen~mydata$Species*mydata$Treatment)

これにより、ボックスがアルファベット順に並べられました (最初の 3 つは「高」処理であり、その後、これら 3 つの中で種名のアルファベット順に並べられました)。

代替テキスト

箱ひげ図を低>中>高の順に並べてから、種のG>R>Bの各グループ内に配置します。

だから私は数式で係数を使用してみました:

f = ordered(interaction(mydata$Treatment, mydata$Species), 
            levels = c("L.G","L.R","L.B","M.G","M.R","M.B","H.G","H.R","H.B")

それから:

boxplot(mydata$Nitrogen~f)

ただし、ボックスはまだ同じ順序で靴を履いています。ラベルは異なりますが、ボックスは移動していません。

各データセットを引き出して、それらをすべてまとめて個別にプロットしました。

lg = mydata[mydata$Treatment="L" & mydata$Species="G", "Nitrogen"]
mg = mydata[mydata$Treatment="M" & mydata$Species="G", "Nitrogen"]
hg = mydata[mydata$Treatment="H" & mydata$Species="G", "Nitrogen"]
etc ..

boxplot(lg, lr, lb, mg, mr, mb, hg, hr, hb)

これは私が望むものを与えますが、よりエレガントな方法でこれを行うことを好むので、より大きなデータセットのためにそれぞれを個別に引き出す必要はありません.


読み込み可能なデータ:

mydata <-
structure(list(Nitrogen = c(2L, 3L, 4L, 4L, 2L, 1L), Species = structure(c(2L, 
3L, 2L, 1L, 1L, 2L), .Label = c("B", "G", "R"), class = "factor"), 
    Treatment = structure(c(2L, 3L, 1L, 2L, 3L, 1L), .Label = c("H", 
    "L", "M"), class = "factor")), .Names = c("Nitrogen", "Species", 
"Treatment"), class = "data.frame", row.names = c(NA, -6L))
4

2 に答える 2

33

次のコマンドは、レベルの明示的な手動順序付けを使用して、Treatment 因子と Species 因子を再構築することにより、必要な順序付けを作成します。

mydata$Treatment = factor(mydata$Treatment,c("L","M","H"))

mydata$Species = factor(mydata$Species,c("G","R","B"))

代替テキスト


編集1:おっと、LMHではなくHMLに設定しました。固定。

編集 2: factor(X,Y) の機能:

factor(X,Y) を既存の因子に対して実行すると、Y の値の順序を使用して、因子 X に存在する値が列挙されます。データの例を次に示します。

> mydata$Treatment
[1] L M H L M H
Levels: H L M
> as.integer(mydata$Treatment)
[1] 2 3 1 2 3 1
> factor(mydata$Treatment,c("L","M","H"))
[1] L M H L M H                               <-- not changed
Levels: L M H                                 <-- changed
> as.integer(factor(mydata$Treatment,c("L","M","H")))
[1] 1 2 3 1 2 3                               <-- changed

一見すると因子の外観は変わりませんが、データの保存方法は変わります。

ここで重要なことは、多くのプロット関数が最も低い列挙を左端にプロットし、次に次のようにプロットするということです。

単純に を使用して因子を作成する場合factor(X)、通常、列挙は因子レベルのアルファベット順 (例: "H"、"L"、"M") に基づきます。ラベルの順序がアルファベット順 (つまり、"H"、"M"、"L") と異なる場合、グラフが奇妙に見えることがあります。

一見すると、問題はデータ フレーム内のデータの順序にある​​ように見えるかもしれません。つまり、すべて "H" を一番上に、"L" を一番下に配置できれば、問題は解決します。そうではありません。ただし、ラベルをデータの最初の出現と同じ順序で表示する場合は、次の形式を使用できます

 mydata$Treatment = factor(mydata$Treatment, unique(mydata$Treatment))
于 2010-11-23T21:07:04.093 に答える
12

この以前の StackOverflow の質問boxplotは、数値に基づいて aを並べ替える方法を示しています。ここで必要なのは、おそらく からfactor関連する type への切り替えだけorderedです。しかし、あなたのデータがなく、再現可能な例が提供されていないため、言うのは難しい.

編集変数に投稿したデータセットを使用し、md以前に指摘したソリューションに依存すると、

R> md$Species <- ordered(md$Species, levels=c("G", "R", "B"))
R> md$Treatment <- ordered(md$Treatment, levels=c("L", "M", "H"))
R> with(md, boxplot(Nitrogen ~ Species * Treatment))

これにより、作成しようとしていたチャートが作成されます。

これは、ここで紹介する他のソリューションと同等です。

于 2010-11-23T20:46:48.567 に答える