関連: ggplot2棒グラフの注文バー。その質問は、いくつかの数値特性(たとえば、最大から最小)に基づいた並べ替えを扱います。データに固有ではない任意の理由に基づいて並べ替えたい。
また、ggplotで離散xスケールの順序を変更するにはどうすればよいですか?。これは、以下で行った因子レベルの順序付けを示唆していますが、データをサブセット化するという行為と、必要な因子の順序を維持するという行為を組み合わせることができないようです。
いくつかの製品テストデータがあり、特定のサンプルを棒グラフで目立たせたいと思います。私の特定のケースでは、関心のあるサンプルを片側まで押して、色を変えたいと思います(つまり、強調表示されたサンプルをアルファベット順から右に移動して、緑色にします)。
これが私がやろうとしたことの例です:
library(ggplot2)
test <- data.frame(names = c("A", "B", "C", "Last", "X", "Y", "Z"))
test$y <- 1:7
これをそのままプロットすると、ご存知のように、因子はアルファベット順に並べられます。
ggplot(test, aes(x=Names, y=y)) + geom_bar()
私は次のようにレベルを再配置しました:
test$names <- factor(test$names, levels = test$names[ c(1:3, 5:7, 4) ])
test$names
[1] A B C Last X Y Z
Levels: A B C X Y Z Last
ここまでは順調ですね。今プロットすると、これが得られます。これにより、必要な順序が得られます。
ggplot(test, aes(x=names, y=y)) + geom_bar()
しかし、私は緑に着色したいLast
ので、これを試しました:
p <- ggplot(test[!test$names=="Last" ,], aes(x=names, y=y)) + geom_bar()
p <- p + geom_bar(aes(x=names, y=y), test[test$names=="Last" ,], fill="darkgreen")
p
ggplotに渡されたinsituサブセットを見ると:
test[!test$names=="Last" , ]$names
[1] A B C X Y Z
Levels: A B C X Y Z Last
test[!test$names=="Last" , ]$names
[1] A B C X Y Z
Levels: A B C X Y Z Last
したがって、レベルの順序は正しいですが、ggplotはそれを使用してプロットの順序を決定していません。
問題は同じデータフレームからのプロットデータであるかどうか疑問に思ったので、ggplotが別のデータを最後に追加するかどうか疑問に思ってそれらを分割しました。
test2 <- test[test$names=="Last" , ]
test <- droplevels(test)
test2 <- droplevels(test2)
p <- ggplot(test, aes(x=names, y=y)) + geom_bar()
p <- p + geom_bar(aes(x=names, y=y), test2, fill="darkgreen")
p
結果は最後のグラフと同じですがLast
、中央にあります。
最後に、これはを介して行われる可能性があると思ったscale_x_discrete
ので、これを試しました:
p <- ggplot(test[!test$names=="Last" ,], aes(x=names, y=y)) + geom_bar()
p <- p + geom_bar(aes(x=names, y=y), test[test$names=="Last" ,], fill="darkgreen")
p <- p + scale_x_discrete(breaks=test$names[c(1:3, 5:7, 4)])
p
私はまだLast
真ん中に入る。
質問
- ggplotが因子レベルの順序ではなく、アルファベット順のプロット順序に戻るのはなぜですか?
- プロットの「特別な扱い」のために行を選び出す別の(またはより良い方法)はありますか?