2017-02-18 53 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。 6个变量: $语言:因子w/8级别“c”,“c#”,“C++”,..:1 1 1 2 2 2 3 3 3 $ tone:因子w/3级别为“negative” “neutral”,..: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您需要通过指定控制顺序的级别来对其进行格式化。检查'水平(数据$口气)' –