1. matplotlib 다루기 Last updated: 2023-10-17 10:31:21

맷플롯립(matplotlib)은 파이썬에서 시각화를 위해 가장 많이 사용되는 라이브러리이다. 맷플롯립은 사용하기 쉽고 다양한 차트를 제공하며 대표적인 파이썬 데이터 구조를 제공하는 판다스와 궁합도 잘 맞는다.

1.1 맷플롯립 모듈 설치

pip 명령을 이용해 맷플롯립을 설치하는 방법은 다음과 같다.

$ pip install matplotlib

conda를 이용해 matplotlib을 설치하는 방법은 다음과 같다.

$ conda install -c conda-forge matplotlib


1.2 맷플롯립의 기본


1.2.1 맷플릿롭의 구성 요소

맷플롯립은 subplots( ) 함수를 이용해 차트를 그릴 영역을 생성하는데 전체 도화지를 대표하는 Figure 한 개를 갖는다. 그리고 가 안에 최소 1개 이상의 axe를 갖는다. Axe 한 개마다 x축과 y축에 해당하는 axis를 가지고 있다. subplots( ) 함수의 기본 인자는 subplots(nrows=1, ncols=1)이다. 따라서 기본 인자 없이 subplots( ) 함수를 호출하면 1행 1열에 해당하는 1개의 axe를 반환한다. 이 nrows와 ncols를 조절하면 하나의 Figure 안에 n행 m열에 해당하는 n x m개의 차트 영역(axes)를 생성하게 된다. 각 axe에 원하는 차트를 별도로 그리면 각 차트는 서로 다른 데이터를 서로 다른 형태로 표시할 수 있게 된다. 또한 각 axe 들은 별도의 subtitle을 갖을 수 있다.


참고


image

[그림 8-1-1] 맷플롯립의 화면 구성 요소



1.2.2 맷플롯립 차트의 기본

맷플롯립 차트의 기본 요소들에 대해 설명한다. 다음은 간단한 차트를 그리는 예제이다.

[예제 8- 1] 간단한 차트 플롯 그리기

# [1] 모듈 임포트
from matplotlib import pyplot as plt

# [2] figure 생성
fig, ax = plt.subplots()

# [3] 데이터로 선차트 그리기
ax.plot([1, 2, 3, 4], [1, 3, 2, 4])

[결과]

image

[그림 8-1-2] 선 차트 출력 결과


위 예제에 대해 설명한다.

  • [1]에서 matplotlib.pyplot 모듈을 임포트한다. pyplot모듈은 plt 라고 이름을 줄여서 많이 사용한다.

  • [2]에서 subplots( ) 함수를 이용해 맷플롯립의 그림을 위한 객체(fig)와 축(ax)을 생성한다. 이 figure와 axis를 이용해 차트를 그리거나 옵션을 지정하게 된다.

  • [3]에서 plot( ) 함수를 이용해 차트를 그린다. 첫 번째 인자는 가로축에 대한 배열이고, 두 번째 인자는 세로축에 해당하는 배열이다. 각 순서에 맞게 x값과 y값이 대응된다.

위의 예제는 특별한 옵션이 x 값과 y값을 전달하여 그린 선 차트이다. 이제 이 차트에 사용 가능한 옵션을 추가해 본다.



A. 그리드 (Grid)

그리드는 모눈종이 처럼 가로와 세로 선을 의미한다. 가로 혹은 세로 축에 눈금을 표시할 수 있다.

[예제 8- 2] 차트에 그리드 표시하기

# [1] 모듈 임포트
from matplotlib import pyplot as plt

# [2] figure 생성
fig, ax = plt.subplots()

# [3] 데이터로 선차트 그리기
ax.plot([1, 2, 3, 4], [1, 3, 2, 4])

# [4] 그리드 표시
plt.grid()

[결과]

image

[그림 8-1-3] 그리드 보기 결과


위 예제에 대해 설명한다.

  • [4]에서 grid( ) 함수를 이용해 눈금을 표시한다. grid( ) 함수를 호출하면 기본적인 눈금을 표시한다.

그리드도 표시할 대상이나 스타일 등을 추가로 지정할 수 있다.

  • axis: x 혹은 y 그리드 선택

  • color: 그리드 선 색상

  • linestyle: 선 스타일. 실선, 점선 등 (‘-’, ‘--’, ‘-.’, ‘:’ 등)

  • linewidth: 선 두께


선 스타일 예시

다음은 맷플롯립에서 사용할 수 있는 다양한 선 스타일이다.

image

[그림 8-1-4] 선 스타일 예시


