Подтвердить что ты не робот

Аннотировать значения выше баров (ggplot граненый)

Один из моих любимых трюков в базовой графике - это пикап от Билла Дунлапа. Возможность размещения числовых значений (или любых значений) над полосами на графике (я не использую его, но время от времени, но люблю его).

mtcars2 <- mtcars[order(-mtcars$mpg), ]
par(cex.lab=1, cex.axis=.6, 
    mar=c(6.5, 3, 2, 2) + 0.1, xpd=NA) #shrink axis text and increas bot. mar.

barX <- barplot(mtcars2$mpg,xlab="Cars", main="MPG of Cars", 
   ylab="", names=rownames(mtcars2), mgp=c(5,1,0),
   ylim=c(0, 35), las=2, col=mtcars2$cyl)

mtext(side=2, text="MPG", cex=1, padj=-2.5)
text(cex=.5, x=barX, y=mtcars2$mpg+par("cxy")[2]/2, mtcars2$hp, xpd=TRUE) 

Что дает вам:

enter image description here

Я хочу иметь возможность делать такую ​​же аннотацию с гранями графа в ggplot. Очевидно, что значения также должны были бы совпадать с теми же двумя переменными, которые вы выделили для построения, чтобы вы могли получить их с помощью ftable. Я хотел бы взять результаты ftable ниже (для ненулевых значений) и поместить их выше своих соответствующих баров.

library(ggplot2)
mtcars2 <- data.frame(id=1:nrow(mtcars), mtcars[, c(2, 8:11)])
mtcars2[, -1] <- lapply(mtcars2[, -1], as.factor)

with(mtcars2, ftable(cyl, gear, am))

ggplot(mtcars2, aes(x=cyl)) + geom_bar() + 
    facet_grid(gear~am)

Мне кажется, это довольно сложно, но, возможно, это будет легче, чем я думаю. Заранее благодарю вас за мысль об этой проблеме.

4b9b3361

Ответ 1

Я прав, думая, что вы просто хотите подсчет (то есть высота) каждого ненулевого бара? Если это так, вы можете достичь этого с помощью

ggplot(mtcars2, aes(x=cyl)) + 
  geom_bar() + 
  facet_grid(gear~am) + 
  stat_bin(geom="text", aes(label=..count.., vjust=-1))

Что создает этот график (вам, возможно, придется немного подкорректировать, чтобы показать эту самую яркую метку): enter image description here

count - это новая переменная в dataframe, созданная stat_bin(), поэтому вам нужно ссылаться на нее с помощью ..count..