본문 바로가기
데이터 분석/시각화

[Matplotlib] Tip! 좌표축 Axes의 가로 세로 길이 Inche 단위로 알아보기 (feat. get_window_extent, dpi_scale_trans)

by 부자 꽁냥이 2023. 1. 3.

안녕하세요~ 꽁냥이에요. 오늘은 Matplotlib과 관련하여 간단한 팁을 소개합니다. 바로 Axes 가로 세로 길이를 Inche 단위로 알아보는 방법입니다.


   Axes 가로 세로 길이 비율 계산하기.

먼저 Axes는 네 개의 축으로 둘러싸인 영역을 말합니다.

 

이제 Axes의 가로 세로 길이를 Inche 단위로 알아봅시다. 먼저 선 그래프를 하나 그립니다.

 

import matplotlib.pyplot as plt

fig = plt.figure()
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.plot([1,2,3,4,5], [6,4,7,3,1])
plt.show()

 

 

이제 Axes의 가로 세로 길이를 인치(Inche) 단위로 뽑기 위한 코드입니다. 먼저 Figure를 Inche 단위로 바꿔주는 dpi_scale_tran.inverted 함수를 ax.get_window_extent()가 반환하는 TransformedBbox객체의 transformed 메서드에 인자로 전달합니다. 이렇게 하면 Inche 단위의 좌하단과 우상단 좌표를 갖는 BBox 객체를 얻을 수 있습니다. 이때 width, heigh 속성에 가로와 세로를 각각 Inche 단위로 얻을 수 있습니다.

 

bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
width, height = bbox.width, bbox.height
print('가로', width)
print('세로', height)
print('세로/가로', height/width)

 

 

위 코드를 실행하면 가로는 약 4.65인치, 세로는 3.02인치인 것을 알 수 있습니다. 이를 통해 정확한 가로 세로 비율까지 계산할 수 있습니다.

 

참고로 set_aspect에 원하는 가로 대비 세로의 비가 나오도록 하는 인자를 어떻게 찾을지에 대한 것도 위 방법을 사용하면 됩니다. 만약 아래 그림에서 set_aspect 인자에 1을 넣었을 경우 가로 대비 세로의 비를 계산해 봅시다.

 

import matplotlib.pyplot as plt

fig = plt.figure()
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.plot([1,2,3,4,5], [6,4,7,3,1])
ax.set_aspect(1)
plt.show()

bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
width, height = bbox.width, bbox.height
print('세로/가로', height/width)

 

set_aspect 인자 1에 대해서 가로에 대한 세로 비가 1.5가 나온 것을 알 수 있습니다. 그렇다면 가로에 대한 세로 비가 180/100=1.8이 나오게 하는 set_aspect 인자는 다음의 비례식을 통해서 계산할 수 있습니다.

 

$$1:1.5 = x:\frac{180}{100} \Rightarrow x = \frac{180}{150} $$

즉, set_aspect 인자에 180/150의 값을 넣어주면 우리가 원하는 가로에 대한 세로 비가 1.8이 나오게 될 것입니다. 확인해 보겠습니다.

 

import matplotlib.pyplot as plt

fig = plt.figure()
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.plot([1,2,3,4,5], [6,4,7,3,1])
ax.set_aspect(180/150)
plt.show()

bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
width, height = bbox.width, bbox.height
print('세로/가로', height/width)

 

 

 

우리가 원하는 가로에 대한 세로 비가 1.8로 정확하게 반영된 것을 알 수 있습니다.


이번 포스팅은 Axes의 가로 세로 길이 비를 항상 일정하게 맞추기 위한 방법을 고민하다가 알게 된 내용입니다. 뭔가 많이 사용할 것 같진 않지만 꽁냥이가 까먹을 때를 대비해서 적어둔 것입니다. 혹시라도 도움이 되시는 분들이 계시면 좋겠어요.

 

다음에도 좋은 주제로 찾아뵐 것을 약속드리며 이상 포스팅 마치겠습니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.

 


댓글


맨 위로