Маркировка столбчатой ​​диаграммы с накоплением положительными и отрицательными значениями - PullRequest
0 голосов
/ 28 февраля 2019

Я использую ggplot2 для создания столбчатой ​​диаграммы с отрицательными значениями и пытаюсь добавить сумму частей в виде метки в верхней части каждого столбца.Код отлично работает для баров без отрицательных значений, но метка, когда присутствует отрицательное значение, остается внутри бара.

Пример:

test = c("Test1", "Test1", "Test1", "Test2", "Test2", "Test2", "Test3", "Test3", "Test3")  
student = c("A", "B", "C", "A", "B", "C", "A", "B", "C")  
value = c(5,5,5,3,3,3,-2,6,7)

dummy = data.frame(test, student, value)

g = ggplot(data=dummy, aes(x=student, y=value, fill=test)) +   
      geom_bar(stat="identity") +   
      scale_fill_manual(values=c("brown4", "steelblue", "goldenrod3")) +
      geom_text(aes(label=value), size =3, position=position_stack(vjust=0.5), colour="white") +
      theme_classic() + 
      theme(text=element_text(family="serif", size=15, colour="black")) +   
      theme(axis.title=element_text(family="serif", size=15, colour="black")) +   
      theme(legend.title = element_blank()) +   
      theme(legend.position = c(0.2, 0.7)) +
      stat_summary(fun.y = sum, aes(label = ..y.., group = student), geom = "text", vjust = -1) +
      scale_y_continuous(limits = c(-4,20))

g

В результате получается следующая диаграмма:

Chart with stacked bars and negative values Сумма для столбцов без отрицательного значения отлично работает в верхней части столбца, но сумма для столбца с отрицательным значением (студент А) находится в середине красного столбца.

Как я могу это исправить?

1 Ответ

0 голосов
/ 01 марта 2019

Вы используете fun.y = sum в качестве сводной функции, которая добавляет все значения y в группу, включая отрицательные значения.Это дает правильную сумму для метки, но плохую позицию.Для расчета позиции мы хотим вычислить сумму только из значений больше 0.

stat_summary давайте зададим до 3 функций, fun.y, fun.ymin и fun.ymax.Мы изменим fun.y, положение, чтобы быть суммой положительных значений, и мы добавим fun.ymax в качестве регулярного sum и используем это для метки:

g = ggplot(data=dummy, aes(x=student, y=value, fill=test)) +   
      geom_bar(stat="identity") +   
      scale_fill_manual(values=c("brown4", "steelblue", "goldenrod3")) +
      geom_text(aes(label=value), size =3, position=position_stack(vjust=0.5), colour="white") +
      theme_classic() + 
      theme(text=element_text(family="serif", size=15, colour="black")) +   
      theme(axis.title=element_text(family="serif", size=15, colour="black")) +   
      theme(legend.title = element_blank()) +   
      theme(legend.position = c(0.2, 0.7)) +
      stat_summary(fun.y = function(y) sum(y[y > 0]), fun.ymax = sum,
                   aes(label = ..ymax.., group = student), geom = "text", vjust = -1) +
      scale_y_continuous(limits = c(-4,20))
g

enter image description here

...