Rotación de etiquetas del eje x en R para diagrama de barras

99

Estoy tratando de hacer que las etiquetas del eje x se giren 45 grados en una gráfica de barras sin suerte. Este es el código que tengo a continuación:

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)
David
fuente

Respuestas:

60

RESPUESTA EDITADA SEGÚN LA RESPUESTA DE DAVID:

Aquí hay una forma de hackear. Supongo que hay una forma más fácil. Pero puede suprimir las etiquetas de las barras y el texto de trazado de las etiquetas guardando las posiciones de las barras barploty haciendo algunos ajustes hacia arriba y hacia abajo. Aquí tienes un ejemplo con el conjunto de datos 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)
Tyler Rinker
fuente
3
advertencia : si está usando beside = TRUE, probablemente desee usar en colMeans(x)lugar de solo xsi desea solo una etiqueta por grupo.
MichaelChirico
277

use el parámetro opcional las = 2.

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

ingrese la descripción de la imagen aquí

Michael Z
fuente
3
Creo que esta debería ser la respuesta aceptada. Funciona perfectamente con un parámetro de la función de gráfico de barras base utilizada en la pregunta.
jwhaley58
1
De acuerdo, esta debería ser la respuesta aceptada. Solución mucho más concisa
snlan
17
utilice par (mar = c (15,4,4,2)) para ajustar los márgenes de modo que las etiquetas verticales no se recorten de la figura.
Steven Magana-Zook
24
Personalmente prefiero este enfoque, pero no respondió la pregunta original del OP: estoy tratando de hacer que las etiquetas del eje x se giren 45 grados en un diagrama de barras
arpieb
1
puede ver que "marca" está cubierta por etiquetas. ¿Como arreglarlo?
Filip Bartuzi
31

Gire las etiquetas del eje x con un ángulo igual o menor a 90 grados utilizando gráficos base. Código adaptado de las preguntas frecuentes de 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)

ingrese la descripción de la imagen aquí

Andre Silva
fuente
9

Simplemente puede pasar su marco de datos a la siguiente función :

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) 
}

Uso:

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

ingrese la descripción de la imagen aquí

Puede cambiar el ángulo de rotación de las etiquetas según sea necesario.

Cibernético
fuente
6

Puede usar ggplot2 para rotar la etiqueta del eje x agregando una capa adicional

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

fuente
2

La respuesta de Andre Silva funciona muy bien para mí, con una advertencia en la línea "barplot":

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

Observe el argumento "xaxt". Sin él, las etiquetas se dibujan dos veces, la primera vez sin la rotación de 60 grados.

Álvaro González
fuente
1

En la documentación de Bar Plots podemos leer sobre los parámetros adicionales ( ...) que se pueden pasar a la llamada a la función:

...    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.

En la documentación de parámetros gráficos (documentación de par) podemos ver:

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.

Es por eso que pasar las=2es la respuesta correcta.

banan3'14
fuente