2

ここに更新された例があります:

df <- data.frame(a=rep(c("A","B"),each=10),
                 b=rep(rep(c("C","D"),each=5),2),
                 c=c(sample(letters[1:5]), sample(letters[6:10]),           
                     sample(letters[1:5]), sample(letters[6:10])),
                 d=c(0.10,0.18,0.34,0.35,0.59,0.16,0.38,0.40,0.53,0.58,
                     0.37,0.62,0.83,1.46,-0.91,-0.79,-0.52,-0.43,-0.01,0.34))

> df
   a b c     d
1  A C b  0.10
2  A C e  0.18
3  A C a  0.34
4  A C c  0.35
5  A C d  0.59
6  A D i  0.16
7  A D j  0.38
8  A D h  0.40
9  A D f  0.53
10 A D g  0.58
11 B C e  0.37
12 B C d  0.62
13 B C a  0.83
14 B C c  1.46
15 B C b -0.91
16 B D f -0.79
17 B D i -0.52
18 B D h -0.43
19 B D j -0.01
20 B D g  0.34

よく見ると、列dは列b内で常に最小から最大の順に並べられていることがわかります。

最初のプロットは、表示されるバーがdの順序ではないという事実とは別に、プロットをどのようにしたいかです。したがって、バーは小さいものから大きいものへと表示されません。

p <- ggplot(df, aes(x=c, y=d, fill=b, stat="identity")) +

facet_grid(. ~ a) +

geom_bar()  

print(p)

barplot1

これは、列cが因子であり、因子が列dと同じ順序ではないように見えるためです。だから私は次のことをしました:

df$c <- paste(1:nrow(df), df$c, sep="_")

df$c <- factor(df$c, levels = unfactor(df$c))

p <- ggplot(df, aes(x=c, y=d, fill=b, stat="identity")) +

            facet_grid(. ~ a) +

            geom_bar()  

print(p)

次のプロットを生成します。

ここに画像の説明を入力してください

ここでの順序は正しいです。ただし、ご覧のとおり、AとBにそれぞれ存在しないスペースに対して、独自のファクターを作成しました。

どうすればそれを整理できますか?

4

2 に答える 2

0

質問を変更したので、「ggplot」はこれを行うことができません。[df$c] レベルを指定すると、データを並べ替えることができますが、[c] 値の最初のセットにのみ基づいています。例えば:

df$c <- factor(df$c, levels=levels(df$c)[order(df$d)])

しかし、[df$c] を 2 回 (「A」に対して 1 回、「B」に対して 1 回) ソートしようとしているため、これは機能しません。

これを 2 つの別々のプロットに分割し、2 つのビューポートを並べてプロットする必要があります。

ビューポートの設定:

grid.newpage()
pushViewport(viewport(layout = grid.layout(1, 2)))

プロット A :

a_df <- df[df$a=="A",]
a_df$c <- factor(a_df$c, levels=levels(a_df$c)[order(a_df$d)])

a_p <- ggplot(a_df, aes(x=1:10, y=d, fill=b)) +
facet_grid(. ~ a) +
geom_bar(stat="identity", position="dodge")

print(a_p, vp = viewport(layout.pos.row=1, layout.pos.col=1))

プロット B :

b_df <- df[df$a=="B",]
b_df$c <- factor(b_df$c, levels=levels(b_df$c)[order(b_df$d)])

b_p <- ggplot(b_df, aes(x=1:10, y=d, fill=b)) +
facet_grid(. ~ a) +
geom_bar(stat="identity", position="dodge")

print(b_p, vp = viewport(layout.pos.row=1, layout.pos.col=2))

ここから、余分な凡例の削除、ラベル付けする軸の選択などについて心配することができますが、空の場所が削除されているだけで、例のプロットとまったく同じように見えます。

これは、「ggplot」が時々邪魔になり、恩恵が少なくなる例です。私の経験では、最初にプロットを設計してからツールを選択するのが最善です。「グリッド」ラッパー「ggplot」ではできないことが必要なため、ビジュアルを作成するために未加工の「グリッド」に戻ることがよくあります。

注: 今後は、元の質問の内容を削除しないでください。更新された情報を追加するだけです。古いコンテンツを削除すると、このページの多くの回答とコメントが無関係になります。

于 2013-01-25T19:22:32.910 に答える
0

これは実際には「ggplot」関数でよくある間違いだと思います。輪郭の色 (つまりaes(colour="red")) を設定すると、実際には 4 つの値すべてがプロットされていることがわかりますが、それらは互いに重ねてプロットされています。スタック警告は、'position' のデフォルト値が "stack" であるためです。position="dodge"引数を含めるだけで、それはなくなります。

さて、実際に問題を解決します。X(A)、X(B)、Y(A)、および Y(B) の値を区別するには、「ggplot」に何かを指定する必要があります。一見すると、[b] 値を使用したくなるかもしれませんが、余分なスペースをすべて使用する必要はありません。[b] が 1 と 2 だけになるようにデータフレームを調整しましょう。

df <- data.frame(a=rep(rep(c("A","B"),each=2),2), 
b=rep(1:2,4), 
c=rep(c("X","Y"),each=4), 
d=c(1.2,1.1,1.15,1.1, -1.1,-1.05,-1.2,-1.08))

問題がわかれば、プロットは実際には非常に簡単に修正できます。まず、[b] を x 軸に設定し、[a] をファセットに追加します。次に、空の要素を持つ「テーマ」を使用して、[b] から迷惑な意味不明な部分をすべて削除します。

p <- ggplot(NULL, aes(x=b, y=d)) +      
facet_grid(. ~ c + a) +
geom_bar(data = df, stat="identity", position="dodge") +
theme(axis.ticks = element_blank(), axis.text.x = element_blank(), axis.title.x = element_blank())

print(p)

これがまさにあなたが望むものではない場合は、少なくとも表面的な変更を行うだけで済むように、十分に近いものにする必要があります. 幸運を!

于 2013-01-25T16:49:38.383 に答える