[r] ggplot2의 회전 및 간격 축 레이블

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

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



답변

마지막 줄을

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

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

대체 텍스트

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


답변

눈금 레이블의 텍스트를 완전히 표시하고 y 축 레이블과 같은 방향으로 읽으려면 마지막 줄을

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


답변

사용하다 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 축에 겹치지 않고 맞추기가 어렵습니다.


답변

캔버스 회전 기능을 도입 한 이후 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)

다음을 생성합니다.

예


답변

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


답변

또한, 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


답변

추가 종속성없이 읽을 수있는 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))합니다..

이 모든 것은 이미이 답변 의 의견에서 논의 되었지만이 질문으로 자주 돌아와서 의견을 읽지 않고 복사 할 수있는 답변을 원합니다.