다음은 가로와 세로 그리드의 스타일을 다르게 지정한 예시이다.


[예제 8- 3] 가로와 세로 그리드 그리기

# [1] 모듈 임포트
from matplotlib import pyplot as plt

# [2] figure 생성
fig, ax = plt.subplots()

# [3] 데이터로 선차트 그리기
ax.plot([1, 2, 3, 4], [1, 3, 2, 4])

# [4] 그리드 스타일 지정
plt.grid(axis='x', color='r', linestyle='--', linewidth=1)
plt.grid(axis='y', color='b', linestyle='-', linewidth=0.5)

[결과]

image

[그림 8-1-5] 그리드 스타일 적용 결과


위 예제에 대해 설명한다.

  • [4]에서 grid( ) 함수를 이용해 눈금을 표시한다. 첫 번째 그리드는 x축에 해당하는 세로 그리드이다. 선이 색은 빨간색(’r’)이고, 선 스타일은 점선(’--’)이며 굵기는 1이다. 두 번째 그리드는 y축에 해당하는 가로 그리드 인데, 색은 파란색(’b’)이고 선은 실선(’-’)이며 선 굵기는 0.5이다.


B. 주석 달기

맷플롯립 차트에는 문자형 주석을 표시할 수 있는 옵션이 존재한다. Figure의 제목, 각 Subplot의 제목, 플롯 라벨, x축과 y축 이름 등 이다. 다음 예제를 통해 문자열 주석을 다는 방법에 대해 알아보자. (참고로, 아직 한글 표시가 아니라 영어를 대상으로 설명한다. 기본 폰트가 영어이기 때문에 한글을 입력하면 문자열이 제대로 표시되지 않을 것이다. 한글 폰트를 설정하는 방법에 대해서는 뒤에 다시 설명합니다)

[예제 8- 4] 차트 주석 달기

# [1] 모듈 임포트
from matplotlib import pyplot as plt

# [2] figure 생성
fig, ax = plt.subplots()

# [3] 데이터로 선차트 그리기
ax.plot([1, 2, 3, 4], [1, 3, 2, 4], label='Line #1')
ax.plot([1, 2, 3, 4], [2, 4, 1, 2], label='Line #2')

# [4] 그리드 스타일 지정
plt.grid()

# [5] 제목 스타일
plt.title(label="Chart Title", fontdict={'fontsize':14, 'fontweight':'bold', 'color':'b'}, loc='right')

# [6] 축 이름 지정
plt.xlabel('x-index')
plt.ylabel('y-value')

# [7] 라벨 표시
plt.legend()

[결과]

image

[그림 8-1-6] 제목, 레전드 및 축이름 출력


위 예제에 대해 설명한다.

  • [3]에서 두 개의 선 차트를 그린다. 각각 'Line #1'과 'Line #2'라는 이름을 갖는다. 각 선의 이름을 차트에 표시하려면 plot( ) 함수에서 label 값으로 입력하고 차트를 화면에 표시하기 전에 pyplot.legend( ) 함수를 호출해야 라벨이 화면에 표시 된다.

  • [4]에서 grid( ) 함수를 이용해 눈금을 표시한다.

  • [5]에서 차트 제목을 입력한다. pylot.title( ) 함수의 필수 인자는 label이며 이후 스타일에 관련한 fontdict, loc 등은 옵션이다. 필요시 fontdict 인자를 통해 표시할 폰트의 스타일을 dictionary 형태로 입력한다. loc 옵션을 이용하면 제목 표시 위치를 지정할 수 있다.

  • [6]에서 x축과 y축의 이름을 지정한다.

  • [7]에서 pyplt.legend( ) 함수를 이용하면 앞에서 라벨을 지정한 내용을 화면에 표시한다.


다음은 위의 코드를 실행한 결과 이다. 보이는 바와 같이 두 라인 차트가 화면에 표시된다. 두 선은 별도로 스타일을 지정하지 않았으나 맷플롯립이 알아서 두 선의 색을 달리하여 쉽게 구분할 수 있도록 해주었다. 차트 제목은 파란색 글씨로 우측 정렬이 되었다. 라벨은 좌측 상단에 표시 되어있는데 맷플롯립이 알아서 빈 공간을 찾아 위치 시키기 때문에 표시되는 곳은 그때 그때 다를 수 있다. x축은 하단 중앙에 ‘x-index’라고 표시되었고 y축은 좌측 중앙에 ’y-value’라고 표시되었다.



C. 한글 표시하기

맷플롯립은 기본적으로 운영 체제에 따라 기본 영문 폰트를 사용하고 있다. 윈도우의 경우 기본 설정된 폰트를 출력해보면 ‘sans-serif’라고 표시된다.

