Rotação de rótulos do eixo x em R para gráfico de barras

93

Estou tentando fazer com que os rótulos do eixo x sejam girados 45 graus em um gráfico de barras sem sorte. Este é o código que tenho abaixo:

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
fonte

Respostas:

59

RESPOSTA EDITADA POR RESPOSTA DE DAVID:

Aqui está uma maneira meio hackeada. Acho que há uma maneira mais fácil. Mas você pode suprimir os rótulos das barras e o texto do gráfico dos rótulos salvando as posições das barras barplote fazendo alguns ajustes para cima e para baixo. Aqui está um exemplo com o conjunto de dados 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
fonte
2
advertência : se você estiver usando beside = TRUE, provavelmente desejará usar em colMeans(x)vez de apenas xse quiser apenas um rótulo por grupo.
MichaelChirico
266

use o parâmetro opcional las = 2.

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

insira a descrição da imagem aqui

Michael Z
fonte
2
Acredito que essa deve ser a resposta aceita. Funciona perfeitamente usando um parâmetro da função de gráfico de barras base usada na pergunta.
jwhaley58
Concordo, essa deve ser a resposta aceita. Solução muito mais concisa
snlan 01 de
16
use par (mar = c (15,4,4,2)) para ajustar as margens de forma que os rótulos verticais não sejam cortados da figura.
Steven Magana-Zook
23
Eu, pessoalmente, prefiro essa abordagem, mas ela não respondeu à pergunta original do OP: estou tentando fazer com que os rótulos do eixo x sejam girados 45 graus em um gráfico de barras
arpieb
1
você pode ver que 'make' está coberto por rótulos. Como corrigi-lo?
Filip Bartuzi
29

Gire os rótulos do eixo x com ângulo igual ou menor que 90 graus usando gráficos de base. Código adaptado do R FAQ :

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)

insira a descrição da imagem aqui

Andre silva
fonte
7

Você pode simplesmente passar seu quadro de dados para a seguinte função :

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)

insira a descrição da imagem aqui

Você pode alterar o ângulo de rotação dos rótulos conforme necessário.

Cibernético
fonte
6

Você pode usar o ggplot2 para girar o rótulo do eixo x adicionando uma camada adicional

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

fonte
2

A resposta de Andre Silva funciona muito bem para mim, com uma ressalva na linha "barplot":

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

Observe o argumento "xaxt". Sem ele, os rótulos são desenhados duas vezes, a primeira vez sem a rotação de 60 graus.

Alvaro Gonzalez
fonte
1

Na documentação do Bar Plots, podemos ler sobre os parâmetros adicionais ( ...) que podem ser passados ​​para a chamada de função:

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

Na documentação dos parâmetros gráficos (documentação 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.

É por isso que passar las=2é a resposta certa.

banan3'14
fonte