web-dev-qa-db-ja.com

ggplot2:プロットのソート

Data.frameがあり、最高から最低に並べ替えられています。例えば:

x <- structure(list(variable = structure(c(10L, 6L, 3L, 4L, 2L, 8L, 
9L, 5L, 1L, 7L), .Label = c("a", "b", "c", "d", "e", "f", "g", 
"h", "i", "j"), class = c("ordered", "factor")), value = c(0.990683229813665, 
0.975155279503106, 0.928571428571429, 0.807453416149068, 0.717391304347826, 
0.388198757763975, 0.357142857142857, 0.201863354037267, 0.173913043478261, 
0.0496894409937888)), .Names = c("variable", "value"), row.names = c(10L, 
6L, 3L, 4L, 2L, 8L, 9L, 5L, 1L, 7L), class = "data.frame")

ggplot(x, aes(x=variable,y=value)) + geom_bar(stat="identity") + 
 scale_y_continuous("",label=scales::percent) + coord_flip() 

現在、データはニースでソートされていますが、プロットすると、ファクターでソートされて出力されます。迷惑です、どうすれば修正できますか?

54

いくつかの方法があります。

1つ目は、データフレームに表示される順序に基づいて物事を順序付けます。

x$variable <- factor(x$variable, levels=unique(as.character(x$variable)) )

2番目は、別の変数(この場合は値)に基づいてレベルを順序付けます:

x <- transform(x, variable=reorder(variable, -value) ) 
61
Greg Snow

これはあなたが探しているもののようです:

_g <- ggplot(x, aes(reorder(variable, value), value))
g + geom_bar() + scale_y_continuous(formatter="percent") + coord_flip()
_

reorder()関数は、valuevariableに従ってx軸アイテムを並べ替えます。

75
djmuseR

私は最近、関連する問題に苦労していますが、ここで詳しく説明します: coord_flip()を使用したggplot2バープロットの凡例エントリの順序 .

偶然にも、私が問題を明確に説明するのに苦労した理由は、ここにあるように、因子(の順序)とcoord_flip()の関係に関係していました。

+ xlim(rev(levels(x$variable)))をggplotステートメントに追加することで、目的の結果が得られます。

_ggplot(x, aes(x=variable,y=value)) + geom_bar() + 
scale_y_continuous("",formatter="percent") + coord_flip() 
+  xlim(rev(levels(x$variable)))
_

これにより、要素の順序が逆になります元のデータフレームにあるとおり x軸で、coord_flip()でy軸になります。この特定の例では、変数もアルファベット順になっていますが、xlim()内でレベルの任意の順序を指定すると一般的に機能することに注意してください。

9
MatteoS

この質問が再び開かれた理由はわかりませんが、ここにtidyverseオプションがあります。

x %>% 
  arrange(desc(value)) %>%
  mutate(variable=fct_reorder(variable,value)) %>% 
ggplot(aes(variable,value,fill=variable)) + geom_bar(stat="identity") + 
  scale_y_continuous("",label=scales::percent) + coord_flip() 
2
NelsonGon

Xファクターを、希望する順序でorderedファクターにする必要があります。

x <- data.frame("variable"=letters[1:5], "value"=rnorm(5)) ## example data
x <- x[with(x,order(-value)), ] ## Sorting
x$variable <- ordered(x$variable, levels=levels(x$variable)[unclass(x$variable)])

ggplot(x, aes(x=variable,y=value)) + geom_bar() +
   scale_y_continuous("",formatter="percent") + coord_flip()

私は注文操作を行うためのより良い方法を知りません。私が持っているものは、x$variableに重複するレベルがない場合にのみ機能します。

2
zwol