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

여기에 이미지 설명을 입력하십시오

답변:


1111

마지막 줄을

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

기본적으로 축은 회전 할 때도 텍스트 중심에 정렬됩니다. +/- 90도 회전 할 때 일반적으로 대신 가장자리에 정렬하려고합니다.

대체 텍스트

위의 이미지는 이 블로그 게시물 에서 가져온 입니다.


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 10

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))좋은 결과를
얻습니다

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

여기에 이미지 설명을 입력하십시오


데이터 과학 R의 3.9 장 에서 Wickham과 Grolemund는이 정확한 질문에 대해 다음과 같이 말합니다.

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

솔직히 말하자면, 각도를 지정할 때 및 인수 에 ggplot2대해 '자동'옵션을 사용할 수 있어야한다고 생각합니다. 어쨌든 위의 작동 방식을 보여줍니다.hjustvjust

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

reprex 패키지 (v0.2.1) 에서 2018-11-06에 작성

관련 인수 이름에 대한 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/ hjustelement_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()

reprex 패키지 (v0.3.0)로 2020-03-11에 작성

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.