일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- JAX
- teps
- 텝스
- 논문작성
- MATLAB
- LaTeX
- Julia
- Dear abby
- Numerical Analysis
- 논문작성법
- WOX
- Statics
- 생산성
- 우분투
- 딥러닝
- 옵시디언
- 수식삽입
- pytorch
- IEEE
- ChatGPT
- 텝스공부
- matplotlib
- 고체역학
- Python
- obsidian
- 에러기록
- 인공지능
- Zotero
- 수치해석
- Linear algebra
- Today
- Total
뛰는 놈 위에 나는 공대생
[Python] 내가 헷갈려서 기록하는 matplotlib의 subplot 그리기 본문
[Python] 내가 헷갈려서 기록하는 matplotlib의 subplot 그리기
보통의공대생 2021. 4. 22. 15:02
matplotlib을 깊이 다뤄본 분들은 알겠지만
matplotlib은 사용법이 2가지가 있다.
1. 간단하게 사용하는 방법(pyplot interface를 이용하는 방법)
2. 객체를 이용하는 방법(Object-oriented interface를 이용하는 방법)
차라리 한 가지 방법만 일관되게 사용하면 좋을텐데, 예제코드마다 방식이 달라서 혼동이 많다. 보통 구글링을 통해 코드를 구하다보면 많이 공감하실 거라 생각한다.
제일 확실한 방법은 라이브러리에 들어가서 찾아보는 방법이다. (나 역시 답답해서 찾아본 케이스..)
1. 1번 방법과 2번 방법 비교
어떤 코드를 보면
import matplotlib.pyplot as plt
x = np.linspace(0, 2, 100)
plt.plot(x, x, label='linear') # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic') # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()
라이브러리를 plt로 읽어들이고, 바로 그 위에서 plot을 써서 그림을 그리는 경우가 있다.
반면에 똑같은 그림을 그릴 때도 아래와 같이 할 수도 있다.
x = np.linspace(0, 2, 100)
# Note that even in the OO-style, we use `.pyplot.figure` to create the figure.
fig, ax = plt.subplots() # Create a figure and an axes.
ax.plot(x, x, label='linear') # Plot some data on the axes.
ax.plot(x, x**2, label='quadratic') # Plot more data on the axes...
ax.plot(x, x**3, label='cubic') # ... and some more.
ax.set_xlabel('x label') # Add an x-label to the axes.
ax.set_ylabel('y label') # Add a y-label to the axes.
ax.set_title("Simple Plot") # Add a title to the axes.
ax.legend() # Add a legend.
이번에 주목해야 하는 코드는
fig, ax = plt.subplots()
다음 코드이다. 두 코드를 돌려도 결과는 똑같다.
원래 matplotlib은
위 그림처럼 figure라는 도화지가 있고, ax라는 그림창에 그림을 채우는 형태이다.
fig, ax = plt.subplots()
이 코드는 간단하게 figure와 그 그림창(ax)를 동시에 받아내는 함수를 사용한 예시인 것이다.
그리고 ax에 대해서 plot을 그린다.
또 이렇게 ax에 대해서 받으면 기존에 plt.xlabel 대신 ax.set_xlabel이란 axes 전용 함수를 써줘야 한다.
fig, ax 각각의 객체를 받아낼 수 있는 함수 역시 존재한다.
그에 대한 예시는 바로 다음에 소개한다.
2. figure 객체를 이용해서 그림을 그리는 방법
# First create some toy data:
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)
# Create a figure
plt.figure()
# Create a subplot
ax = fig.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
# Create two subplots and unpack the output array immediately
ax1, ax2 = fig.subplots(1, 2, sharey=True)
ax1.plot(x, y)
ax1.set_title('Sharing Y axis')
ax2.scatter(x, y)
# Create four polar Axes and access them through the returned array
axes = fig.subplots(2, 2, subplot_kw=dict(projection='polar'))
axes[0, 0].plot(x, y)
axes[1, 1].scatter(x, y)
# Share a X axis with each column of subplots
fig.subplots(2, 2, sharex='col')
# Share a Y axis with each row of subplots
fig.subplots(2, 2, sharey='row')
# Share both X and Y axes with all subplots
fig.subplots(2, 2, sharex='all', sharey='all')
# Note that this is the same as
fig.subplots(2, 2, sharex=True, sharey=True)
이 코드는 figure 객체만 가져온 다음에 그 fig에 subplots라는 하위 함수를 사용해 그림창을 추가하고 그 그림창에 plotting하는 예시이다.
이와 같이 plt.subplots으로 figure와 ax 둘 다 동시에 받아오는 게 아니라 figure 먼저 받고 그 fig 객체에 속한 함수를 이용해서 그림을 그릴 수도 있다.
figure 객체를 가지고 있으면 figure에 대한 구체적인 parameter를 조정할 수 있다는 장점이 있다.
3. subplot 그리는 법
위에서 똑같은 그림을 그리더라도 방법이 여러 개인 것을 보여줬다.
따라서 subplot을 그리는 방법도 여러 개일 수밖에 없다.
1) plt.subplots(m,n)
라이브러리를 참고하면 다음과 같은 설명이 있다.
Create a figure and a set of subplots.
This utility wrapper makes it convenient to create common layouts of subplots, including the enclosing figure object, in a single call.
subplots에서 figure와 axs를 여러 개로 받아서
각각에 ax에 대해 그림을 그리는 방법이 있다.
# using the variable ax for single a Axes
fig, ax = plt.subplots()
# using the variable axs for multiple Axes
fig, axs = plt.subplots(2, 2)
# using tuple unpacking for multiple Axes
fig, (ax1, ax2) = plt.subplots(1, 2)
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
앞서 본 것처럼 plt.subplots()에 아무런 인자도 넣지 않으면 single axes만 반환하고, 여러 개를 넣으면 an array of Axes objects 형태로 반환하는데 이 때 위의 두 번째 코드처럼 axs로 받으면, 인덱싱을 통해 각각의 그림창에 접근할 수 있다.
이 그림창에서 ax1.plot 등을 이용해서 그림을 그려주면 된다.
2) plt.subplot()
subplot(nrows, ncols, index, **kwargs) 함수는 axes of subplot을 return한다.
이 return 값을 사용해서 지정을 해도 괜찮고,
return 값 없이 기존의 plt.plot처럼 사용해도 괜찮다.
dx = np.linspace(0, 2*np.pi, 400)
dy = np.sin(dx**2)
dy2 = np.sin(dx**3)
plt.subplot(2,1,1)
plt.plot(dx,dy)
plt.subplot(2,1,2)
plt.plot(dx,dy2)
plt.show()
ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)
ax1.plot(dx,dy)
ax2.plot(dx,dy2)
plt.show()
둘 다 다음과 같은 결과가 나옵니다.\\
정말 자세히 subplots와 subplot을 비교하고 싶다면 아래 링크에서 라이브러리의 내용을 참고하는 것을 권한다.
3) Figure.add_subplot
figure 객체를 이용해서 subplot을 만드는 방법
fig = plt.figure()
fig.add_subplot(231)
ax1 = fig.add_subplot(2, 3, 1) # equivalent but more general
fig.add_subplot(232, frameon=False) # subplot with no frame
fig.add_subplot(233, projection='polar') # polar subplot
fig.add_subplot(234, sharex=ax1) # subplot sharing x-axis with ax1
fig.add_subplot(235, facecolor="red") # red subplot
ax1.remove() # delete ax1 from the figure
fig.add_subplot(ax1) # add ax1 back to the figure
나중에 더 추가할 수도 있음
참고
matplotlib.org/stable/tutorials/introductory/usage.html?highlight=object%20oriented
matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplots.html
matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot.html#matplotlib.pyplot.subplot
'프로그래밍 Programming > 파이썬 Python' 카테고리의 다른 글
[Matplotlib] 내가 쓰는 배경이 어두운 색일 때 matplotlib 설정 (0) | 2022.04.27 |
---|---|
파이썬에 대한 몇 가지 설명 (0) | 2021.05.25 |
[Python] Numpy 라이브러리(2) (0) | 2021.03.27 |
[Python] Numpy 라이브러리 (1) (0) | 2021.03.26 |
[Python] 파이썬 Functions 만들기 (0) | 2021.03.26 |