IT/언어

[python] matplotlib 사용법 기초

개발자 두더지 2021. 8. 9. 23:31
728x90

 matplotlib는 figure이나 subplot등이 어떻게 움직이는지 알기 어렵다. 따라서 이번 포스팅을 통해 matplotlib의 구조에 대해서 간략하게 정리하고자 한다.

 포스팅은 내용은 기본적으로 matplotlib.pyplot을 import된 상태라는 가정하에 설명하고 있다.

import matplotlib.pyplot as plt

 

 

plt.figure()


 plt.figure()이 맨 처음에 나오는 경우가 많다. figure()은 Figure인스턴스를 생성하는데 Figure인스턴스의 역할은 이미지 전체의 영역을 확보하는 것이다.

 인수로 아래와 같은 항목을 지정할 수 있다.

  • figsize : (width, height)의 튜플을 전달한다. 단위는 인치이다.
  • dpi : 1인치당의 도트 수
  • facecolor : 배경색
  • edgecolor : 외곽선의 색

plt.figure()에서는 이미지 영역의 확보뿐이므로, 그래프에는 아무것도 그려지지 않는다.

 

 

fig.add_subplot()


 plt.figure()으로 그래프를 그리기 위해서는 subplot를 추가할 필요가 있다. subplot의 추가는, add_subplot 메소드를 사용한다.

fig = plt.figure()
fig.add_subplot(111)

 이 코드를 작동시키면 아래와 같이 축 등의 그래프의 이미지 영역이 추가된다.

 111의 의미는, 1행째의 1열의 첫 번째라는 의미로, subplot(1, 1, 1) 로 작성해도 동일하게 작동한다. subplot는 Axes오브젝트를 반환한다. Axes는 그래프의 이미지, 축의 메모리, 라벨의 설정 등을 맡고 있다.

 add_subplot는 기본적으로 덮어쓴다. 아래는 어떻게 구성되어 있는지 알기 쉽게 하도록 하기 위해 일부로 덮어쓴 코드이다. 

fig = plt.figure()
fig.add_subplot(1, 1, 1)
fig.add_subplot(3, 3, 1)   # 3x3의 첫 번째(왼쪽 위)
fig.add_subplot(3, 3, 3)   # 3x3의 세 번째(오른쪽 위)
fig.add_subplot(3, 3, 8)   # 3x3의 여덟 번째(중간의 아래부분)

 

 

plt.subplot()


 plt.subplot()는 add_subplot와 동일하게, 인수에 행의 수, 열의 수 및 몇 번째 등을 지정할 수 있다. add_subplot과 다른 점은 현재의 이미지영역(fig=figure())에 추가하는 메소드라는 점이다.

 figure()을 몇 개나 만드는 경우는 드물지만, 만약 여러개 작성한다면 어떤 조작을 하고 있는지 알기 어렵게 된다.

plt.subplot(3,3,1)
plt.subplot(3,3,3)
plt.subplot(3,3,5)
plt.subplot(3,3,9)

 subplot는 subplot이전에 그려진 figure과 겹치는 경우, 이전의 figure을 지우는 성질을 가지고 있다.

plt.plot([1,2,3])
plt.subplot(211)   # 이 타이밍에서 plt.plot([1,2,3]) 는 삭제된다.
plt.plot(range(12))
plt.subplot(212)

 

 

plt.subplots()


 plt.subplot()와 비슷한 것으로는 plt.subplots()가 있다. 반환 값은 fig와 Axes 혹은 Axes 객체의 배열이다. 

 plt.subplots()는 실제로 fig = figure()를 한 후에 fig.add_subplot(111) 한 것과 동일하다. subplots()도 add_subplot의 경우와 동일하게 Axes 객체를 반환한다.

fig = plt.figure()
plt.add_subplot(111)

 plt.subplots()의 인수로 행의 수, 열의 수를 전달하는 것으로 여러 개의 Axes 객체를 생성할 수 있다.

fig, axes= plt.subplots(2,2)   # axes는 Axes객체의 2x2의 배열
axes[0][0].plot([1,2,3])
axes[1][0].plot([4,5,4,5])

 위 코드의 출력 결과는 아래와 같다.

 

 

 

Axes


Axes 객체는 실제 이미지 데이터의 역할을 한다. Axes 객체에 대해 그려질 데이터를 전달하거나, set_xlabel, set_ylabel, set_title로 라벨이나 타이틀의 설정을 할 수 있다. 또한, 동일하게 Axes 객체에 plot를 겹칠 수도 있다.

ax1 = plt.subplot(2,2,1)   # 4x4의 첫 번째
ax4 = plt.subplot(2,2,4)   # 4x4의 네 번째
ax1.plot([1,2,3,4])   # 첫 번째에 그림을 그린다.
ax1.plot([2,3,2,3])   # 첫 번째에 그림을 추가한다.
ax1.set_xlabel('foo')   # 첫 번째에 x 라벨을 추가한다.
ax1.set_ylabel('bar')   # 첫 번째에 y 라벨을 추가한다.
ax4.plot([5,10,20,10])   # 네 번째에 그림을 그린다.
ax4.set_title('baz')   # 네 번째에 타이틀을 추가한다.

 

 

plt.title(), plt.xlabel(), plt.ylabel()


 그래프 하나씩 그릴 때에는 plt.title(), plt.xlabel(), plt.ylabel()를 자주 사용하지만, 결국은 ax = subplot(111)하여, ax.set_title(), ax.set_xlabel(), ax.set_ylabel()하는 것과 동일하다.

 

 

plt.gcf()


 figure을 많이 만들어 놓으면 어떤 figure이 있는지 알기 어려워진다. 현재 figure를 확인하기 위한 방법으로는 plt.gcf()를 사용한다. gcf는 get current figure의 약어로, 아래의 예에서 각각의 plt.gcf() 출력 결과가 어떻게 바뀌는지 알 수 있다.

fig1 = plt.figure()
print(plt.gcf().number)   # => 1
fig2 = plt.figure()
print(plt.gcf().number)   # => 2
plt.close()
print(plt.gcf().number)   # => 1

 

 

plt.gca()


 plt.gcf() 함수와 비슷한 함수로는 plt.gca()가 있다. 이것은 현재 Axes 객체를 반환한다.

plt.subplot(111)
ax = plt.gca()

참고자료

https://qiita.com/kenichiro_nishioka/items/8e307e164a4e0a279734

728x90