[예제 8- 5] 폰트 출력하기

from matplotlib import pyplot as plt
print(plt.rcParams['font.family'])

[결과]

['sans-serif']

이렇게 영문 폰트로 설정된 상태에서 한글을 입력하면 아래와 같이 글자가 깨져서 ▯▯ 처럼 보이다.


[예제 8- 6] 영문 폰트에서 한글 표시하기

from matplotlib import pyplot as plt

# [1] figure 생성
fig, ax = plt.subplots(figsize=(4, 3))
fig.suptitle("제목")
ax.plot([1, 2, 3, 4], [1, 3, 2, 4], label="차트")
plt.legend()

fig.savefig("matplotlib_font.png", dpi=200)

[결과]

image

[그림 8-1-7] 한글 표시 오류


위 코드에서 한글로 제목과 라벨을 지정하고 있다. 하지만 한글 폰트가 지정되지 않은 상태이기 때문에 한글이 정상적으로 출력되지 않았다.


맷플롯립에서 폰트를 지정하는 방법은 pyplot.rc( ) 함수를 이용하는 것이다. 다음과 같이 rc 함수에 한글을 지원하는 font family 정보를 지정하면 된다.

형식

plt.rc('font', family='폰트 명칭')

파라미터

• family : 사용할 폰트의 명칭을 지정한다.

예시

# 굴림 폰트를 pyplot의 기본 폰트로 지정
plt.rc('font', family='Gulim')

다음은 한글을 지원하는 굴림 폰트를 지정하고 한글을 출력하는 예제이다.


[예제 8- 7] 한글 폰트로 표시하기

from matplotlib import pyplot as plt

plt.rc("font", family="Gulim")

# [2] figure 생성
fig, ax = plt.subplots(figsize=(4, 3))
fig.suptitle("제목")
ax.plot([1, 2, 3, 4], [1, 3, 2, 4], label="차트")
plt.legend()

fig.savefig("matplotlib_font01.png", dpi=200)

[결과]

image

[그림 8-1-8] 한글 출력 결과


한글 폰트를 지정하고 실행한 결과를 보면 한글이 정상적으로 출력 되었다.


각자의 컴퓨터는 운영체제와 조건에 따라 설치된 한글 폰트가 다를 수 있다. 다음은 대표적인 한글 폰트이니 이 중에 찾아보거나 자신의 컴퓨터에 한글 폰트를 직접 설치해 사용할 수도 있다.


대표적인 한글 폰트

다음은 판다스에서 사용할 수 있는 대표적인 한글 폰트들이다. 설치 환경에 따라 다르지만 아래 폰트명을 활용해 자신에게 맞는 한글 폰트를 적용해 보기 바란다.

  • 굴림: Gulim

  • 맑은 고딕: Malgun Gothic

  • 바탕체: Batang



D. 플롯 스타일

다음은 데이터에 해당하는 플롯 라인이 스타일을 지정하는 방법에 대해 설명한다. pyplot.plot( ) 함수에 인자로 스타일을 지정하면 되는데 선의 색, 마커, 선 스타일을 포맷 문자열로 쉽게 한번에 입력할 수 있다.

[예제 8- 8] 플롯 스타일 변경하기

# [1] 모듈 임포트
from matplotlib import pyplot as plt

# [2] figure 생성
fig, ax = plt.subplots()

# [3] 데이터로 선차트 그리기
ax.plot([1, 2, 3, 4], [1, 3, 2, 4], 'b+-', label='Line #1')
ax.plot([1, 2, 3, 4], [2, 4, 1, 2], 'rv--', label='Line #2')

[결과]

image

[그림 8-1-9] 마커 표시하기


위 예제에 대해 설명한다.

  • [3]에서 데이터를 플로팅 하는데 데이터 다음 인자로 ‘b+-’, ‘rv--’와 같이 포맷 문자열을 전달한다. 첫 번째 b, r 등은 색에 해당하는 약어이다. 두 번째 +, v 등은 마커 스타일에 대한 문자열이다. 마지막 - 혹은 -- 등은 선 스타일에 대한 문자열이다.

  • 실행한 결과를 보면 첫 번째 b+- 포맷 스타일은 파란색(blue)에 십자(+) 마크로 실선(-) 스타일이다. 두 번째 rv--은 빨간색(red)에 아래 삼각형(v)에 점선(--) 스타일이다.

Hint! 포맷 문자열 (fmt)

포맷 문자열은 다음과 같이 구성되어 있다.

