2017-02-18 27 views
0

私のデータはggplotバーチャートの凡例に項目の順序に問題が

language tone  count tone_percent label_pos pos 
1 c   positive 3460 36.16977  18.08488 7 
2 c   neutral  2046 21.38825  46.86389 7 
3 c   negative 4060 42.44198  78.77901 7 
4 c#   positive 3732 41.26949  20.63475 3 
5 c#   neutral  1832 20.25876  51.39887 3 
6 c#   negative 3479 38.47175  80.76413 3 
7 c++   positive 3136 33.13960  16.56980 8 
8 c++   neutral  2008 21.21949  43.74934 8 
9 c++   negative 4319 45.64092  77.17954 8 

のように見えると私はggplot2バーチャートを用いて、それらを視覚化しようとしている:

p <-ggplot() + theme_bw() + geom_bar(aes(y=tone_percent, x=reorder(language, -pos), fill=tone), data=data, stat="identity") + 
    geom_text(data=data, aes(x = language, y = label_pos, ymax=label_pos, hjust = 0.5, label = paste0(round(tone_percent),"%")), size=4) + 
    labs(x="Language", y="Percentage of tone") + 
    scale_fill_manual(values=c('#F45E5A', '#5086FF', '#17B12B')) + 
    theme(legend.position="bottom", legend.direction="horizontal", legend.title = element_blank()) + coord_flip() 

それはほぼ優れた結果を与えます: enter image description here

しかし、凡例にはアルファベット順のラベルが表示されますが、同じ順序で表示したいと思いますグラフには棒グラフが描かれています:プラス、ニュートラル、ネガティブ

これを達成する方法はありますか?

+0

良いデュープではありません。そのアプローチはバーの色順も変えてしまうので、それらはまだ伝説と並ばないでしょう。 – alistaire

答えて

2

あなたはバーを並べ替えすることなく、伝説の順序が逆になりますscale機能guide_legend(reverse = TRUE)guidesパラメータを渡すことができます。クリーンアップビット:

ggplot(data, aes(x = reorder(language, -pos), y = tone_percent, fill = tone)) + 
    geom_col() + 
    geom_text(aes(y = label_pos, label = paste0(round(tone_percent),"%"))) + 
    coord_flip() + 
    labs(x = "Language", y = "Percentage of tone") + 
    scale_fill_manual(NULL, values=c('#F45E5A', '#5086FF', '#17B12B'), 
         guide = guide_legend(reverse = TRUE)) + 
    theme_bw() + 
    theme(legend.position = "bottom", 
      legend.direction = "horizontal") 

plot with correct legend

+0

それは動作します、ありがとうトン – sovo2014

0

トーン変数を係数としてフォーマットする必要があります。

data$tone <- factor(data$tone, levels=c("positive", "neutral", "negative"))

+0

ありがとう、しかし、 "トーン"は実際には要因です、私はそれを確認しました:> str(data) 'data.frame':\t 9 obs。$ language:8レベルの "c"、 "c#"、 "C++"、..:1 1 1 2 2 2 3 3 3 $ tone:3レベルの "負" "中立"、..:3 2 1 3 2 1 3 2 1 $ count:int 3460 2046 4060 3732 1832 3479 3136 2008 4319 $ tone_percent:num 36.2 21.4 42.4 41.3 20.3 ... $ label_pos:num 18.1 46.9 78.8 20.6 51.4 ... $ pos:int 7 7 7 3 3 3 8 8 8 – sovo2014

+0

@ sovo2014オーダーを制御するレベルを指定してフォーマットする必要があります。 'レベル(データ$トーン)'を確認してください –

関連する問題