Posiziona geom_text su barplot schivato


96

Ho provato a rendere il titolo autoesplicativo, ma ecco qua: prima i dati:

dtf <- structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 
4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", "fla"), class = "factor"), 
    ustanova = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L), .Label = c("srednja škola", "fakultet"), class = "factor"), 
    `(all)` = c(42.9542857142857, 38.7803203661327, 37.8996138996139, 
    33.7672811059908, 29.591439688716, 26.1890660592255, 27.9557692307692, 
    23.9426605504587, 33.2200772200772, 26.9493087557604)), .Names = c("variable", 
"ustanova", "(all)"), row.names = c(NA, 10L), class = c("cast_df", 
"data.frame"), idvars = c("variable", "ustanova"), rdimnames = list(
    structure(list(variable = structure(c(1L, 1L, 2L, 2L, 3L, 
    3L, 4L, 4L, 5L, 5L), .Label = c("vma", "vla", "ia", "fma", 
    "fla"), class = "factor"), ustanova = structure(c(1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("srednja škola", 
    "fakultet"), class = "factor")), .Names = c("variable", "ustanova"
    ), row.names = c("vma_srednja škola", "vma_fakultet", "vla_srednja škola", 
    "vla_fakultet", "ia_srednja škola", "ia_fakultet", "fma_srednja škola", 
    "fma_fakultet", "fla_srednja škola", "fla_fakultet"), class = "data.frame"), 
    structure(list(value = structure(1L, .Label = "(all)", class = "factor")), .Names = "value", row.names = "(all)", class = "data.frame")))

E mi piacerebbe creare un barplot schivato, fare coord_flipe inserire alcune etichette di testo all'interno delle barre:

ggplot(bar) + geom_bar(aes(variable, `(all)`, fill = ustanova), position = "dodge") +
 geom_text(aes(variable, `(all)`, label = sprintf("%2.1f", `(all)`)), position = "dodge") +
 coord_flip()

puoi vedere l'output qui .

inserisci qui la descrizione dell'immagine

Mi sa che sto chiedendo qualcosa di banale. Voglio che le etichette di testo "seguano" le barre impilate. Le etichette sono posizionate correttamente sull'asse y, ma come posizionarle correttamente sull'asse x?


Sì ... avrei dovuto postare questo sulla mailing list ggplot2. Non voglio cross-post, quindi mi metterò il cappello della pazienza e aspetterò che @hadley tiri fuori qualcosa! =)
aL3xa

Mi sbagliavo. E a quanto pare ho bisogno di familiarizzare con il pacchetto ggplot.
Joris Meys

Risposte:


154

È questo che vuoi?

ggplot(bar) + 
  geom_bar(aes(variable, `(all)`, fill = ustanova), position = "dodge") +
  geom_text(aes(variable, `(all)`, label = sprintf("%2.1f", `(all)`)), 
            position = position_dodge(width = 1)) + 
  coord_flip()

La chiave sta usando position = position_dodge(width = 1)invece di position = "dodge", che è solo una scorciatoia senza alcun parametro.

inserisci qui la descrizione dell'immagine


In ggplot2_2.0.0si trovano diversi esempi ?geom_textsu come posizionarsi geom_textsu barre schivate o impilate (il blocco di codice denominato " # Aligning labels and bars"). La sezione Domande e risposte Qual è l'argomento della larghezza in position_dodge? Fornisce una descrizione più completa dell'argomento.


1
Esattamente quello che voglio! Ti devo una birra per questo! =)
aL3xa

2
Quindi non c'è modo di automatizzarlo? Bisogna sempre specificare la larghezza?
vashts85

12
Questo ha funzionato solo per me dopo aver aggiunto fill = ustanovanel geom_textlivello, il che ha senso soprattutto quando hai molte barre orizzontali (forse necessarie solo per 3 o più barre per x) e il numero di interruzioni deve essere lo stesso per il testo come per le barre .
Alan

3
Per sfaccettati e schivati ​​questa è una risposta utile: stackoverflow.com/a/26661791/1000343
Tyler Rinker

@Alan tra tutte le ricerche che ho fatto sullo stackoverflow, la tua risposta è stata l'unica che ha risolto il mio problema.
Ga13
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.