fmt = '[marker][line][color]'

fmt 문자열을 사용하면 쉽게 마커, 선 스타일 및 선 색을 지정할 수 있다. 더 자세한 내용은 맷플롯립의 Format Strings을 참조하기 바란다. https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.plot.html#examples-using-matplotlib-axes-axes-plot



마커 스타일 (Marker Style) 문자

값이 위치하는 점마다 여러 스타일의 마커를 표시할 수 있다. 마커를 선택하기 위한 기호 심볼을 참고해 원하는 모양을 표시하기 바란다.

image

[그림 8-1-10] 마커 스타일 예시

(참조: https://matplotlib.org/stable/gallery/lines_bars_and_markers/marker_reference.html)


색 표시 문자

맷플롯립에서 색을 나타내는 방법은 여러가지가 있다. 그 중에서 문자로 대표적인 색을 지정할 수 있는데 다음의 문자열이 대표적으로 색 표시를 위해 사용되는 문자 기호이다.

  • ‘b’: blue, 파란색

  • ‘g’: green, 초록색

  • ‘r’: red, 빨간색

  • ‘c’: cyan, 청록색

  • ‘m’: magenta, 자홍색

  • ‘y’: yellow, 노란색

  • ‘k’: black, 검은색

  • ‘w’: white, 흰색


E. 플롯 크기(figsize) 지정

플로팅할 차트의 출력 크기를 figsize옵션을 통해 지정할 수 있다. 맷플롯립은 지정된 크기에 따라 플롯을 배치하고 스케일을 자동 조절하여 출력한다. 다음과 같이 subplots( ) 함수로 figure와 ax를 생성할 때 figsize 인자에 튜플 형태로 생성할 플롯의 가로와 세로 크기를 입력하면 된다.

형식

plt.subplots(figsize=(가로크기, 세로크기))

파라미터

• figsize (string) : 생성할 플롯의 가로, 세로 크기를 지정한다.

예시

plt.subplots(figsize=(120, 50))


F. 가로선 추가하기

차트에 가로선을 추가하려면 모든 x값에 대해 동일한 y값을 지정해 선 차트를 그릴 수도 있지만 hlines( ) 함수를 이용해 쉽게 추가할 수 있는 기능을 제공한다.

형식

pyplot.hlines(y, xmin, xmax, colors=none, linestyles='solid', label='', data=None, **kwargs)

파라미터

• y (int) : 가로 선이 위치할 y축 값을 입력한다.
• xmin : 가로선이 시작하는 x 최소값이다.
• xmax : 가로선이 끝나는 x 최대값이다.
• colors : (옵션) 가로선 색을 입력한다.
• linestyle : (옵션) {'solid', 'dashed', 'dash dot', 'dotted'} 중 선택한다. 기본 값은 'solid'이다.


G. 세로선 추가하기

차트에 세로 선을 추가하려면 vlines( ) 함수를 이용하면 된다.

형식

pyplot.vlines(x, ymin, ymax, colors=none, linestyles='solid', label='', data=None, **kwargs)

파라미터

• x: 세로선이 위치할 x축 값을 입력한다.
• ymin: 세로선이 시작하는 y 최저값이다.
• ymax: 세로선이 끝나는 y 최고값이다.
• colors: (옵션) 가로선 색을 입력한다.
• linestyle : (옵션) {'solid', 'dashed', 'dash dot', 'dotted'} 중 선택, 기본 값은 'solid'


1.3. 플롯 그리기


1.3.1 다중 플롯 그리기

앞에서 간단히 설명했듯이 하나의 Figure 안에 여러 개의 플롯을 그리기 위해서는 여러 개의 subplot을 생성하면 된다. 여러 개 subplot을 한 번에 생성하려면 subplots( ) 함수를 호출해 Figure와 axe를 생성할 때 몇 행 몇 열인지 nrows와 ncols값을 지정하면 된다. 그러면 1행 2열, 2행 1열, 2행 2열 등 여러 개의 axe를 생성하고 각 axe에 원하는 플롯을 그릴 수 있다.

형식

plt.subplots(nrows=1, ncols=1)

파라미터

• nrows (int) : 생성할 플롯의 줄 갯수
• ncols (int) : 생성할 플롯의 열 갯수

다음은 subplots( ) 함수를 이용해 Figure와 axe를 생성하는 방법들 이다.


[예제 8- 9] 플롯 여러개 만들기

# [1] 기본 옵션으로 생성
fig, ax = plt.subplots()

# [2] 행과 열을 지정하여 생성
fig, ax = plt.subplots(nrows=2, ncols=2)

# [3] 행과 열 갯수를 지정한 후 각 ax 변수에 저장
fig, (ax1, ax2) = plt.subplots(1, 2)

# [4] 행과 열 갯수를 지정한 후 각 ax 변수에 저장
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)

