Python/Matplotlib

[Matplotlib] 파이썬 그래프 여러개 다중 플롯(subplot) 초간단 설정 방법

jimmy_AI 2021. 12. 31. 13:34
반응형

파이썬 plt 그림 여러개 간단하게 설정하기 : plt.subplots()

안녕하세요. 이번 포스팅에서는

파이썬 matplotlib 라이브러리에서 그래프 여러개를 한 화면에 동시에 나타내고,

각 그래프의 세부 사항들을 손쉽게 설정할 수 있는 간단한 방법을 살펴보겠습니다.

 

다중 플롯 격자 생성, figure 크기 및 여백 정하기

우선, 가장 먼저 subplot 여러개를 그리기 위한 격자를 생성해보겠습니다.

예를들어, 세로 3개, 가로 4개 사이즈의 격자를 만들고 싶다면 아래와 같이

코드를 작성해주시면 됩니다.

plt.subplots() 함수 내에 y, x 방향으로 몇 개의 격자를 만들 것인지를 지정하면

다양한 형태의 격자를 만들 수 있습니다.

f, axes로 각각 figure 전체를 컨트롤하는 변수그래프 각각을 조절할 수 있는 변수

2가지를 받아왔습니다.

 

이제 격자의 크기를 조정하고, 여백을 설정해보겠습니다.

아래 코드에 적힌 메소드를 참조하시면 됩니다.

f, axes = plt.subplots(3, 4)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.3, hspace = 0.3)

plt.show()

확실히 각 subplot이 탁 트이게 잘 구분되는 것을 확인할 수 있었습니다.

격자 여백은 가로 방향은 wspace, 세로 방향은 hspace 인자로 지정하시면 됩니다.

 

 

subplot 내 원하는 위치에 그래프 그리기

subplot 내의 각 위치에 접근하는 방법은 매우 간단합니다.

위에서 그래프 각각을 조절할 수 있는 변수인 axes에 대해서

인덱싱을 통하여 접근해주시면 됩니다.

 

참고로, axes[0, 1] 혹은 axes[0][1] 형태의 인덱싱이 모두 가능합니다.

각 칸에는 다른 종류의 그래프도 얼마든지 들어갈 수 있으며,

아래 코드에서 예시 그래프 몇 가지를 그려보도록 하겠습니다.

f, axes = plt.subplots(3, 4)
f.set_size_inches((20, 15))
plt.subplots_adjust(wspace = 0.3, hspace = 0.3)

# [0, 1] 위치 막대 그래프
axes[0, 1].bar(['x', 'y', 'z'], [15, 13, 18], color = ['r', 'g', 'y'], alpha = 0.4)

# [1, 3] 위치 선 그래프
axes[1][3].plot(range(5), [2, 8, 6, 3, 7], color = 'blue', marker = 'o')

# [2, 0] 위치 scatter 그래프(색깔 다르게 2개 겹치기)
axes[2, 0].scatter(range(5), [2, 8, 6, 3, 7], color = 'red', s = 10)
axes[2, 0].scatter([0.5, 1.5, 2.5, 3.5, 4.5], [4, 5, 4, 2, 6], color = 'purple', s = 10)

plt.show()

지정한 세 개의 위치에 원하는 형태의 그래프가 잘 그려진 것을 확인했습니다.

한 subplot 칸 내에 여러 그래프를 겹치는 것도 얼마든지 가능합니다.

반응형

figure 전체, 각 subplot에 대하여 제목 및 축 제목 정하기

figure 전체에 대한 제목 및 각 subplot의 제목 및 축 제목을 설정하는 방법도

말씀드려보겠습니다.

 

figure 전체에 대한 제목은 앞에서 정한 그래프 전체에 대한 f 변수에 대해

f.suptitle() 함수로 설정해주시면 됩니다.

 

각 subplot 내 figure의 제목은 각 위치를 인덱싱한 뒤,

axes[0, 1].set_title() 형태로 지정하게 되고,

축 제목은 axes[0, 1].set_xlable()처럼 지정해주시면 됩니다.

 

이 외에도 legend, text 등 기존 plt에서 사용하던 여러 메소드

모두 마찬가지 방법으로 설정할 수 있습니다.

아래 예시 코드에서 다양한 경우의 예제를 보여드리며,

이번 포스팅을 마무리해보도록 하겠습니다. 감사합니다.

f, axes = plt.subplots(2, 2)
f.set_size_inches((12, 12))
plt.subplots_adjust(wspace = 0.15, hspace = 0.15)

# figure 전체 제목
f.suptitle('Subplot Example', fontsize = 15)

# 막대 그래프 예시(제목 설정)
axes[0, 0].bar(['x', 'y', 'z'], [15, 13, 18], color = ['r', 'g', 'y'], alpha = 0.4)
axes[0, 0].set_title('bar graph example', fontsize = 12)

# 선 그래프 예시(축 제목 설정)
axes[0, 1].plot(range(5), [2, 8, 6, 3, 7], color = 'blue', marker = 'o')
axes[0, 1].set_xlabel('x value', fontsize = 11)
axes[0, 1].set_ylabel('y value', fontsize = 11)

# scatter plot 예시(범례 설정)
axes[1, 0].scatter(range(5), [2, 8, 6, 3, 7], color = 'red', s = 10, label = 'data1')
axes[1, 0].scatter([0.5, 1.5, 2.5, 3.5, 4.5], [4, 5, 4, 2, 6], color = 'purple', s = 10, label = 'data2')
axes[1, 0].legend(loc = 'upper right')

# text 예시
axes[1, 1].text(0.3, 0.3, 'hello world!', size = 12)
axes[1, 1].text(0.6, 0.6, 'how are you?', size = 12)

plt.show()