파이썬 시각화 도구 기초 관련 글 모음
Matplotlib 을 통해 데이터 시각화 하기
Matplotlib 은 파이썬의 대표 시각화 도구이며, 파이썬 시각화에 큰 공헌을 한 시각화 라이브러리로서 다른 시각화 라이브러리에 많은 영향을 미쳤다. 그러나 직관적이지 못한 개발 API 로 인해서 시각화 코딩에 익숙해지는 데 많은 시간이 필요하며, 차트의 축 이름이나, 차트 타이틀, 범례(legend) 등의 부가적인 속성까지 코딩을 해줘야 하는 불편함이 있다.
맷플롯립은 이름에서 유추해 볼 수 있듯이 유명한 공학용 수치 연산과 통계 프로그램인 MATLAB에서 시각화를 위해 개발한 라이브러리에서 유래한다.
맷플롯립은 파이썬 시각화를 위한 기반 모듈인 pyplot을 제공하며 이를 통해 시각화를 구현할 수 있다.
그래프를 그리는 모듈은 matplotlib.pyplot. 이며, 흔히 plt로 줄여서 사용한다.
먼저 파이썬에서 해당 모듈을 import 해온다.
import matplotlib.pyplot as plt
%matplotlib inline
※ 여기서 '%matplotlib inline' 라는 명령은 그래프의 결과를 출력 세션에 나타나게 하는 설정
맷플롯립의 pyplot 모듈의 이해
pyplot은 plot() 함수를 통해 선 그래프를 그릴 수 있다.
- 입력값으로 x좌표에 해당하는 여러 데이터 값과 y 좌표에 해당하는 여러 데이터 값을 입력받아서 x와 y 값이 매핑되는 선 그래프를 그릴 수 있다.
- title() 함수는 입력값으로 타이틀 문자열을 받아서 차트 타이틀을 설정할 수 있다.
- show() 함수를 호출하여 축을 포함한 선 그래프를 화면에 나타낼 수 있다.
import matplotlib.pyplot as plt
# x축 입력값 [1, 2, 3], y축 입력값 [2, 4, 6]으로 선 그래프 생성
plt.plot([1, 2, 3], [2, 4, 6])
# 선 그래프 타이틀 설정
plt.title("Line Plot")
# 선 그래프 출력
plt.show()
pyplot 모듈은 MATLAB 사용자들이 시각화를 파이썬에 사용할 때 보다 쉽게 적응할 수 있도록 설계된 모듈이기에 MATLAB 스타일의 인터페이스가 반영되었다. 때문에 파이썬 언어 사상을 반영한 다른 서드파티 라이브러리들보다는 상대적으로 단순함과 직관성 측면에서 떨어지는 부분이 있다.
plt.figure
plt.plot([1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
plt.show()
plylot의 두 가지 중요 요소 - Figure와 Axes 이해
Figure와 Axes는 맷플롯립으로 코딩할 때 이 두 요소를 잘 이해하지 못한 상태에서 시작하면 맷플롯립 기반의 시각화가 어렵게 다가올 수 있다.
[Figure]
- 그림을 그리기 위한 캔버스의 역할: 그림판의 크기 조절, 플롯을 최종적으로 화면에 나타내는 역할 수행
- plt.figure(figsize=(10, 4))와 같이 plt 모듈의 figure() 함수를 호출하면 Figure 객체 반환
- figsize=(가로크기, 세로크기)
- facecolor='yellow' 등의 형태로 그림판의 배경색을 바꿀 수 있음.
[Axes(Axis 의 복수)]
- 그림을 그리는 메서드를 가지고 있어 대부분의 시각화를 수행하는 메서드들은 Axes에서 호출.
- X축, Y축, 타이틀, 범례 등의 속성을 설정.
- plt.axes() 함수는 현재 사용하는 Axes 객체를 반환한다.
plt.figure(figsize=(4,4), facecolor='skyblue')
plt.plot([1, 2, 3], [2, 4, 6])
plt.title("Line Plot")
plt.show()
plt.subplots()을 이용하여 pyplot에서 Figure와 Axes 객체를 함께 가져올 수 있다.
plt의 subplots() 함수는 인자로 여러 개의 Axes를 설정할 수 있다.
### pyplot에서 설정된 Figure와 Axes 객체를 함께 가져오기
fig, ax = plt.subplots()
print('fig type:', type(fig), '\nax type:', type(ax))
이번에는 pyplot모듈의 plot()이나 title()이 아닌 Axes 객체를 바로 이용해 선을 그려본다.
fig, ax = plt.subplots(figsize=(4,4))
# Axes 객체의 plot()을 이용해 선 그래프 그림
ax.plot([1, 2, 3], [2, 4, 6])
# Axes 객체의 set_title()을 이용해 선 그래프 타이틀 설정
ax.set_title("Line Plot")
plt.show()
▶ 앞의 pyplot의 plot()과 title()을 이용해 그린 선그래프와 동일한 결과를 얻을 수 있다.
여러 개의 plot을 가지는 subplot들 생성하기
plt.subplots() 함수는 하나의 Figure 상에서 여러 개의 그래프를 그릴 수 있게 만들어주는데, 이때 개별 subplot은 하나의 Axes를 가지게 된다. 즉, plt.subplots()은 여러 개의 그래프를 그릴 수 있게 하는 1개의 Figure와 여러 개의 Axes를 생성하고 반환한다.
[plt.subplots()의 주요 인자]
- nrows: 전체 subplot들의 배치를 2차원 행렬 형태로 표현할 때 행의 개수
- ncols: 열의 개수
- figsize: 모든 subplot들을 포함한 전체 Figure 크기
# 아래는 두 개의 subplot, 즉 두 개의 Axes를 생성하되 열 방향으로 두 개를 배치
# 전체 크기는 가로 6, 세로 3인 Figure
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(6,3))
▶ 이때 반환되는 Axes 객체는 (ax1, ax2)와 같이 튜플 형태로 반환받을 수 있으며, ax1가 첫번째 Axes 객체를, ax2가 두번째 Axes 객체를 가리킨다.
pyplot의 plot() 함수를 이용해 선 그래프 그리기
pyplot의 plot() 함수는 선 그래프를 그릴 때 활용되며, X 좌표 값, Y 좌표값으로 파이썬 리스트, 넘파이 ndarray, 판다스의 DataFrame/Series 모두 적용 가능하다. 다만, 입력되는 X 좌표 값과 Y 좌표 값의 개수는 모두 같은 크기를 가져야 한다.
import numpy as np
import pandas as pd
x_value = np.array([1, 2, 3, 4])
y_value = np.array([2, 4, 6, 8])
plt.plot(x_value, y_value)
plt.show()
또한, color 인자를 이용해 선의 색깔을 변경할 수 있다.
plt.plot(x_value, y_value, color = 'black')
선 그래프를 보다 다양하게 변화시키고 싶다면 더욱 다양한 인자값을 알고 있어야 한다.
- color: 색상
- marker: 마커의 모양
- linestype: 선의 형태
- linewidth: 선의 두께
- markersize: 마커의 크기
plt.plot(x_value, y_value, color = 'red', marker='^', linestyle='dashed', linewidth=2, markersize=12)
맷플롯립 같은 API 기반의 시각화는 필연적으로 코드를 이용해 해당 함수들에 대한 인자값이나 시각화를 위한 여러 가지 주변 값들을 설정해줘야 한다. 때문에 함수별로 인자값이 상이하거나 시각화를 위한 여러 가지 설정값이 복잡할 경우 시각화 구현에 많은 시간을 쏟기 쉽다.
다양한 색깔, 선 종류, 마커 종류는 아래 표에 정리되어 있다.
축 명칭 설정, 축의 눈금(틱)값 회전, 범례(legend) 설정하기
맷플롯립은 기본적으로 축의 명칭을 자동으로 설정하지 않기 때문에, 축의 명칭을 설정하기 원한다면 pyplot의 xlabel(), ylabel() 과 같은 함수를 이용해 축의 명칭을 설정해 줘야 한다.
[축 명칭 설정]
- xlabel - x축 라벨
- ylabel - y축 라벨
plt.plot(x_value, y_value, color = 'red', marker='s', linestyle='dashed', linewidth=2, markersize=12)
# 각 축 이름 할당
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.show()
[축의 눈금값(틱값) 회전]
- xticks(): X축의 눈금값 회전
- yticks(): Y축의 눈금값 회전
# x 좌표 값을 0~99까지 100개로 설정
x_value = np.arange(0, 100)
# y 좌표 값은 개별 x좌표값을 2배로 해서 100개로 설정
y_value = 2*x_value
plt.plot(x_value, y_value, color='green')
plt.xlabel('x axis')
plt.ylabel('y axis')
# x축 눈금값을 90도 회전
plt.xticks(rotation=90)
plt.show()
맷플롯립은 축 값이 문자열인 경우는 모든 값을 나타내 주지만, 축값이 숫자값이면 자동으로 최솟값과 최댓값에 기반해 춝의 크기에 따라 눈금 간격을 만들어준다.
X축의 눈금을 좀 더 세밀하게 나타내고 싶으면 xticks() 함수의 인자로 ticks 값을 나타내고 싶은 값을 설정하면 된다.
# x 좌표 값을 0~99까지 100개로 설정
x_value = np.arange(0, 100)
# y 좌표 값은 개별 x좌표값을 2배로 해서 100개로 설정
y_value = 2*x_value
plt.plot(x_value, y_value, color='green')
plt.xlabel('x axis')
plt.ylabel('y axis')
# x축의 눈금값을 np.arange(0, 100, 5)로 하여 0부터 99까지 5스텝으로 20개 표시
# x축 눈금값을 90도 회전
plt.xticks(ticks=np.arange(0, 100, 5), rotation=90)
plt.show()
[범례 표시]
범례는 여러 개의 그래프/차트를 한 Axes 내에서 표시할 때 이들을 구분할 때 편리하게 사용된다.
맷플롯립은 여러 개의 플롯을 하나의 Axes 내에서 그릴 수 있다.
범례를 표시하기 위해서는 plt.plot() 함수 내에 label 인자값을 설정해 해당 플롯에 명칭을 부여해 주고, plt.legend() 를 호출해 범례를 Axes 상에 나타낼 수 있다.
# X 좌표 값을 0~99까지 100개로 설정
# 첫번째 Y좌표 값은 X좌표값을 2배, 두번째 좌표값은 X좌표값의 4배
x_value_01 = np.arange(0, 100)
y_value_01 = 2*x_value_01
y_value_02 = 4*x_value_01
# X좌표값과 첫번째 Y좌표값으로 녹색의 선그래프. label을 green line으로 설정
plt.plot(x_value_01, y_value_01, color='green', label='green line')
# X좌표값과 두번째 Y좌표값으로 빨간색 선그래프. label을 red line으로 설정
plt.plot(x_value_01, y_value_02, color='red', label='red line')
plt.xlabel('x axis')
plt.ylabel('y axis')
# 개별 plot들의 label로 설정된 문자열을 범례로 표시
plt.legend()
plt.title("Lines Plot")
plt.show()
[선과 막대그래프 함께 그리기]
x_value_01 = np.arange(1, 10)
y_value_01 = 2*x_value_01
# 마커를 포함한 빨간색 대시 선 그래프 그리고, label은 'red line'
plt.plot(x_value_01, y_value_01, color='red', marker='o', linestyle='dashed', label='red line')
# X값에 따른 Y값을 나타내는 초록색 막대 그래프를 그리고 label은 'bar plot'
plt.bar(x_value_01, y_value_01, color='green', label='bar plot')
plt.xlabel('x axis')
plt.ylabel('y axis')
# 개별 plot들의 label로 설정된 문자열을 범례로 표시
plt.legend()
plt.title("Combo Plot")
plt.show()
위와 동일한 시각화를 Axes 객체 메서드를 사용해 수행 (결과물은 위와 동일하므로 생략)
x_value_01 = np.arange(1, 10)
y_value_01 = 2*x_value_01
figure = plt.figure()
# Axes 객체를 추출하여 ax 변수에 할당
ax = plt.axes()
# plt.plot()은 ax.plot() 으로, plt.bat()는 ax.bar()로 변경
ax.plot(x_value_01, y_value_01, color='red', marker='o', linestyle='dashed', label='red line')
ax.bar(x_value_01, y_value_01, color='green', label='bar plot')
# plt.0label()은 ax.set_0label()로
ax.set_xlabel('x axis')
ax.set_ylabel('y axis')
# ax.set_legend() 가 아니라 ax.legend()
ax.legend()
# plt.title()을 ax.set_title()로
ax.set_title("Combo Plot")
plt.show()
여러 개의 subplots 이용해 개별 그래프들을 subplot 별로 시각화하기
여러 개의 subplots들을 이용해서 시각화를 구현할 때는 개별 Axes 객체를 직접 이용해서 시각화를 구현해야 한다.
선 그래프나 막대 그래프를 그리는 것에 국한되지 않고, 타이틀, 축 명칭, 눈금값, 범례를 설정할 때도 개별 Axes에 직접 이들을 적용해야 한다.
import numpy as np
x_value_01 = np.arange(1, 10)
x_value_02 = np.arange(1, 20)
y_value_01 = 2*x_value_01
y_value_02 = 2*x_value_02
# figsize는 (6,3)인 Figure와 2개의 Axes를 가지는 subplots 반환
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(6,3))
# 개별 Axes 객체들을 각각 이용하여 선 그래프와 막대그래프 그림
ax[0].plot(x_value_01, y_value_01, color='red', marker='o', linestyle='dashed', label='red line')
ax[1].bar(x_value_02, y_value_02, color='green', label='bar plot')
# 개별 Axes 객체 각각에 X축명 설정
ax[0].set_title('ax[0] x axis')
ax[1].set_title('ax[1] x axis')
# 개별 Axes 객체 각각에 범례 설정
ax[0].legend()
ax[1].legend()
# 개별 Axes 객체 각각에 타이틀 설정
ax[0].set_title('Line plot')
ax[1].set_title('Bar plot')
plt.show()
[ncols, nrows가 2 이상일 경우]
plt.subplots()의 인자인 nrows가 1이거나 ncols가 1인 경우애는 1차원 배열 인덱싱 방식으로 Axes에 접근할 수 있다.
즉, nrows=1, ncols=3이라면 ax[0], ax[1], ax[2]와 같은 방식으로 3개의 Axes 객체를 접근할 수 있다.
그러나 nrows도 2 이상이고 ncols도 2 이상이 되면 1차원 배열 인덱싱 방식이 아니라 2차원 배열 인덱싱 방식으로 plot.subplots()로 반환된 Axes 객체를 접근해야 한다.
import numpy as np
x_value_01 = np.arange(1, 10)
x_value_02 = np.arange(1, 20)
y_value_01 = 2*x_value_01
y_value_02 = 2*x_value_02
# figsize는 (6,6)인 Figure와 2*2개의 Axes를 가지는 subplots 반환
fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(6,6))
# 개별 Axes 객체들을 각각 이용하여 선 그래프와 막대그래프 그림
ax[0][0].plot(x_value_01, y_value_01, color='red', marker='o', linestyle='dashed', label='red line')
ax[0][1].bar(x_value_02, y_value_02, color='green', label='green bar')
ax[1][0].plot(x_value_01, y_value_01, color='black', marker='D', linestyle='dotted', label='black line')
ax[1][1].bar(x_value_02, y_value_02, color='blue', label='blue bar')
# 개별 Axes 객체 각각에 X축명 설정
ax[0][0].set_title('ax[0][0] x axis')
ax[1][0].set_title('ax[1][0] x axis')
ax[0][1].set_title('ax[0][1] x axis')
ax[1][1].set_title('ax[1][1] x axis')
# 개별 Axes 객체 각각에 범례 설정
ax[0][0].legend()
ax[1][0].legend()
ax[0][1].legend()
ax[1][1].legend()
# 개별 Axes 객체 각각에 타이틀 설정
ax[0][0].set_title('red Line plot')
ax[1][0].set_title('green Bar plot')
ax[0][1].set_title('black Line plot')
ax[1][1].set_title('blue Bar plot')
plt.show()
그 외 - numpy를 이용해서 sin을 만들고 그려보기
import numpy as np
t = np.arange(0,12,0.01)
y = np.sin(t)
np.arrange 명령은 0부터 12까지 0.01 간격으로 데이터를 만들고 그 리스트를 np.sin에 입력하면 sin 값이 나타남
plt.figure(figsize=(10,6))
plt.plot(t, y)
plt.show()
grid() - 격자무늬
plt.figure(figsize=(10,6))
plt.plot(t, y)
plt.grid()
plt.xlabel('time')
plt.ylabel('Amplitude')
plt.title('Exmaple of sinwave')
plt.show()
◆ plot 명령을 두 개 넣어서 한 화면에 그래프를 두 개 만들기
plt.figure(figsize=(10,6))
plt.plot(t, np.sin(t))
plt.plot(t, np.cos(t))
plt.grid()
plt.xlabel('time')
plt.ylabel('Amplitude')
plt.title('Exmaple of sinwave')
plt.show()
범례(legend)를 추가하고 싶다면 plot을 그릴 때 label 옵션으로 텍스트를 잡아주고, plt.legend() 명령 부여
plt.figure(figsize=(10,6))
plt.plot(t, np.sin(t))
plt.plot(t, np.cos(t))
plt.grid()
plt.legend()
plt.xlabel('time')
plt.ylabel('Amplitude')
plt.title('Exmaple of sinwave')
plt.show()
lw 옵션으로 선의 굵기 지정. color 옵션으로 색상 지정
plt.figure(figsize=(10,6))
plt.plot(t, np.sin(t), lw=3, label='sin')
plt.plot(t, np.cos(t), 'r', label='cos')
plt.grid()
plt.legend()
plt.xlabel('time')
plt.ylabel('Amplitude')
plt.title('Exmaple of sinwave')
plt.show()
scatter (산점도 그리기)
t = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4])
plt.figure(figsize=(10,6))
plt.scatter(t, y)
plt.show()
역시 marker 지정 가능
plt.figure(figsize=(10,6))
plt.scatter(t, y, marker='>')
plt.show()
x축 값인 t에 따라 색상을 바꾸는 color map 지정. s옵션은 마커의 크기
colormap = t
plt.figure(figsize=(10,6))
plt.scatter(t, y, s, = 50, c = colormap, marker='>')
plt.colorbar()
plt.show()
랜덤변수 함수 이용하여 데이터 만들고 시각화 하기
loc 옵션 - 평균값
scale 옵션 - 표준편차
s1 = np.random.normal(loc=0, scale=1, size=1000)
s2 = np.random.normal(loc=5, scale=0.5, size=1000)
s3 = np.random.normal(loc=10, scale=2, size=1000)
이것을 그리면
plt.figure(figsize=(10,6))
plt.plot(s1, label='s1')
plt.plot(s2, label='s2')
plt.plot(s2, label='s3')
plt.legend()
plt.show()
Boxplot 으로 표현 하기
plt.figure(figsize=(10,6))
plt.boxplot((s1, s2, s3))
plt.grid()
plt.show()
[출처]
파이썬으로 데이터 주무르기
파이썬 머신러닝 완벽 가이드
Matplotlib Tutorial - 파이썬으로 데이터 시각화하기
'[파이썬 Projects] > <파이썬 기초>' 카테고리의 다른 글
[파이썬] 파이썬 시각화 도구 - Seaborn (0) | 2024.04.15 |
---|---|
[파이썬] pivot_table (1) | 2024.04.14 |
[파이썬] pandas 고급 기능 : DataFrame 병합하기 (0) | 2024.04.13 |
[파이썬] Pandas 기초 (0) | 2024.04.13 |
[파이썬 실행을 위한 Step] 아나콘다 + Jupyter note book 설치하기 (0) | 2024.04.12 |