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")
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)
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.
Należy obracać je zamiast: http://stackoverflow.com/questions/ 1330989/obracanie-i-rozmieszczenie-osie-etykiety-w-ggplot2 –
Nawet o tym nie myślałem ... To może być naprawdę dobry pomysł. –
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. –