2015-06-03 14 views
8

Chciałbym stworzyć prosty wykres słupkowy z ggplot2 i moim problemem jest to, że moja zmienna x zawiera długie łańcuchy, więc etykiety są nakładane.Twórz skrócone legendy ręcznie dla długich etykiet X w ggplot2

Oto fałszywe dane osobowe i fabuła:

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

Chciałbym wymienić etykiety przez krótsze i stworzyć legendę, aby pokazać mecze.

Co próbowałem:

Używam parametr aes kształt w geo_point która stworzy legendę o kształtach (i działek kształtach że chowam z alpha = 0). Następnie zmieniam kształty za pomocą scale_shape_manual i zamieniam etykiety x na scale_x_discrete. Z guides nadpisuję parametr alfa moich kształtów, więc nie będą one niewidoczne w legendzie.

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

Daje mi spodziewanych rezultatów, ale czuję się jak to jest bardzo hacky.

Czy ggplot2 umożliwia bardziej bezpośrednie wykonanie tej czynności? Dzięki.

+1

Należy obracać je zamiast: http://stackoverflow.com/questions/ 1330989/obracanie-i-rozmieszczenie-osie-etykiety-w-ggplot2 –

+0

Nawet o tym nie myślałem ... To może być naprawdę dobry pomysł. –

+2

Bardzo to lubię, ale potrzebuje lepszego tytułu, żeby ludzie mogli go znaleźć. Może coś w stylu "Skracanie etykiet ggplot ze skrótami". I chociaż rotacja jest dobrym rozwiązaniem, czasami byłoby lepiej. –

Odpowiedz

2

rozwiązanie Obrót sugerowane przez Pascala

Obróć etykiety i dostosować je do krawędzi:

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

Powiązane problemy