programing

ggplot2에서 회전 및 간격 축 레이블

easyjava 2023. 6. 8. 22:42
반응형

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, vjust = 0.5, hjust=1))

기본적으로 축은 회전하더라도 텍스트의 중심에 정렬됩니다.+/- 90도로 회전할 때 일반적으로 다음과 같이 가장자리에 정렬은 다음과 같습니다.

alt 텍스트

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

ggplot 3.3.0 를 제공하여 이 문제를 해결합니다.guide_axis(angle = 90)(로서)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(angle = 90)) +
  # ... or, equivalently:
  # guides(x =  guide_axis(angle = 90)) +
  NULL

인수의 문서에서:

테마() / element_text()에서 각도를 설정하는 것과 비교하여 일부 휴리스틱을 사용하여 사용자가 원하는 hjust 및 vjust를 자동으로 선택합니다.


또는 다음과 같은 기능도 제공합니다. guide_axis(n.dodge = 2)(로서)guide에 대한 인수입니다.scale_..또는 로서x에 대한 인수입니다.guides 라벨을 수직으로 피함으로써 오버래핑 문제를 극복합니다.꽤 잘 합니다: 우경에는잘매작동니다합이우다▁it니작.

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

사용하다coord_flip()

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

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

여기에 이미지 설명 입력


더하다str_wrap()

# wrap text to no more than 15 spaces
library(stringr)
diamonds$cut2 <- str_wrap(diamonds$cut, width = 15)
qplot(cut2, carat, data = diamonds, geom = "boxplot") +
  coord_flip()

여기에 이미지 설명 입력


R for Data Science의 3.9장에서 Wickham과 Grollemund는 다음과 같은 정확한 질문에 대해 말합니다.

coord_flip()x축과 y축을 전환합니다.이것은 수평 상자 그림을 원하는 경우에 유용합니다(예:).긴 레이블에도 유용합니다. X축에 겹치지 않고 맞추기가 어렵습니다.

눈금 레이블의 텍스트를 완전히 표시하고 y축 레이블과 동일한 방향으로 읽으려면 마지막 줄을 다음으로 변경합니다.

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

캔버스 회전 기능을 도입한 이후로 제가 제안하려는 것과 유사한 강력한 솔루션이 ggtern 최신 버전에 필요했습니다.

. 즉, 기 으 사 삼 상 위 합 결 니 다 야 해 치 정 를 본 대 적 여 하 용 로 각 법 을 ▁an ▁which ▁function ▁a ▁basically ▁returns▁using on , ▁positions ▁the ▁building 다 니 ▁trig 기 본 ▁relative ometry 삼각법을 사용하여 다음을 반환하는 함수를 구축합니다.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를해위를 .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)

다음을 생성합니다.

예

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

구식 - 보다 간단한 접근 방식은 이 답변을 참조하십시오.


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

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

의 대안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에 생성되었습니다.

또한 ggplot23.3+를 사용하면 cord_flip() 없이 수평 플롯을 만들 수 있습니다. 양방향 지오메트리를 지원하므로 x축과 y축을 스왑하기만 하면 됩니다.https://cmdlinetips.com/2020/03/ggplot2-2-3-0-is-here-two-new-features-you-must-know/

언급URL : https://stackoverflow.com/questions/1330989/rotating-and-spacing-axis-labels-in-ggplot2

반응형