다중 플롯을 만드는 다른 방법으로는 plt.subplot( ) 함수를 사용하는 것이다. subplots( ) 함수가 한 번에 여러 개의 subplot을 생성하는 것과 다르게 subplot( ) 함수는 한 번에 한 개씩 subplot을 생성하는 방법이다.

형식

plt.subplot(nrows, ncols, index)

파라미터

• nrows (int) : 생성할 플롯의 줄 갯수
• ncols (int) : 생성할 플롯의 열 갯수
• index: 1부터 시작하는 plot의 순서, 2행 2열 인 경우 좌측 상단이 1번, 우측 상단이 2번, 좌측 하단이 3번, 우측 하단이 4번에 해당한다.

subplot( ) 함수를 이용해 플롯을 여러 개 그리는 예제이다.


[예제 8- 10] 차트 여러개 그리기

# [1] 모듈 임포트
from matplotlib import pyplot as plt

# [2] figure 얻어오기
fig = plt.figure()
fig.suptitle("Main Title")

# [3] 첫 번째 플롯 생성
ax1 = plt.subplot(1, 2, 1)
ax1.set_title("Left Chart")

# [4] 두 번째 플롯 생성
ax2 = plt.subplot(1, 2, 2)
ax2.set_title("Right Chart")

# [5] 데이터로 선차트 그리기
ax1.plot([1, 2, 3, 4], [1, 3, 2, 4], 'b+-', label='Line #1')
ax2.plot([1, 2, 3, 4], [2, 4, 1, 2], 'rv--', label='Line #2')

[결과]

image

[그림 8-1-11] 좌우 다중 플롯 그리기 출력 결과


위 예제에 대해 설명한다.

  • [1]에서 모듈을 임포트한다.

  • [2]에서 전체 figure를 얻어온다. 그리고 전체 Figure의 제목을 입력한다.

  • [3]에서 차트를 그릴 첫 번째 subplot을 생성한다. 인자가 3개인데 첫 번째 두 개는 행수와 열 수 이다. 1행 2열의 플롯을 생성하려고 하는데 마지막 인자 1은 그 중 첫 번째 플롯을 의미한다. 그리고 현재 subplot에 제목을 입력한다.

  • [4]에서 차트를 그릴 두 번째 subplot을 생성한다. 역시 동일한 구성이기 때문에 1행 2열의 인자를 전달한다. 하지만 이번에는 두 번째 subplot이기 때문에 마지막 index는 2라고 적는다. 그리고 현재 subplot에 제목을 입력한다.

  • [5]에서 각 두 개의 subplot에 차트를 플로팅 한다.

  • 실행한 결과를 확인해본다. 1행에 두 개의 subplot이 나타나고 있다. 전체 제목은 ‘Main Title’이라고 표시되어 있고, 각 subplot에도 각각 ‘Left Chart’와 ‘Right Chart’라고 제목이 따로 표시되어 있다.


1.3.2 산점도 차트

스캐터 차트는 산점도 차트라고도 부르며 선이나 바 차트가 아니라 x 및 y 좌표에 해당하는 2차원 상에 점을 찍어 표현하는 차트를 말한다. 주로 데이터 간의 연속성 보다는 전체 데이터의 분포를 시각적으로 확인하기 위해 사용한다. 맷플롯립에서 산점도를 그리기 위해서는 scatter( ) 함수를 사용한다.

다음은 scatter( ) 함수 형식이다.

형식

plt.scatter(x, y, s, c, marker)

파라미터

• x, y : 배열 형식의 x와 y의 데이터 • s : 마커 크기, 배열 형식 • c : 색상, 배열 형식 • marker (string) : 마커 스타일


A. 기본 산점도 그리기

기본적인 산점도 차트는 x와 y값에 해당하는 위치에 점을 찍어 표시하는 것이다. 다음은 대표적인 붓꽃(iris) 데이터를 산점도로 표현한 것이다.

[예제 8- 11] 산점도 차트 그리기

# [1] 모듈 임포트
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris

# [2] iris 데이터 로딩
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# [3] figure및 subplot 생성
fig, ax = plt.subplots(figsize=(5, 4), layout='constrained')

# [4] 스캐터 플로팅
ax.scatter('sepal length (cm)', 'sepal width (cm)', data=df, label='sepal', marker='^')
ax.scatter('petal length (cm)', 'petal width (cm)', data=df, label='petal', marker='v')

