2015-07-28 14 views
5

I colori del grafico a barre si basano su 'MaskID' e in questo codice sono in grado di fare i nomi 'MaskID' in etichette di testo, ma voglio che i nomi siano centrati su i loro colori corrispondenti.Centratura etichette di testo su grafici a barre impilati

Come lo faresti?

p <- ggplot(df, aes(x, y)) 
p <- p + xlab("xlabel") 
p <- p + ylab("ylabel") 
p <- p + ggtitle("ylabel vs xlabel") 
p <- p + geom_bar(stat="identity", aes(fill=MaskID)) 
p <- p + theme(axis.text.x = element_text(angle=90, vjust=-0.005)) 
p <- p + geom_text(aes(label = ifelse(y != 0, as.character(MaskID), ''), angle=90)) 

(Considera anche che le etichette di testo non mostrano per i bar con 0 valori y)

 MaskID  x  y 
0  ABC Name1  0 
1  ABC Name2  0 
2  ABC Name3  1 
3  ABC Name4  0 
..  ...  ... ... 
100  DEF Name1  0 
101  DEF Name2  0 
102  DEF Name3  3 
103  DEF Name4  4 
104  DEF Name5  0 

Ecco parte del grafico che sto costruendo:

enter image description here

+1

A [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) sarebbe grande. –

+0

Pubblicato un esempio di base sopra di ciò che i miei dati sembrano un po '! – anonymous

+1

Con [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), intendo qualcosa che possiamo riprodurre. –

risposta

5

Questo sembra funzionare, anche se è un po 'complesso per questo penso. Usa ggplot_build per estrarre i dati che descrivono le posizioni delle barre, trova i loro punti medi e le etichette appropriate, quindi aggiunge il testo.

## Make the graph (-the text parts) 
p <- ggplot(df, aes(x, y)) 
p <- p + xlab("xlabel") 
p <- p + ylab("ylabel") 
p <- p + ggtitle("ylabel vs xlabel") 
p <- p + geom_bar(stat="identity", aes(fill=MaskID)) 
p <- p + theme(axis.text.x = element_text(angle=90, vjust=-0.005)) 

## Get the bar data from ggplot 
dd <- ggplot_build(p)[[1]][[1]] 

## Get the y-values in the middle of bars 
xy <- unique(dd[dd$y != 0, c("x", "y")]) 
dat <- with(xy, data.frame(
    x=x, 
    y=unlist(sapply(split(y, x), function(z) diff(c(0, z))/2 + head(c(0, z), -1))) 
)) 

## Get the labels 
labels <- with(df[df$y!=0,], unlist(split(MaskID, x))) 

## Add the text using the new xy-values and labels 
p + geom_text(data=dat, aes(x, y), label=labels, angle=90) 

enter image description here

+0

Grazie! Le etichette di testo si trovano ora al centro della barra ... ma invece di mettere i nomi MaskID come etichette, si mettono i numeri y-value di quanto sono alte le barre. – anonymous

+0

Cosa intendi per "etichette"? I nomi in MaskID sono costituiti da numeri e caratteri + numeri – anonymous

+0

Oh, mi dispiace! E la variabile 'etichette' è una lista di nomi di testo seguiti dal loro numero corrispondente. Ad esempio, Name3 avrebbe un numero sotto e Name4 avrebbe un altro numero sotto di esso, ecc. – anonymous