Ярлыки оси вращения и расстояния в ggplot2

671

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

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

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

Кристофер Дюбуа
источник

Ответы:

1114

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

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

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

альтернативный текст

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

Джонатан Чанг
источник
95
В новейшей версии ggplot2 команда будет выглядеть так: q + theme(axis.text.x=element_text(angle = -90, hjust = 0))
rnorberg
55
Для тех, для кого hjust не ведет себя, как описано здесь, попробуйте theme(axis.text.x=element_text(angle = 90, vjust = 0.5)). Начиная с ggplot2 0.9.3.1 это кажется решением.
Lilster
42
На самом деле, мне пришлось объединить два решения выше, чтобы получить правильно выровненные метки:q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
jupp0r
32
@ jupp0r правильно. theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))ОДИН РАБОТАЮЩИЙ В ТЕЧЕНИЕ.
51
если вы хотите, чтобы этикетки с поворотом на 45 ° (легче для чтения) theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))давали хорошие результаты
jan-glx
89

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

q + theme(axis.text.x=element_text(angle=90, hjust=1))
e3bo
источник
82

использование coord_flip()

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))

qplot(cut,carat,data = diamonds, geom = "boxplot") +
  coord_flip()

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


В гл. 3.9 из R для Data Science Уикхем и Гролемунд говорят на этот точный вопрос:

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

Рич Пауло
источник
26

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

По сути, вам необходимо определить относительные положения с помощью тригонометрии, построив функцию, которая возвращает element_textобъект, заданный угол (т.е. градусы) и информацию о расположении (то есть одну из 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)
}

Честно говоря, на мой взгляд, я думаю, что должна быть доступна опция 'auto' ggplot2в аргументах hjustand и 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)

Который производит следующее:

пример

Николас Гамильтон
источник
1
Я не получаю те же результаты, для меня текст оси никогда не корректируется с помощью вашего автоматического метода. Однако, используя rads = (-angle - positions[[ position ]])*pi/180произведенные лучшие размещения. Обратите внимание на дополнительный знак минус перед углом. В любом случае, спасибо за код :)
asac
7

Пакет ggpubr предлагает ярлык, который делает правильные вещи по умолчанию (текст выравнивания по правому краю, текстовое поле по центру по галочке ):

library(ggplot2)
diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))
q <- qplot(cut, carat, data = diamonds, geom = "boxplot")
q + ggpubr::rotate_x_text()

Создано 2018-11-06 пакетом представлением (v0.2.1)

Найдено с помощью GitHub для поиска соответствующих имен аргументов: https://github.com/search?l=R&q=element_text+angle+90+vjust+org%3Acran&type=Code

krlmlr
источник
6

В качестве альтернативы, ggplot 3.3.0обеспечивает guide_axis(n.dodge = 2)(в качестве guideаргумента scale_..или в качестве xаргумента guides), чтобы преодолеть проблему избыточного изображения, уклоняя метки по вертикали. Это работает довольно хорошо в этом случае:

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))

ggplot(diamonds, aes(cut, carat)) + 
  geom_boxplot() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  NULL

Январь-GLX
источник
1

Чтобы получить читаемые метки x без дополнительных зависимостей, вы хотите использовать:

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

Это поворачивает метки на 90 ° против часовой стрелки и выравнивает их вертикально на конце ( hjust = 1) и их центрах по горизонтали с соответствующей меткой (vjust = 0.5 ).

Полный пример:

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))


Обратите внимание, что параметры вертикального / горизонтального выравнивания vjust/ hjustof element_textотносятся к тексту. Поэтому vjustотвечает за горизонтальное выравнивание.

Без vjust = 0.5этого будет выглядеть так:

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

Без hjust = 1этого будет выглядеть так:

q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

Если по какой-либо (проводной) причине вы хотите повернуть метки на 90 ° по часовой стрелке (чтобы их можно было прочитать слева), вам необходимо использовать: q + theme(axis.text.x = element_text(angle = -90, vjust = 0.5, hjust = -1)) .

Все это уже обсуждалось в комментариях к этому ответу, но я возвращаюсь к этому вопросу так часто, что хочу получить ответ, который я могу просто скопировать, не читая комментарии.

Январь-GLX
источник
0

Альтернативой coord_flip()является использование ggstanceпакета. Преимущество состоит в том, что это облегчает объединение графиков с другими типами графиков, и вы можете, что еще важнее, установить фиксированные коэффициенты масштабирования для вашей системы координат .

library(ggplot2)
library(ggstance)

diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))

ggplot(data=diamonds, aes(carat, cut)) + geom_boxploth()

Создано 2020-03-11 пакетом представлением (v0.3.0)

Tjebo
источник