# [5] x, y 축 설명
ax.set_xlabel('length')
ax.set_ylabel('width')

# [6] 레전드 및 그리드 표시
plt.legend()
plt.grid()

[결과]

image

[그림 8-1-12] 붗꽃 데이터 산점도 출력 결과


위 예제에 대해 설명한다.

  • [1]에서 모듈을 임포트 한다. 붓꽃 데이터를 사용하기 위해 sklearn.datasets의 load_iris( ) 모듈도 임포트 했다.

  • [2]에서 붓꽃 데이터를 로딩 한 후 DataFrame 형태로 변환한다.

  • [3]에서 Figure와 subplot을 생성한다.

  • [4]에서 scatter( ) 함수를 이용해 각각 꽃받침(sepal)과 꽃잎(petal)의 길이와 넓이에 해당하는 위치에 산점도를 그리도록 한다. marker는 각각 표시하는 마커 모양이다. label 값을 지정해 plt.legend( ) 함수를 호출했을 때 이름이 표시되도록 한다.

  • [5]에서 x축과 y축의 이름을 입력한다.

  • [6]에서 레전드와 그리드를 표시한다.

  • 실행 결과를 확인해보자. 꽃받침은 파란색으로 위쪽 화살표(▲), 꽃받침은 주황색의 아래 화살표(▼)로 위치를 나타낸다. 두 유형의 데이터가 서로 섞이지 않고 좌측 하단과 우측 상단으로 분포가 구분되는 것을 눈으로 확인할 수 있다.


B. 산점도 추세선 그리기

산점도에 추세선을 추가하는 방법에 대해 알아보자. 산점도 그래프의 x값과 y값의 상관성을 이해하려면 산점도 데이터의 트렌드를 나타내는 추세선이 있으면 도움이 된다. 다음은 위의 붓꽃 데이터에 대해 꽃잎과 꽃받침 데이터에 대한 최적의 추세 선분을 추가하는 예제이다.

[예제 8- 12] 산점도 추세선 그리기

# [1] 모듈 임포트
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris

# [2] iris 데이터 로딩
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# [3] figure및 subplot 생성
fig, ax = plt.subplots(figsize=(5, 4), layout='constrained')
fig.suptitle("Iris")

# [4] 꽃받침 데이터 플로팅
ax.scatter('sepal length (cm)', 'sepal width (cm)', data=df, label='sepal', marker='^')
x = df['sepal length (cm)']
y = df['sepal width (cm)']
z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.plot(x, p(x),"b--")

# [5] 꽃잎 데이터 플로팅
x = df['petal length (cm)']
y = df['petal width (cm)']
z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.plot(x, p(x),"r--")
ax.scatter('petal length (cm)', 'petal width (cm)', data=df, label='petal', marker='v')

# [6] x, y 축 설명
ax.set_xlabel('length')
ax.set_ylabel('width')

# [7] 레전드 및 그리드 표시
plt.legend()
plt.grid()

[결과]

image

[그림 8-1-13] 산점도에 추세선 추가한 출력 결과


위 예제에 대해 설명한다.

  • [4]에서 꽃받침 데이터의 산점도를 플로팅 한다. 단, numpy의 polyfit( ) 함수와 poly1d 함수를 이용해 꽃받침 데이터의 추세를 나타내는 선분의 값을 계산하여 plot( ) 함수를 이용해 선분으로 플로팅 한다.

  • [5]에서 꽃잎 데이터의 산점도를 플로팅 한다. 단, numpy의 polyfit( ) 함수와 poly1d 함수를 이용해 꽃받침 데이터의 추세를 나타내는 선분의 값을 계산하여 plot( ) 함수를 이용해 선분으로 플로팅 한다.

  • 실행 결과를 확인해보면 산점도는 동일하지만 각 데이터의 산점도 추세를 나타내는 선분이 파란색과 빨간색과 선으로 표시되어 있다.


1.3.3 막대 차트

바 차트는 각 x 인덱스에 대해 막대를 이용해 y값을 길이로 표시하여 값의 크기를 상호 비교하는데 도움이 되는 차트이다.


A. 단일 막대 차트

플롯립에서 막대 차트를 그리는 함수는 bar( ) 이다.

형식

plt.bar(x, height, width, bottom, align)

파라미터

• x: 가로에 해당하는 x축 인덱스 배열
• height: x에 해당하는 y 높이 값 배열
• width : (옵션) 바 너비
• bottom: (옵션) 막대가 시작될 y값. 기본 값은 0
• align : (옵션) 막대 정렬 방법. {'center', 'edge'} 중 하나를 선택한다.

