본문 바로가기
Python/Matplotlib

여러개의 그래프의 작성(subplot)과 tight_layout - matplotlib(21)

by 콩돌 2019. 6. 1.
반응형

파이썬 버전 3.7 기준

matplotlib 버전 3.1.0 기준



  다수의 플롯의 작성(subplot)과 tight_layout()


본 포스팅에서는 subplot()함수의 작성법에 대한 설명과 서브플롯(subplot)을 통해 하나의 Figure에 여러 개의 플롯을 직접 작성해보는 예제를 다뤄보도록 한다.

subplot()함수 및 tight_layout()함수의 입력 키워드 인자에 대한 상세 설명은 뒷포스팅(링크)를 참고하도록한다.


 subplot의 작성 방법



  subplot()의 단순한 작성 형식

subplot의 단순한 작성형식을 설명하자면 다음과 같다. 


subplot()의 작성 형식)

# ①번 방식 

axes=subplot(nrows, ncols, index, **kwargs)


# ②번 방식

axes=subplot(pos, **kwargs)


# ③번 방식

axes=subplot(axes)



①, ②번 방식

이 두 방식은 세개의 정수를 입력받는 방식이며, 각 정수의 수는 10보다 작아야한다.

입력되는 정수는 plot의 좌표를 나타내며, 두 방식 모두 동일하게 아래와 같이 좌표가 입력된다.

  - 첫번째 정수 : nrows, subplot의 행의 수를 나타낸다.

  - 두번째 정수 : ncols, subplot의 열의 수를 나타낸다.

  - 세번째 정수 : index, 인덱스를 나타낸다. 인덱스는 1부터 시작하며 순서는 위부터 오른쪽으로 위쪽에서 아래쪽 방향으로 설정된다.


①번 방식은 각 정수를 나누어 입력받는 방식이다.

  -  nrow, ncols, index 식으로 나누어서 입력받는다.


①번 방식 예)

subplot(1, 2, 1)

subplot(1, 2, 2)


②번 방식은 각 정수를 이어서 3자리수의 정수로 입력받는 방식이다.


②번 방식 예)

subplot(121)

subplot(122)


③번 방식

axes 객체를 바로 입력 받는 방법이다. 

기존의 axes의 정보를 받아온다.



참고사항

  서브플롯을 작성하는 것은 이미 존재하는 서브플롯을 덮어씌우는 것을 의미하며, 경우에 따라서는 기존의 플롯이 삭제된다.
  이런 사태를 원하지 않는 경우에는 Figure.add_subplot 메서드나, pyplot.axes 메서드를 사용하는 것이 권장된다. 
  위의 메서드를 이용하면 기존에 있는 플롯 위에 새로운 플롯을 만든다거나 기존에 있던 플롯을 다시 편집할 수 있다.



  tight_layout() 함수의 사용

이 함수는 자동으로 레이아웃을 맞춰주는 함수이다.

subplot을 작성하다보면 하나의 그래프 레이아웃이 다른 레이아웃에 넘어가는 경우도 생기고, 모양도 이쁘지 않게 나오는 경우가 있다. 

이런 경우 이 함수를 사용하면 자동으로 레이아웃을 맞춰주기 때문에 굉장히 유용하게 사용할 수 있다.

이 함수에 대한 자세한 설명은 뒷포스팅(링크)에 존재하므로 필요하다면 참고할 수 있다.



  subplot의 단순한 작성 예제

아래 예제는 서브플롯(subplot)을 작성하는 예제이다. 

subplot() 함수와 tight_layout() 함수에 대한 자세한 설명은 다음포스팅(링크)에 있다.


먼저 첫번째 및 두번째의 서브플롯을 그리는 방식으로는 ②번 방식을 사용하였다.

세번째 서브플롯을 그리는 방식으로는 ①방식을 사용하였다. 

위의 두 방식은 입력 방식만 다를 뿐 서로 동일한 방법을 사용하는 것을 확인할 수 있다.


그리고 두번째 플롯같은 경우는 마지막에 ③방식을 통해 서브플롯을 한번 더 설정하였고 해당 방식으로 두번째 플롯이 덮어쓰기가 된것을 확인할 수 있다.


마지막으로 tight_layout()함수를 통해 자동으로 레이아웃을 설정하도록 하게 만들었다.


작성 예제) subplot_ex.py

import matplotlib.pyplot as plt


# 첫번째 플롯

ax1= plt.subplot(131)

graph1= plt.plot([1,2,3])


# 두번째 플롯

ax2= plt.subplot(132)

graph2= plt.bar(x=[1,2,3], height=[1,2,3])


# 세번째 플롯

ax3= plt.subplot(1, 3, 3)

graph3= plt.scatter([1,2,3], [1,2,3])


# 두번째 플롯(축입력 방식)

ax2= plt.subplot(ax2)

graph2= plt.bar([1,2,3], [3,1,1])


# 자동 레이아웃 설정

plt.tight_layout()


plt.show()






 

 

 

 

 참고자료

  https://matplotlib.org/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py

  https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot.html

  https://matplotlib.org/api/_as_gen/matplotlib.pyplot.tight_layout.html#matplotlib.pyplot.tight_layout

  https://matplotlib.org/tutorials/intermediate/tight_layout_guide.html#sphx-glr-tutorials-intermediate-tight-layout-guide-py

 

 

 

 


반응형

댓글