2015-06-03 13 views
8

Vorrei creare un semplice grafico a barre con ggplot2 e il mio problema è che la mia variabile x contiene stringhe lunghe, quindi le etichette sono sovrapposte.Crea legende abbreviate manualmente per etichette X lunghe in ggplot2

Qui ci sono dati falsi e la trama:

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

Vorrei sostituire le etichette da quelle più brevi e creare una leggenda per mostrare le partite.

Quello che ho provato:

Io uso il parametro AES forma in geo_point che creerà una leggenda con forme (e trame forme che io nascondo con alpha = 0). Quindi cambio le forme con scale_shape_manual e sostituisco le etichette x con scale_x_discrete. Con guides sostituisco il parametro alfa delle mie forme in modo che non siano invisibili nella legenda.

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

Mi dà i risultati attesi, ma mi sento come questo è molto hacky.

ggplot2 offre un modo per farlo più direttamente? Grazie.

+1

Si dovrebbe ruotare loro, invece: http://stackoverflow.com/questions/ 1330989/rotazione-e-spaziatura-axis-labels-in-ggplot2 –

+0

Non ci ho nemmeno pensato ... Potrebbe essere una buona idea in effetti. –

+2

Mi piace molto, ma ha bisogno di un titolo migliore in modo che le persone possano trovarlo. Forse qualcosa come "Accorciamento delle etichette ggplot con abbreviazioni". E mentre la rotazione è una buona soluzione, a volte sarebbe meglio. –

risposta

2

soluzione rotazione suggerita da Pascal

ruotare le etichette e allinearli al bordo:

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

Problemi correlati