Центральные ярлыки уложены в стойку ggplot2

Я пытаюсь помещать ярлыки на планшетный график с использованием этого подхода (хотя, если теперь есть лучший подход, я открыт к тому, что когда-либо):

Отображение значений данных на столбчатой ​​гистограмме в ggplot2

Здесь мой оригинальный сюжет:

dat <- data.frame(with(mtcars, table(cyl, gear)))

ggplot(dat, aes(x = gear, fill = cyl)) +
    geom_bar(aes(weight=Freq), position="stack") +
    geom_text(position = "stack", aes(x = gear, y = Freq, 
        ymax = 15, label = cyl), size=4)

enter image description here

Здесь моя попытка центрировать метки в каждом разделе заполнения:

dat2 <- ddply(dat, .(cyl), transform, pos = cumsum(Freq) - 0.5*Freq)

library(plyr)
ggplot(dat2, aes(x = gear, fill = cyl)) +
    geom_bar(aes(weight=Freq), position="stack") +
    geom_text(position = "stack", aes(x = gear, y = pos, 
        ymax = 15, label = cyl), size=4)

enter image description here

Как я могу центрировать метки в каждом разделе заполнения?

Ответ 1

Там было какое-то постороннее действие ddply с этим, поскольку я знал решение, которое я хотел, но испытывал трудности с поддержанием частот, выровненных с позициями, но я думаю, что алгоритм поиска групповых средних точек стоит опубликовать:

group_midpoints = function(g) {
  cumsums = c(0, cumsum(g$Freq))
  diffs = diff(cumsums)
  pos = head(cumsums, -1) + (0.5 * diffs)
  return(data.frame(cyl=g$cyl, pos=pos, Freq=g$Freq))
}

dat3 = ddply(dat, .(gear), group_midpoints)

ggplot(dat3, aes(x = gear, fill = cyl)) +
  geom_bar(aes(weight=Freq), position="stack") +
  geom_text(position = "identity", aes(x = gear, y = pos, ymax = 15, label = cyl), size=4)

enter image description here