2015-06-03 11 views
8

Ich möchte ein einfaches Balkendiagramm mit ggplot2 erstellen und mein Problem ist, dass meine X-Variable lange Strings enthält, so dass die Beschriftungen überlagert werden.Erstellen Sie abgekürzte Legenden manuell für lange X-Labels in ggplot2

Hier sind gefälschte Daten und die Handlung:

library(dplyr) 
library(tidyr) 
library(ggplot2) 

set.seed(42) 
datas <- data.frame(label = sprintf("aLongLabel%d", 1:8), 
      ok = sample(seq(0, 1, by = 0.1), 8, rep = TRUE)) %>% 
    mutate(err = abs(ok - 1)) %>% 
    gather(type, freq, ok, err) 

datas %>% 
    ggplot(aes(x = label, y = freq)) + 
    geom_bar(aes(fill = type), stat = "identity") 

enter image description here

Ich möchte die Etiketten durch kürzere ersetzen und eine Legende erstellen, um die Spiele zu zeigen.

Was ich versucht habe:

ich die Form aes Parameter in geo_point verwenden, die eine Legende mit Formen erstellen (und Plots Formen, die ich mit alpha = 0 verstecken). Dann wechsle ich die Formen mit scale_shape_manual und ersetze die x-Etiketten durch scale_x_discrete. Mit guides überschreibe ich den Alpha-Parameter meiner Formen, damit sie in der Legende nicht unsichtbar sind.

leg.txt <- levels(datas$label) 
x.labels <- structure(LETTERS[seq_along(leg.txt)], 
         .Names = leg.txt) 

datas %>% 
    ggplot(aes(x = label, y = freq)) + 
    geom_bar(aes(fill = type), stat = "identity") + 
    geom_point(aes(shape = label), alpha = 0) + 
    scale_shape_manual(name = "Labels", values = x.labels) + 
    guides(shape = guide_legend(override.aes = list(size = 5, alpha = 1))) + 
    scale_x_discrete(name = "Label", labels = x.labels) 

enter image description here

Es gibt mir die erwartete Ausgabe, aber ich fühle mich wie das sehr hacky ist.

Bietet ggplot2 eine Möglichkeit, dies direkter zu tun? Vielen Dank.

+1

Sie sollten sie rotieren statt: http://stackoverflow.com/questions/ 1330989/rotating-and-spacing-Achse-Etiketten-in-ggplot2 –

+0

Ich habe nicht einmal darüber nachgedacht ... Es könnte eine gute Idee sein. –

+2

Ich mag das sehr, aber es braucht einen besseren Titel, damit die Leute es finden können. Vielleicht etwas wie "Verkürzung von ggplot-Etiketten mit Abkürzungen". Und während Rotation eine gute Lösung ist, wäre dies manchmal besser. –

Antwort

2

Rotation Lösung vorgeschlagen von Pascal

Drehen der Etiketten und richten sie an den Rand:

datas %>% 
    ggplot(aes(x = label, y = freq)) + 
    geom_bar(aes(fill = type), stat = "identity") + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) 

enter image description here

Verwandte Themen