Rotazione delle etichette dell'asse x in R per barplot


99

Sto cercando di far ruotare le etichette dell'asse x di 45 gradi su un grafico a barre senza fortuna. Questo è il codice che ho di seguito:

barplot(((data1[,1] - average)/average) * 100,
        srt       = 45,
        adj       = 1,
        xpd       = TRUE,
        names.arg = data1[,2],
        col       = c("#3CA0D0"),
        main      = "Best Lift Time to Vertical Drop Ratios of North American Resorts",
        ylab      = "Normalized Difference",
        yaxt      = 'n',
        cex.names = 0.65,
        cex.lab   = 0.65)

Risposte:


60

RISPOSTA MODIFICATA PER LA RISPOSTA DI DAVID:

Ecco una specie di modo hacker. Immagino che ci sia un modo più semplice. Ma puoi sopprimere le etichette delle barre e il testo della trama delle etichette salvando le posizioni delle barre da barplote facendo un piccolo ritocco su e giù. Ecco un esempio con il set di dati mtcars:

x <- barplot(table(mtcars$cyl), xaxt="n")
labs <- paste(names(table(mtcars$cyl)), "cylinders")
text(cex=1, x=x-.25, y=-1.25, labs, xpd=TRUE, srt=45)

3
avvertimento : se stai usando beside = TRUE, probabilmente vorrai usare colMeans(x)invece di solo xse vuoi solo un'etichetta per gruppo.
MichaelChirico

277

utilizzare il parametro opzionale las = 2.

barplot(mytable,main="Car makes",ylab="Freqency",xlab="make",las=2)

inserisci qui la descrizione dell'immagine


3
Credo che questa dovrebbe essere la risposta accettata. Funziona perfettamente utilizzando un parametro della funzione barplot di base utilizzata nella domanda.
jwhaley58

1
D'accordo, questa dovrebbe essere la risposta accettata. Soluzione molto più concisa
snlan

17
utilizzare par (mar = c (15,4,4,2)) per regolare i margini in modo che le etichette verticali non vengano tagliate dalla figura.
Steven Magana-Zook

24
Personalmente preferisco questo approccio, ma non ha risposto alla domanda originale dell'OP: sto cercando di far ruotare le etichette dell'asse x di 45 gradi su un grafico a barre
arpieb

1
puoi vedere che "make" è coperto da etichette. Come sistemarlo?
Filip Bartuzi

31

Ruota le etichette dell'asse x con un angolo uguale o minore di 90 gradi utilizzando la grafica di base. Codice adattato dalla FAQ R :

par(mar = c(7, 4, 2, 2) + 0.2) #add room for the rotated labels

#use mtcars dataset to produce a barplot with qsec colum information
mtcars = mtcars[with(mtcars, order(-qsec)), ] #order mtcars data set by column "qsec"

end_point = 0.5 + nrow(mtcars) + nrow(mtcars) - 1 #this is the line which does the trick (together with barplot "space = 1" parameter)

barplot(mtcars$qsec, col = "grey50", 
        main = "",
        ylab = "mtcars - qsec", ylim = c(0,5 + max(mtcars$qsec)),
        xlab = "",
        space = 1)
#rotate 60 degrees (srt = 60)
text(seq(1.5, end_point, by = 2), par("usr")[3]-0.25, 
     srt = 60, adj = 1, xpd = TRUE,
     labels = paste(rownames(mtcars)), cex = 0.65)

inserisci qui la descrizione dell'immagine


9

Puoi semplicemente passare il tuo frame di dati alla seguente funzione :

rotate_x <- function(data, column_to_plot, labels_vec, rot_angle) {
    plt <- barplot(data[[column_to_plot]], col='steelblue', xaxt="n")
    text(plt, par("usr")[3], labels = labels_vec, srt = rot_angle, adj = c(1.1,1.1), xpd = TRUE, cex=0.6) 
}

Utilizzo:

rotate_x(mtcars, 'mpg', row.names(mtcars), 45)

inserisci qui la descrizione dell'immagine

È possibile modificare l' angolo di rotazione delle etichette secondo necessità.



6

Puoi usare ggplot2 per ruotare l'etichetta dell'asse x aggiungendo un ulteriore livello

theme(axis.text.x = element_text(angle = 90, hjust = 1))

2

La risposta di Andre Silva funziona alla grande per me, con un avvertimento nella riga "barplot":

barplot(mtcars$qsec, col="grey50", 
    main="",
    ylab="mtcars - qsec", ylim=c(0,5+max(mtcars$qsec)),
    xlab = "",
    xaxt = "n", 
    space=1)

Notare l'argomento "xaxt". Senza di essa, le etichette vengono disegnate due volte, la prima volta senza la rotazione di 60 gradi.


1

Nella documentazione di Bar Plots possiamo leggere i parametri aggiuntivi ( ...) che possono essere passati alla chiamata di funzione:

...    arguments to be passed to/from other methods. For the default method these can 
       include further arguments (such as axes, asp and main) and graphical 
       parameters (see par) which are passed to plot.window(), title() and axis.

Nella documentazione dei parametri grafici (documentazione di par) possiamo vedere:

las
    numeric in {0,1,2,3}; the style of axis labels.

    0:
      always parallel to the axis [default],

    1:
      always horizontal,

    2:
      always perpendicular to the axis,

    3:
      always vertical.

    Also supported by mtext. Note that string/character rotation via argument srt to par does not affect the axis labels.

Ecco perché passare las=2è la risposta giusta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.