2012-03-22 20 views
21

Uno dei miei trucchi preferiti nella grafica di base è un ritiro da Bill Dunlap. Essere in grado di posizionare valori numerici (o qualsiasi valore) sopra le barre in un grafico a barre (non lo uso ma di tanto in tanto, ma lo adoro).Annota i valori sopra le barre (ggplot sfaccettato)

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) 

che ti dà:

enter image description here

Voglio essere in grado di fare lo stesso tipo di annotazione con trame a barre sfaccettate in ggplot. Ovviamente i valori dovrebbero anche essere dalle stesse due variabili sfaccettate per tracciare in modo da poterle ottenere con il ftable. Mi piacerebbe prendere i risultati della tabella a tendina sotto (per valori diversi da zero) e posizionarli sopra le rispettive barre.

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) 

Questo sembra piuttosto difficile per me, ma forse sarà più facile di quanto io pensi. Grazie in anticipo per aver pensato a questo problema.

+0

È rilevante? http://stackoverflow.com/a/9185168/1036500 – Ben

+0

@ben Penso che tu sia sulla soluzione ma non riesco a collegarlo a 'facet_grid' –

+0

È interessante notare che questo tipo di etichettatura è considerato da alcune persone per rendere mostra più confusione e dovrebbe essere evitato: http://stackoverflow.com/q/6644997/1036500 e http://stackoverflow.com/a/9318468/1036500 – Ben

risposta

23

Ho ragione nel pensare che vuoi solo il conteggio (cioè l'altezza) di ciascuna barra diversa da zero? Se è così, è possibile ottenere che con

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

che produce questo grafico (potrebbe essere necessario fare qualche ritocco per ottenere che l'etichetta più alto per mostrare): enter image description here

count è una nuova variabile in un dataframe creato da stat_bin(), motivo per cui è necessario fare riferimento a ..count..

Problemi correlati