3

関連: 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が因子レベルの順序ではなく、アルファベット順のプロット順序に戻るのはなぜですか?
  • プロットの「特別な扱い」のために行を選び出す別の(またはより良い方法)はありますか?
4

2 に答える 2

5

必要なものを取得する他の 2 つの方法:

  1. 使用scale_x_discrete(drop=FALSE)これが必要なのは、使用している 2 つのデータ セットの x 値が同じではないにもかかわらずlevels()、係数が同じであるためです。

    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(drop = FALSE)
    p
    
  2. 派生した美学とマップを使用した色 (まあ、塗りつぶし)

    ggplot(test, aes(x=names,  y=y, fill=(names=="Last"))) +
      geom_bar() +
      scale_fill_manual(breaks = c(FALSE,TRUE), 
                        values = c("black", "darkgreen"),
                        guide = "none")
    

どちらも、あなたの答えに似たグラフを提供します。

于 2012-07-20T20:35:44.947 に答える
3

はぁ...

答え、上記の 2 番目の関連する質問 ( ggplot で離散 x スケールの順序を変更する方法は? ) にありましたが、さらに下にあり、受け入れられませんでした。これを手動で行う方法は経由ですが、その方法scale_x_discreteだと思いbreaks=ました。実際に使用してlimits=います。

私が探していたことを行うための適切なコードは次のとおりです。

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(limits=test$names[c(1:3, 5:7, 4)])
p

または、すでにレベルを再配置しているため、次のようになります。

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(limits=levels(test$names))
p

ここに画像の説明を入力

于 2012-07-20T17:19:37.957 に答える