다음은 간단한 기본적인 막대 차트를 그리는 예제이다.


[예제 8- 13] 막대 차트 그리기

# [1] 모듈 임포트
from matplotlib import pyplot as plt
import pandas as pd

# [2] 데이터 파일 읽어오기
_data = pd.read_excel("학생_건강데이터.xlsx")

# [3] figure와 subplot 생성
fig, ax = plt.subplots(figsize=(7, 3), layout='constrained')
ax.set_xlabel('나이')
ax.set_ylabel('키(cm)')

# [4] 바 차트 그리기
ax.bar(_data['나이'], _data['서울특별시'], label='서울')

# [5] 레전드 표시
plt.legend()

[결과]

image

[그림 8-1-14] 단일 막대 차트 출력 결과


위 예제에 대해 설명한다.

  • [1]에서 모듈을 임포트한다.

  • [2]에서 학생 건강 데이터 파일을 읽어온다. 해당 데이터는 정부기관인 한국여성정책연구원의 통계 DB에서 가져온 데이터이다.

  • [3]에서 figure와 subplot을 생성하고 x, y 라벨을 입력한다.

  • [4]에서 bar( ) 함수를 이용해 막대 차트를 그린다. 첫 번째는 x 인덱스에 해당하는 배열이고, 두 번째는 y 높이 값에 대한 배열이다. 여기서는 데이터 중 ‘서울특별시’ 데이터 컬럼을 사용했다.


B. 이중 막대 차트

맷플롯립으로 막대 차트를 두 개 이상 중첩해서 그리려면 단순히 bar( ) 함수를 여러 번 사용해서는 안된다. x 인덱스 데이터를 순열로 배열로 만든 후 width 값을 조정해서 입력해 주어야 한다. 다음은 위 예제에 추가로 ‘부산’에 해당하는 막대 차트를 추가해 본다.

[예제 8- 14] 이중 막대 차트 그리기

# [1] 모듈 임포트
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np

# [2] 데이터 파일 읽어오기
_data = pd.read_excel("학생_건강데이터.xlsx")

# [3] figure와 subplot 생성
fig, ax = plt.subplots(figsize=(7, 3), layout='constrained')
ax.set_xlabel('나이')
ax.set_ylabel('키(cm)')

# [4] x 인덱스 생성
x_index = np.arange(len(_data))  # the label locations

# [5] 바 차트 그리기
ax.bar(x_index - 0.2, _data['서울특별시'], label='서울', width=0.38)
ax.bar(x_index + 0.2, _data['경기도'], label='경기', width=0.38)

# [6] 실제 x값 지정
plt.xticks(x_index, _data['나이'])

# [7] 레전드 표시
plt.legend()

[결과]

image

[그림 8-1-15] 이중 막대 차트 출력 결과


위 예제에 대해 설명한다.

  • [1]에서 모듈을 import 한다.

  • [2]에서 데이터를 DataFrame 형태로 읽어온다.

  • [3]에서 figure와 subplot을 생성하고 x, y 라벨을 입력한다.

  • [4]에서 x 인덱스를 생성한다. 이전에 사용했던 _data[’나이’]의 값은 카테고리컬 값이므로 0부터 시작해 1씩 증가 되는 순열 형식의 x 인덱스 배열을 생성한다. 추후 실제 x 위치 값은 0, 1, 2 … 식으로 되고 차트 순서에 따라 너비를 더하거나 빼서 막대 차트가 서로 중첩되지 않도록 위치시킬 예정이다.

  • [5]에서 x 인덱스와 y 높이값 배열을 이용해 막대 차트를 그린다. 첫 번째 막대는 x 인덱스에 모두 0.2를 빼서 실제 x 위치 값은 [-0.2, 0.8, 1.8, 2.8, …10.8, 11.8]이 되고 두 번째 막내 차트의 x 인덱스는 0.2를 더하므로 x 위치 값은 [0.2, 1.2, 2.2, …, 11.2, 12.2]가 된다. 막대는 더하거나 뺀 가중치 값을 고려해 0.2 x 2 = 0.4 정도로 하면 서로 중첩되지 않는다.

  • [6]에서 x에 해당하는 배열 값을 xticks( ) 함수를 이용해 별도로 입력해 준다. 만일 xticks( ) 함수를 이용하지 않으면 실제 x에 해당하는 나이 값이 x 축에 표시되지 않고 순열 인덱스가 표시된다.

위에서 사용한 코드를 이해했다면 너비를 조정해 가면서 2개 이상의 막대 차트도 그리는 것이 어렵지 않을 것이다.



