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?


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.