ggplot에서 종횡비를 수정하는 방법은 무엇입니까?


88

내 문서에 맞게 플롯의 크기를 조정하려고하는데 플롯 된 다이어그램이 정사각형이되는 데 어려움이 있습니다.

예:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

x와 y의 한계는 동일하지만 결과의 플롯은 정사각형이 아닙니다. R은 주변 패널을 5x5 "로 만들지 만 실제 다이어그램 크기는 신경 쓰지 않습니다.

내 다이어그램을 어떻게 수 있습니까?

답변:


113

에서 ggplot플롯의 화면 비율을 유지하는 메커니즘 추가하는 것입니다 coord_fixed()플롯에 레이어를. 이렇게하면 실제 경계 상자의 모양에 관계없이 플롯 자체의 종횡비가 유지됩니다.

(또한 ggsave결과 플롯을 pdf(); print(p); dev.off()시퀀스가 아닌 pdf / png / etc에 저장 하는 데 사용 하는 것이 좋습니다 .)

library(ggplot2)
df <- data.frame(
    x = runif(100, 0, 5),
    y = runif(100, 0, 5))

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

여기에 이미지 설명 입력


3
ggplot이 왜 y 축 레이블을 왼쪽으로 내보내라고 주장하는지 아십니까? 나는 ... 그것을 방지하는 방법을 알고 싶어요
체이스

@chase 복잡한 해결 방법은 hjusttitle-try 의 위치 를 수정하는 것 opts(axis.title.y=theme_text(hjust=10))입니다. 그러나 슬프게도 그렇지 않은 것 같습니다. ggplot 메일 링리스트 토론 및 @Baptiste의 답변 은 groups.google.com/group/ggplot2/browse_thread/thread/… 를 참조하세요 .
Andrie 2011-08-14

3
이 동작은 개발 버전에서 수정되었습니다.
hadley

5
질문의 더 일반적인 제목을 사용하여 두 축에서 동일한 제한을 사용하지 않는 경우 비율 (coord_fixed에 대한 인수)을 계산하는 방법에 대한 정보를 추가 할 수 있습니까?
htorque

1
@htorque의 의견에 더하여; y가 대신 정의 y=runif(100, 0, 50)되면 플롯의 측면이 더 이상 정사각형이 아닙니다. coord_fixed()각 축의 스케일이 동일하게 보이게합니까?
다른 벤

79

특정 종횡비 (예 : 정사각형)를 확인하려면을 사용하십시오 theme(aspect.ratio=1).

Andrie의 대답은 x의 범위가 y의 범위와 같은 경우 부 자연스러운 데이터를 제공하기 때문에 전체 그림을 제공하지 않습니다. 그러나 데이터가 다음과 같으면

df <- data.frame(
  x = runif(100, 0, 50),
  y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

플롯은 다음과 같습니다.

여기에 이미지 설명 입력

coord_fixed () 함수에는 축 비율을 조정하는 인수도 있습니다.

ratio 가로 세로 비율, y / x로 표시

플롯을 다음과 같이 정사각형으로 만들 수 있습니다.

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)

여기에 이미지 설명 입력

그러나 변수 또는 플롯 영역의 한계로이를 조정해야합니다 (모든 한계가이 예제와 같이 정수로 잘 나눌 수있는 것은 아닙니다).


12

완전성을 위해 : 매우 다른 축 제한을 고려하려는 경우 :

df <- data.frame(
  x = runif(100, 0, 5000),
  y = runif(100, 0, 5))
ratio.display <- 4/3
ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
plot + coord_fixed(ratio.values / ratio.display)

를 야기하는:


14
그게 어떻게 낫지 plot + theme(aspect.ratio=4/3)? ggplot에는 여러 데이터 세트가있는 여러 레이어가있을 수 있으며 축에는 임의의 확장 계수가있을 수 있으므로 한 데이터 소스에서 y / x의 비율을 계산하는 것은 매우 취약 해 보입니다.
baptiste jul.

2
이것은 분명히 쉽게 발견 할 수 없기 때문입니다. 여기에 세 가지 답변이 있다는 사실이 입증되었지만 아무도 언급하지 않았습니다. 답을 넣어야합니다. 확실히 더 나은 솔루션입니다.
Graipher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.