Мітки осі обертання та відстані в ggplot2


669

У мене є сюжет, де вісь 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))

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

Відповіді:


1110

Змініть останній рядок на

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

За замовчуванням осі вирівнюються в центрі тексту, навіть при повороті. Коли ви обертаєте +/- 90 градусів, зазвичай хочете, щоб він був вирівняний на краю:

alt текст

Зображення вгорі - з цієї публікації в блозі .


95
У найновішій версії ggplot2 командою було б: q + theme(axis.text.x=element_text(angle = -90, hjust = 0))
rnorberg

55
Тим, для кого х'юст не веде себе так, як описано тут, спробуйте 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))

81

Використовуйте 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 для наукових даних Вікхем та Гролемунд говорять про це точне запитання:

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для аргументів 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)

Що виробляє наступне:

Приклад


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 пакетом reprex (v0.2.1)

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


5

Альтернативно, 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


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/ hjustз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)).

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


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 пакетом reprex (v0.3.0)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.