2016-11-06 1 views
1

Da ich neu bei R bin, habe ich sehr einfache horizontale Balkenplots mit ggplot2 und coord_flip() erstellt. Bemerkenswerterweise füge I die Werte des x-Variable auf der linken Seite der Leiste standardmäßig (oder auf der rechten Seite, wenn das Etikett paßt nicht) mit dem folgenden Befehl:ggplot2 bar plot: hjjust je nach Balken und Etikettengröße

geom_text(aes(x=TYPE, y=COUNT, ymax=COUNT, label=COUNT, 
      hjust=ifelse(COUNT>1000, 1.5, -0.3)), 
      size=3.5, position = position_dodge(width=0.8)) 

Das Problem ist, dass, abhängig von den Datensätzen können die x-Werte erheblich variieren (z. B. Datensatz_1 x Werte können zwischen 1 und 200 liegen; Datensatz_2 x Werte können zwischen 10.000 und 100.000 liegen; ...), wodurch die Bezeichnung des kürzesten Balkens entsteht falsch platziert mit der ifelse Anweisung, die ich verwende (siehe braunen Balken in Abbildung A unten). In diesem Fall kann ich nicht einfach eine konstante COUNT>1000 Bedingung für alle Datensätze verwenden.

Abbildung A:

enter image description here

ich für jeden Datensatz manuell den Wert der hjust=ifelse(COUNT>1000,... Anweisung ändern könnte. Aber ich frage mich, ob es möglich ist, die Label-Outs der Bar automatisch zu verschieben, wenn sie nicht zwischen die Achse und den oberen Rand der Bar passt, ohne den Wert der ifelse Bedingung für jeden Datensatz zu ändern, wie in Abbildung B unten.

Abbildung B:

enter image description here

EDIT

Behelfslösung (nicht perfekt, aber besser): das Etikett an der rechten Seite der Leiste vergeben, wenn der Wert weniger als 5% des Maximums ist Wert

+0

Nein, es ist nicht. – Gregor

Antwort

0

Einige Etiketten außerhalb der Bars und einige im Inneren können die visuelle Codierung von mag verzerren Länge als die Länge der Bar. Eine andere Möglichkeit besteht darin, die Werte in die Mitte des Balkens zu setzen, aber geom_text zu setzen, um Werte zu überspringen, die relativ zum maximalen Balken klein sind. Wenn Sie Text für alle hinzugefügten Balkenwerte einfügen möchten, können Sie sie unter die Balken setzen, um ein sauberes visuelles Muster für die Balkenlängen zu erhalten. Beispiele für beide Optionen sind unter:

# Fake data 
dat = data.frame(x = LETTERS[1:5], y=c(432, 1349, 10819, 5489, 12123)) 

ggplot(dat, aes(x, y, fill=x)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=ifelse(y < 0.05*max(dat$y), "", format(y, big.mark=",")), y=0.5*y), 
      colour="white") + 
    coord_flip(xlim=c(0.4,5.6), ylim=c(0, 1.03*max(dat$y)), expand=FALSE) + 
    guides(fill=FALSE) 

ggplot(dat, aes(x, y, fill=x)) + 
    geom_hline(yintercept=0, lwd=0.3, colour="grey40") + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=format(y, big.mark=","), y=-0.01*max(dat$y)), 
      size=3.5, hjust=1) + 
    coord_flip(ylim = c(-0.04*max(dat$y), max(dat$y))) + 
    guides(fill=FALSE) 

enter image description here

+0

Danke! Ihre Strategie scheint der sauberste automatische Weg zu sein. – user31888