2016-05-02 36 views
0

注文を保持しながらグループ化された棒グラフを作成したい。単一の列で、グループ化された棒グラフでない場合は、並べ替え機能の使用が明らかです。しかし、溶かしたdata.frameでどのように使用するかはわかりません。ここでggplot2:順序付けされたグループバープロットを作成する - (再注文を使用)

は、コード例と詳細な説明である:それを反転しながら、

d.nfl <- data.frame(Team1=c("Vikings", "Chicago", "GreenBay", "Detroit"), Win=c(20, 13, 9, 12)) 

は、シンプルなバープロットをプロット:

たちはdata.frameを以下しているとしましょう。プロット上の

ggplot(d.nfl, aes(x = Team1, y=Win)) + geom_bar(aes(fill=Team1), stat="identity") + coord_flip() 

順序を持っていないだろうと私は勝利でプロットを注文したい場合、私は次の操作を行うことができます:

d.nfl$orderedTeam <- reorder(d.nfl$Team1, d.nfl$Win) 
ggplot(d.nfl, aes(x = orderedTeam, y=Win)) + geom_bar(aes(fill=orderedTeam), stat="identity") + coord_flip() 

今、私たちは(元のデータフレームに)別の列を追加すると言うことができます

d.nfl$points <- c(12, 3, 45, 5) 

    Team1 Win points 
1 Vikings 20  12 
2 Chicago 13  3 
3 GreenBay 9  45 
4 Detroit 12  5 

グループ化されたバープロットを生成するために、最初に我々はそれを溶融する必要があります。

library(reshape2) 
> d.nfl.melt <- melt(d.nfl[,c('Team1','Win','points')],id.vars = 1) 
> ggplot(d.nfl.melt,aes(x = Team1,y = value)) + geom_bar(aes(fill = variable),position = "dodge", stat="identity") + coord_flip() 

enter image description here

上記のggplotは順序付けられていません。

が、私は、グループバープロット(昇順方式)を注文したんか

+2

初めてファクタレベルを並べ替え、それが機能しました。多分、融解したデータフレームのファクタレベルの順序を設定しようとすると...? – joran

+1

[注文バーのggplot2棒グラフの可能な重複](http://stackoverflow.com/questions/5208679/order-bars-in-ggplot2-bar-graph) – alistaire

+0

何か関連[ここ](http:// stackoverflow。 com/questions/1721536/gogplot2-barplotの変更点 - )積み重ねると、プロットする前にデータセットを注文するだけで済みますが、それは避けるためには動作しません。 – aosmith

答えて

2

これは、非問題です。私たちは溶融後reorderを使用して、ちょうどのみ発注計算にWin要素を使用することができ、また

d.nfl.melt <- melt(d.nfl,id.vars = c("Team1", "orderedTeam")) 

d.nfl.melt$ordered_after_melting = reorder(
    d.nfl.melt$Team1, 
    X = d.nfl.melt$value * (d.nfl.melt$variable == "Win") 
) 

最も簡単な方法は、溶融物中にあなたの注文したチームを破棄しないことです

さらに別のアイデアは、元の注文列からlevelsを取り出して、溶解した係数に適用することです:

d.nfl.melt$copied_levels = factor(
    d.nfl.melt$Team1, 
    levels = levels(d.nfl$orderedTeam) 
) 

3つの方法はすべて同じ結果を示します。 (彼らは質問に何も追加しないので、私はcoord_flipsを省略しましたが、もちろんそれらを再び追加することができます。最も簡単にとして)

gridExtra::grid.arrange(
    ggplot(d.nfl.melt,aes(x = orderedTeam, y = value)) + 
     geom_bar(aes(fill = variable),position = "dodge", stat="identity"), 
    ggplot(d.nfl.melt,aes(x = ordered_after_melting, y = value)) + 
     geom_bar(aes(fill = variable),position = "dodge", stat="identity"), 
    ggplot(d.nfl.melt,aes(x = copied_levels, y = value)) + 
     geom_bar(aes(fill = variable),position = "dodge", stat="identity") 
) 

enter image description here

、私はちょうど溶かしながら周りorderedTeam変数を維持することをお勧めします。あなたのコードは残しておくのが難しいようですが、それを保持するのはかなり簡単です。

2

あなたの質問が提示課題は、溶融したカラム内のサブセット値に基づいて係数Team1を並べ替える方法です。

@alistaireと@joranからのご質問は、偉大な回答にリンクしています。 tl; drの答えは、元の未溶けのdata.frameからlevels()を使って新しいものに注文を適用することです。

library(reshape2) 
#Picking up from your example code: 
d.nfl.melt <- melt(d.nfl[,c('Team1','Win','points')],id.vars = 1) 
levels(d.nfl.melt$Team1) 
#Current order is alphabetical 
#[1] "Chicago" "Detroit" "GreenBay" "Vikings" 

#Reorder based on Wins (using the same order from your earlier, unmelted data.frame) 
d.nfl.melt$Team1 <- factor(d.nfl.melt$Team1, levels = levels(d.nfl$orderedTeam)) #SOLUTION 
levels(d.nfl.melt$Team1) 
#New order is ascending by wins 
#[1] "GreenBay" "Detroit" "Chicago" "Vikings" 

ggplot(d.nfl.melt,aes(x = Team1,y = value)) + 
    geom_bar(aes(fill = variable),position = "dodge", stat="identity") + coord_flip() 

enter image description here

関連する問題