본문 바로가기
Data Science/Data Visualization

[matplotlib] Figure에서 Axes 요리하기(이론)

by Finn# 2024. 10. 30.
728x90

 

Intro

이전 게시글에서 한 Ax내 그래프를 그리기 위한 기본적인 구조와 코드에 대해서 공부했습니다. 이번에는 Figure 내에서 Ax 여러 개를 다루는 방법에 대해서 소개하겠습니다. 이번 칼럼을 공부하시기 전에도 전에 공부했던 내용을 상기시키고 학습하시기 바랍니다. 충분히 숙련되고 다음 내용이 필요할 때 칼럼을 읽어주시면 감사하겠습니다 !


Figure에 Ax를 그려보자

Figure에서 Ax를 담는 코드는 여러가지 방법이 있습니다. 하지만 저희는 처음 배운다는 가정 하에 가장 자유도가 높은 방법부터 시작하겠습니다. 그리고 필요에 의해 다른 방법들을 익혀보겠습니다. 가장 유연한 방법은 Figure에 Ax의 직접적인 위치와 크기 정보를 전달하여 생성하는 방법입니다. 아래 과정을 통해서 어떤 정보들을 전달해주는지 확인해봅시다.

 

데이터 시각화를 위해 Figure와 Ax라는 공간이 필요합니다

 

 먼저 필요한 정보를 살펴보기 위해 Figure와 Ax를 만들어보겠습니다. 잠깐 복습해보면 Figure는 그래프들의 집합을 담을 수 있는 공간이고 Ax는 개별 그래프를 담을 수 있는 공간이라고 소개했었습니다. 그럼 Figure 내에 Ax가 그려지게 되는데 어떻게 하면 Ax를 Figure안에 그릴 수 있는지에 대해 한번 생각해봅시다. 이후 Figure안에 Ax를 그리기 위해서 알아야할 정보들이 뭐가 있는지 살펴보겠습니다.

 

저희는 흔히 어떤 차원이든 Data Point를 좌표를 통해 표현하곤 합니다. 이러한 관점에서 Ax라는 개체도 Ax를 대표하는 Point를 활용하여 좌표의 형태로 두면 Ax의 위치를 정의할 수 있습니다. Ax가 표현되는 Figure는 2차원 공간이니 이 공간을 좌측 하단이 (0,0)인 좌표평면으로 생각해보면 Ax를 1사분면 위에 정의된 개체로 볼 수 있습니다. 이때 개체는 Ax 평면의 좌측 하단을 대표하는 점으로 둡니다.

width와 height는 Figure의 width와 height의 비로 표현합니다

 

Ax를 대표하는 Point의 위치만 잡으면 모든 것이 설명될까요? 아닙니다. 우리가 표현할 Ax라는 공간은 단순히 점의 위치가 아닌 Width와 Height를 가지고 있는 평면입니다. 따라서 Figure 안에 Ax의 위치를 완벽하게 설정하기 위해선 Width와 Height 정보도 전달해야합니다. 여기까지 정리해보면 저희가 Figure에 Ax를 전달하려면 필요한 정보는 (x,y,width,height) 총 4가지라는 사실을 알 수 있습니다.

 


여러 개의 Ax를 원하는 위치에 배치를 할 수 있을까?

이번 Chapter에서는 x, y라는 Ax Point의 좌표와 width, height의 정보를 전달해야한다는 사실을 꼭 기억해두세요 ! Figure에 하나의 Ax만 그릴 수 있을까요?

 

정답은 아닙니다. 지난 실습 게시글에서 보여드렸던 것처럼 하나의 Figure에 여러 개의 Ax를 동시에 다룰 수 있습니다. 그럼 어떻게 할 수 있을까요? 단순히 여러개의 Ax 정보를 Figure에 전달하면 될까요??

 

네, 맞습니다. Figure에 필요한 만큼 Ax(x, y, width, height) 쌍 정보를 전달해준다면 하나의 Figure에 여러 Axes를 담을 수 있습니다.

