Поворотные и интервальные метки на оси ggplot2

У меня есть график, где ось х является фактором, ярлыки которого длинны. Хотя, вероятно, это не идеальная визуализация, на данный момент я хочу просто повернуть эти метки вертикально. Я понял эту часть с приведенным ниже кодом, но, как вы можете видеть, метки не полностью видны.

data(diamonds) diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut)) q <- qplot(cut,carat,data=diamonds,geom="boxplot") q + opts(axis.text.x=theme_text(angle=-90)) 

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

    Измените последнюю строку на

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

    По умолчанию оси выровнены по центру текста, даже если они повернуты. Когда вы поворачиваете +/- 90 gradleусов, вы обычно хотите, чтобы он был выровнен по краю:

    alt text

    Изображение выше из этого сообщения в блоге .

    Чтобы текст на ярлыках ярлыков был полностью виден и читался в том же направлении, что и метка оси y, измените последнюю строку на

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

    Используйте + coord_flip() .

    В «R для науки о данных» Уикхем и Гролеммунд говорят об этой точной проблеме. В главе 3.8 « Коррекция позиций» они пишут:

    coord_flip() переключает оси x и y. Это полезно (например), если вам нужны горизонтальные ящики. Это также полезно для длинных меток: трудно заставить их поместиться без наложения на ось x.

    Применив это к вашему сюжету, мы просто добавим + coord_flip() в ggplot:

     data(diamonds) diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut)) qplot(cut,carat,data = diamonds, geom = "boxplot") + coord_flip() 

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

    И теперь супер-длинные заголовки расположены горизонтально и очень легко читаются!

    Я хотел бы предоставить альтернативное решение, надежное решение, аналогичное тому, что я собираюсь предложить, было необходимо в последней версии ggtern , начиная с введения функции поворота canvasа.

    В принципе, вам нужно определить относительные позиции с помощью тригонометрии, element_text функцию, которая возвращает объект element_text , заданный угол (то есть gradleусы) и позиционирование (то есть одну из x, y, верхнюю или правую) информацию.

     #Load Required Libraries library(ggplot2) library(gridExtra) #Build Function to Return Element Text Object rotatedAxisElementText = function(angle,position='x'){ angle = angle[1]; position = position[1] positions = list(x=0,y=90,top=180,right=270) if(!position %in% names(positions)) stop(sprintf("'position' must be one of [%s]",paste(names(positions),collapse=", ")),call.=FALSE) if(!is.numeric(angle)) stop("'angle' must be numeric",call.=FALSE) rads = (angle - positions[[ position ]])*pi/180 hjust = 0.5*(1 - sin(rads)) vjust = 0.5*(1 + cos(rads)) element_text(angle=angle,vjust=vjust,hjust=hjust) } 

    Честно говоря, по моему мнению, я считаю, что опция «авто» должна быть доступна в ggplot2 для аргументов hjust и vjust , при указании угла, во всяком случае, позволяет продемонстрировать, как это работает.

     #Demonstrate Usage for a Variety of Rotations df = data.frame(x=0.5,y=0.5) plots = lapply(seq(0,90,length.out=4),function(a){ ggplot(df,aes(x,y)) + geom_point() + theme(axis.text.x = rotatedAxisElementText(a,'x'), axis.text.y = rotatedAxisElementText(a,'y')) + labs(title = sprintf("Rotated %s",a)) }) grid.arrange(grobs=plots) 

    Что дает следующее:

    пример

    Давайте будем гением компьютера.