Вращение меток оси x в R для гистограммы

99

Я пытаюсь повернуть метки оси x на 45 градусов на диаграмме без везения. Это код, который у меня ниже:

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)
Дэвид
источник

Ответы:

60

ОТРЕДАКТИВНЫЙ ОТВЕТ НА ОТВЕТ ДЭВИДА:

Вот такой хакерский способ. Думаю, есть способ попроще. Но вы можете подавить метки столбцов и текст на графике меток, сохранив позиции barplotстолбцов и немного изменив их вверх и вниз. Вот пример с набором данных 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
предостережение : если вы используете beside = TRUE, вы, вероятно, захотите использовать colMeans(x)вместо него xтолько одну метку для каждой группы.
MichaelChirico
278

используйте необязательный параметр las = 2.

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

введите описание изображения здесь

Майкл З
источник
3
Я считаю, что это должен быть принятый ответ. Отлично работает с параметром базовой функции штрихового графика, использованной в вопросе.
jwhaley58 08
1
Согласен, это должен быть принятый ответ. Гораздо более лаконичное решение
snlan 01
17
используйте par (mar = c (15,4,4,2)), чтобы отрегулировать поля, чтобы вертикальные метки не обрезались с рисунка.
Стивен Магана-Зук
24
Я лично предпочитаю этот подход, но он не дал
arpieb
1
Вы можете видеть, что «make» покрыто этикетками. Как это исправить?
Филип Бартузи,
31

Поверните метки оси x на угол, равный или меньший 90 градусов, используя базовую графику. Код адаптирован из 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)

введите описание изображения здесь

Андре Сильва
источник
9

Вы можете просто передать свой фрейм данных в следующую функцию :

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

Применение:

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

введите описание изображения здесь

При необходимости вы можете изменить угол поворота этикеток.

Кибернетический
источник
6

Вы можете использовать ggplot2, чтобы повернуть метку оси x, добавив дополнительный слой

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

источник
2

Ответ Андре Сильвы отлично подходит для меня, с одной оговоркой в ​​строке «штриховой график»:

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

Обратите внимание на аргумент «xaxt». Без него метки отрисовываются дважды, в первый раз без поворота на 60 градусов.

Альваро Гонсалес
источник
1

В документации Bar Plots мы можем прочитать о дополнительных параметрах ( ...), которые могут быть переданы в вызов функции:

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

В документации графических параметров (документации par) мы видим:

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.

Вот почему переход las=2- правильный ответ.

банан3'14
источник