C. 누적 막대 차트

누적 막대 차트에 대해 알아보자. 누적 막대는 x에 해당하는 y값이 두 개 이상인 경우 막대 차트를 나란히 그리는 것이 아니라 이전 값 위에 쌓아서 그리는 차트이다. 누적 차트는 x에 해당하는 y값이 여러 개 이고 전체 누적 합계를 한 번에 확인하는데 도움이 되는 차트이다. 다음은 동일한 나이에 대해 3개 지역이 평균 키 값을 쌓은 누적 막대 차트를 그리는 예제이다.

[예제 8- 15] 누적 막대 그리기

# [1] 모듈 임포트
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np

# [2] 데이터 파일 읽어오기
_data = pd.read_excel("학생_건강데이터.xlsx")

# [3] figure와 subplot 생성
fig, ax = plt.subplots(figsize=(7, 3), layout='constrained')
ax.set_xlabel('나이')
ax.set_ylabel('키(cm)')

# [4] 바 차트 그리기
ax.bar(_data['나이'], _data['서울특별시'], label='서울')
ax.bar(_data['나이'], _data['경기도'], label='경기', bottom=_data['서울특별시'])
ax.bar(_data['나이'], _data['부산광역시'], label='부산', bottom=_data['서울특별시']+_data['경기도'])

# [5] 레전드 표시
plt.legend()

fig.savefig('matplotlib13.png', dpi=200)

[결과]

image

[그림 8-1-16] 누적 막대 차트 출력 결과


위 예제에 대해 설명한다.

  • [1]에서 모듈을 import 한다.

  • [2]에서 데이터를 DataFrame 형태로 읽어온다.

  • [3]에서 figure와 subplot을 생성하고 x, y 라벨을 입력한다.

  • [4]에서 바 차트를 그린다. 3 종류의 데이터 배열이 있으므로 총 3번 bar( ) 함수를 이용해 차트를 그린다. 여기서 주의할 점은 bottom 인자이다. bottom은 시작하는 y값을 지정하는 것으로 첫 번째 막대 차트는 y값이 모두 0에서 시작하므로 따로 지정하지 않았다. 하지만 두 번째 막대 차트부터는 이전의 y 값을 누적 하여 bottom 값으로 지정해야 그 이후부터 y 값을 쌓을 수 있다. 이 점만 주의하면 기본적인 막대 차트를 그리는 것과 크게 다르지 않다.


1.3.4 히스토그램 차트 그리기

히스토그램은 x 인덱스에 해당하는 데이터의 빈도수를 막대 차트 형태로 표시하는 것이다. 데이터의 분포를 분석해 데이터가 한쪽에 치우치지 않았는지, 이상치는 없는지 등을 확인할 때 사용한다. 히스토그램은 기본적으로 값의 빈도수를 계산해서 그리기 때문에 입력하는 데이터는 x에 해당하는 값 배열 하나만 필요하다.

형식

plt.hist(x, bins=10)

파라미터

• x : 히스토그램 분석에 사용 할 배열 형식의 데이터
• bins (int) : (옵션) 몇 개의 막대로 나눌지 기준을 정한다. 기본 값은 10이다.

다음은 붓꽃 데이터에서 꽃받침 길이 데이터의 히스토그램 빈도를 차트로 그리는 예시이다.


[예제 8- 16] 히스토그램 차트 그리기

# [1] 모듈 임포트
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris

# [2] iris 데이터 로딩
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# [3] figure및 subplot 생성
fig, ax = plt.subplots(figsize=(5, 3), layout='constrained')
fig.suptitle("붓꽃 히스토그램")

# [4] 히스토그램 그리기
plt.hist(x=df['sepal length (cm)'], bins=20, label="꽃받침 길이")

plt.legend()

fig.savefig('matplotlib14.png', dpi=200)

[결과]

image

[그림 8-1-17] 히스토그램 차트 출력 결과


위 예제에 대해 설명한다.

  • [1]에서 모듈을 import 한다.

  • [2]에서 붓꽃 데이터를 읽어와 DataFrame 형태로 변환한다.

  • [3]에서 figure와 subplot을 생성하고 x, y 라벨을 입력한다.

  • [4]에서 히스토그램을 그릴 x 데이터를 배열 형태로 입력한다. bins는 20인데 히스토그램을 총 몇 개 막대로 나누어 그릴지 지정하는 것이다.

  • 결과 이미지를 보면 총 20개의 막대 차트로 각 x에 해당하는 데이터의 갯수를 히스토그램으로 표현하였다.