Positioniere geom_text auf einem ausgewichenen Barplot

94

Ich habe versucht, den Titel selbsterklärend zu machen, aber hier ist es - Daten zuerst:

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

Und ich möchte ein ausgewichenes Barplot erstellen, das tun coord_flipund einige Textbeschriftungen in die Balken einfügen :

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

Sie können die Ausgabe hier sehen .

Geben Sie hier die Bildbeschreibung ein

Ich glaube, ich bitte um etwas Triviales. Ich möchte, dass die Textbeschriftungen gestapelten Balken "folgen". Beschriftungen werden korrekt auf der y-Achse platziert, aber wie werden sie korrekt auf der x-Achse positioniert?

aL3xa
quelle
Yepp ... Ich hätte diesen auf der Mailingliste von ggplot2 veröffentlichen sollen. Ich möchte nicht überkreuzen, also werde ich meinen Geduldshut aufsetzen und darauf warten, dass @hadley sich etwas einfallen lässt! =)
aL3xa
Ich lag falsch. Und ich muss mich anscheinend besser mit dem ggplot-Paket vertraut machen.
Joris Meys

Antworten:

150

Ist das was du willst?

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

Die Taste wird position = position_dodge(width = 1)anstelle von verwendet position = "dodge", was nur eine Verknüpfung ohne Parameter ist.

Geben Sie hier die Bildbeschreibung ein


In ggplot2_2.0.0finden Sie einige Beispiele ?geom_textzum Positionieren geom_textauf ausgewichenen oder gestapelten Balken (der Codeblock mit dem Namen " # Aligning labels and bars"). Die Fragen und Antworten Wie lautet das Argument width in position_dodge? Enthält eine ausführlichere Beschreibung des Themas.

kohske
quelle
1
Genau das, was ich will! Ich schulde dir ein Bier für dieses! =)
aL3xa
2
Gibt es also keine Möglichkeit, dies zu automatisieren? Man muss immer die Breite angeben?
vashts85
10
Dies hat bei mir erst funktioniert, nachdem ich fill = ustanovadie geom_textEbene hinzugefügt habe. Dies ist besonders dann sinnvoll, wenn Sie viele horizontale Balken haben (möglicherweise nur für mehr als 3 Balken pro x erforderlich) und die Anzahl der Unterbrechungen für den Text dieselbe sein muss wie für die Balken .
Alan
3
Für facettierte und ausgewichene ist dies eine nützliche Antwort: stackoverflow.com/a/26661791/1000343
Tyler Rinker
@ Alan unter all den Suchanfragen, die ich im Stackoverflow durchgeführt habe, war Ihre Antwort die einzige, die mein Problem gelöst hat.
Ga13