Umieść geom_text na unikniętym wykresie słupkowym

99

Starałem się, aby tytuł był oczywisty, ale proszę bardzo - najpierw dane:

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")))

Chciałbym stworzyć uniknięty wykres słupkowy, zrobić coord_flipi umieścić kilka etykiet tekstowych wewnątrz pasków:

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()

możesz zobaczyć dane wyjściowe tutaj .

wprowadź opis obrazu tutaj

Myślę, że proszę o coś trywialnego. Chcę, aby etykiety tekstowe „podążały” za ułożonymi słupkami. Etykiety są prawidłowo umieszczone na osi Y, ale jak prawidłowo je ustawić na osi X?

aL3xa
źródło
Tak ... Powinienem był to opublikować na liście mailingowej ggplot2. Nie chcę przesyłać postów, więc założę kapelusz cierpliwości i zaczekam, aż @hadley coś wymyśli! =)
aL3xa
Myliłem się. I najwyraźniej muszę lepiej zapoznać się z pakietem ggplot.
Joris Meys

Odpowiedzi:

157

Czy to jest to, czego chcesz?

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()

Klawisz używa position = position_dodge(width = 1)zamiast position = "dodge", co jest po prostu skrótem bez żadnego parametru.

wprowadź opis obrazu tutaj


W ggplot2_2.0.0rozdziale znajduje się kilka przykładów ?geom_textpozycjonowania geom_textna słupkach unikanych lub ułożonych w stos (fragment kodu o nazwie „ # Aligning labels and bars") .Pytanie i odpowiedzi Co to jest argument szerokości w pozycji position_dodge? Zawiera dokładniejszy opis tematu.

kohske
źródło
1
Dokładnie to, czego chcę! Jestem ci winien piwo za to! =)
aL3xa
2
Czy nie ma więc sposobu na zautomatyzowanie tego? Zawsze należy określić szerokość?
vashts85
12
To działało tylko dla mnie po dodaniu fill = ustanovado geom_textwarstwy, która ma sens zwłaszcza, gdy masz wiele poziome paski (może tylko potrzebne do barów na 3+ x) i liczba przerw musi być taka sama dla tekstu, ponieważ jest to dla barów .
Alan
3
Dla fasetowanych i unikanych jest to przydatna odpowiedź: stackoverflow.com/a/26661791/1000343
Tyler Rinker,
@Alan spośród wszystkich wyszukiwań, które przeprowadziłem na stackoverflow, Twoja odpowiedź była jedyną, która rozwiązała mój problem.
DR15