조금 어지럽긴 하지만 이렇게 여러 개의 Axes를 하나의 Figure에 담을 수 있습니다

 

Figure 하나에 Ax(x,y,width, height)를 전달하면 원하는 만큼 Ax를 넣을 수 있다는 것은 알겠는데, 자료를 너무 대충 만든 게 아니냐는 의문이 들 수 있습니다. 보통 데이터 시각화를 접해본 분들은 아주 예쁘게 정렬된 데이터 시각화를 접해보셨을 확률이 크기 때문이죠 ! 하지만 저희가 배웠던 원리를 잘 생각해본다면 저렇게 지저분하게 Ax를 위치시키는 것도 가능하다는 점을 이해할 수 있을 것입니다.

 

따라서 반은 맞고 반은 틀린 말입니다. 앞서 설명드렸듯 Ax의 Point를 활용해서 추가하는 방식은 내가 원하는 Figure의 좌표평면 상 자유롭게 Ax를 추가할 수 있습니다. 그렇기 때문에 반은 맞습니다 ! 나머지 반은 대충 만들고자하는 의도가 담겨있습니다 ㅎㅎ


여러 개의 Ax를 반듯하게 배치할 수 있을까?

이전 Chapter를 보시면 Ax가 무질서하게 추가되어있는 것을 느낄 수 있습니다. 물론 저희가 배운 (x,y,width,height)를 통해서 반듯하게 각 Ax를 배치할 수도 있으나 이렇게 하면 너무 비효율적이고 불편하다고 느끼실 겁니다. 이런 불편함을 해결해줄 수 있는 방법이 있을까요?

 

정말 다행스럽게도 subplot을 통해 Figure를 지정한 행과 열의 크기에 맞게 잘라서 각각 공간을 활용할 수 있는 방법이 있습니다.

이렇게 반듯하게 잘라서 ax를 할당하는 방식을 지원하는 함수로 subplot이 있습니다. 함수는 실습 때 다루겠습니다

 


여러 개의 Ax를 반듯하게 배치하되 좀 더 유연하게 할 수 있을까?

앞서 subplot 방식으로 행, 열을 반듯하게 자르고 배치하는 방식은 너비와 높이가 지나치게 제한되어 데이터를 표현하기 어려울 수도 있습니다. 만약 우리가 격자 구조는 유지하되 앞/뒤 양옆으로 칸을 확장하여 유연하게 Plot을 그리고 싶다면 Ax(x,y,width,height) 쌍을 하나하나 배치하는 방법 밖에 없을까요??

 

아닙니다. 저희는 matplotlib 모듈에서 제공하는 Gridspec과 subplot을 활용해서 격자 구조 기반 하 유연하게 Plot을 한 격자 단위로 늘리고 줄일 수 있습니다. 이때의 방식은 Slicing을 적용하여 여러 행과, 여러 열의 정보를 전달하여 Ax를 정의할 수 있습니다. 자세한 과정은 실제 실습 과정에서 코드를 통해 확인해주세요 !

격자구조를 활용해서 Ax 영역을 정의할 수 있었고 훨씬 깔끔하게 제어할 수 있습니다


Outro

지금까지 배웠던 모든 내용들을 적절히 혼재해서 사용한다면 데이터 시각화를 유연하게 할 수 있는 기본적인 역량이 쌓였을 것이라 생각합니다. 그래프마다 레이블을 다는 것과 색을 지정하는 등의 부가적인 요소들은 여러분들이 필요하시다면 배워서 적용하면 충분하실 것 같습니다. 가장 중요한 것은 구조를 이해하고 Plot을 넣을 공간을 자유자재로 다룰 수 있는 능력이 선행되어야한다고 생각하기 때문에 이런 점들을 숙고하셔서 작업하시면 많은 도움이 될 것 같습니다.

 

관련 내용은 아래 영상으로도 제공하고 있으니 참고해보시면 좋을 것 같습니다 ! 구독, 좋아요, 알람설정 부탁드립니다.

 

 

인스타 주소

https://www.instagram.com/f.inn_sharp/

 

반응형