2014-07-08 10 views
7

Sto stampando un grafico a barre in pila e utilizzo geom_text per inserire il valore di ogni pila. La difficoltà che sto affrontando è che alcuni stack sono molto piccoli/stretti, quindi il testo di due stack si sovrappone e quindi non è molto leggibile. Vorrei regolare il posizionamento del testo in modo che, ad esempio, la posizione del testo si alterni tra hjust == 1 e hjust == -1 per ogni stack, in modo che non vi siano sovrapposizioni (o qualsiasi altro metodo che risulterà in testo leggibile).Posizione geom_text alternativa con hjust

Ecco un esempio di quello che sto facendo attualmente (un dput di mydf si riportano di seguito):

library(ggplot2) 

ggplot(mydf, aes(x=variable, y = value, fill = Category)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label = value, y = pos-(value/2)), size = 3) 

Quello che ho provato finora è:

Utilizzando position = position_dodge(width = 0.5) e position = position_jitter(h =0.5, w = 0.5) ma nessuno ha portato quello che stavo cercando di fare.

Il mio primo pensiero è stato quello di definire hjust = c(1,-1) sperando che sarebbe stato riciclato e testi sarebbe alternare hjust == 1 e hjust == -1 ma risulta nel messaggio di errore:

Error: Incompatible lengths for set aesthetics: size, hjust 

Ho provato anche la definizione size = c(3,3,3,3,3,3,3,3,3), hjust = c(1,-1,1,-1,1,-1,1,-1,1) ma questo si traduce nella stesso messaggio di errore.

Gradirei qualche consiglio su come ottenere ciò nel modo giusto (e sono aperto anche ad altri suggerimenti).

non riuscivo a capire perché la dput non ha funzionato (anche per me non ha fatto), quindi ecco i dati in formato leggibile:

Category variable value pos maxpos 
1  AX  WW 47.8 47.8 184.1 
2  AY  WW 5.6 53.4 184.1 
3  AZ  WW 15.8 69.2 184.1 
4  BX  WW 31.4 100.6 184.1 
5  BY  WW 11.7 112.3 184.1 
6  BZ  WW 10.7 123.0 184.1 
7  CX  WW 2.2 125.2 184.1 
8  CY  WW 21.4 146.6 184.1 
9  CZ  WW 37.5 184.1 184.1 
10  AX  SM 39.8 39.8 148.6 
11  AY  SM 2.9 42.7 148.6 
12  AZ  SM 13.2 55.9 148.6 
13  BX  SM 22.7 78.6 148.6 
14  BY  SM 7.3 85.9 148.6 
15  BZ  SM 8.9 94.8 148.6 
16  CX  SM 1.6 96.4 148.6 
17  CY  SM 17.3 113.7 148.6 
18  CZ  SM 34.9 148.6 148.6 
19  AX  AsIs 156.9 156.9 519.0 
20  AY  AsIs 13.1 170.0 519.0 
21  AZ  AsIs 70.5 240.5 519.0 
22  BX  AsIs 72.6 313.1 519.0 
23  BY  AsIs 30.7 343.8 519.0 
24  BZ  AsIs 35.6 379.4 519.0 
25  CX  AsIs 5.2 384.6 519.0 
26  CY  AsIs 44.8 429.4 519.0 
27  CZ  AsIs 89.6 519.0 519.0 
+0

non riesco a caricare il 'dput' per qualche motivo –

+0

@DavidArenburg , Non so cosa fosse sbagliato, spero non ti dispiaccia usare l'altro formato. –

risposta

9

Con la creazione di una variabile hjust, è possibile raggiungere il risultato desiderato. Il codice:

mydf$hj <- rep(c(1,0,-1), length.out=27) 

ggplot(mydf, aes(x=variable, y=value, fill=Category)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=value, y=pos-(value/2), hjust=hj), size=4) 

che dà: enter image description here


Una soluzione un po 'alternativa proposta da @konvas:

ggplot(mydf, aes(x=variable, y=value, fill=Category)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=value, y=pos-(value/2), hjust=rep(c(1,0,-1), length.out=length(value))), size=4) 
+0

Grazie Jaap, è proprio quello di cui avevo bisogno :) +1 –

+3

O evitare di creare esplicitamente la nuova variabile e aggiungere 'hjust = rep (c (-1, 1), length.out = length (value))' nel tuo originale chiamare (dentro 'aes'). – konvas

+0

@konvas grazie, questo è un ottimo suggerimento! –