2017-02-18 43 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.frame': \t 9 obs. из 6 переменных: $ Язык: коэффициент с 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 Вам необходимо отформатировать его, указав уровни для управления порядком. Проверить 'уровни (данные $ тон)' –