Matplotlib.pyplot #2. Line plot

코딩/Backend|2022. 3. 10. 13:50

저번 글에서 알아봤듯 pyplot은

  • 라인 플롯(line plot)
  • 스캐터 플롯(scatter plot)
  • 컨투어 플롯(contour plot)
  • 서피스 플롯(surface plot)
  • 바 차트(bar chart)
  • 히스토그램(histogram)
  • 박스 플롯(box plot)
  • 파이 차트(pie chart)

와 같은 다양한 그래프를 그릴 수 있다. 

 

가장 기본이 되는 line plot을 바탕으로 plot의 구성이 어떻게 이뤄지는지 확인해보자.

 

Line plot

가장 기본이 되는 plot이며 2차원 평면에서 선을 이용한 그래프를 보여준다.

plt.plot(x, y, fmt, data)

 

x, y는 array 형태

fmt은 선의 형태

data는 optional인데 dictionary와 같은 indexable data를 받는다.

예를 들어 dict_1 = {'a':[1, 2, 3, 4], 'b':[2, 3, 4, 5]} 일 때

plt.plot('a', 'b', fmt, dict_1)과 같이 사용할 수 있다.

 

 

기본 사용법

x = [1, 2, 3]
y = [2, 4, 6]
plt.plot(x, y)

parameter로 

정수 3개로 이뤄진 2개의 1차원 데이터셋을 줬을 뿐인데,

 

x, y축의 범위

tick

tick label

직접 입력한 점 사이의 선

선의 유형 및 색깔

들이 자동으로 설정되었음을 알 수 있다.

 

다시 말해 이러한 것들을 직접 변경할 수 있다는 의미이며 그 방법은 다음과 같다.

import matplotlib.pyplot as plt

x = [1, 2, 3]
y1 = [2, 4, 6]
y2 = [1.5, 3, 4.5]

plt.plot(x, y1, 'go-', label='graph_1')
plt.plot(x, y2, 'r--', label='graph_2')

plt.xticks([-2, -1, 0, 1, 2], labels=['a', 'b', 'c', 'd', 'e'])
plt.yticks([0, 1, 2, 3, 4, 5, 6])
plt.xlabel('Axis_1')
plt.ylabel('Axis_2')
plt.legend(loc='best')

이때 fmt parameter는 다음과 같이 풀어쓸 수 있다.

plt.plot(x, y, color='green', marker='o', linestyle='solid')

결과는 다음과 같다.

 

그래프 설정 관련 Methods

축의 이름 설정

plt.xlabel('str',

             labelpad=20, 

             fontdict={'family': 'serif', 'color': 'b', 'weight': 'bold', 'size': 14})

             loc='right')

단, loc parameter의 경우 ylabel이면 당연히 'top, 'center', 'bottom'을 받는다.

 

축 범위 지정

xlim(xmin, xmax) : tuple이나 list로도 입력 가능

axis((xmin, xmax, ymin, ymax)) : 마찬가지로 list로도 입력 가능

 

이 외 여러 옵션들을 제공하는데

plt.axis('square') : x, y 축의 '길이'가 동일하게 표시

plt.axis('scaled') : x, y 축 scale이 동일하게 표시

plt.axis('image') : scaling을 하되 축 limit을 data limit과 동일하게 맞춤

plt.axis('on' / 'off') : 축 자체와 라벨을 표시/없앰

plt.axis('tight') : 데이터 범위와 딱 맞게 맞춤

plt.axis('auto') : 자동 축 범위

 

 

반대로 

plt.xlim(), plt.ylim()

plt.axis()

함수로 그래프의 축 영역을 return 받을 수도 있다.

 

축 스케일 지정

plt.xscale()을 이용하며

option으로는

'linear' : default

'log' : 로그 스케일

'symlog' : 양쪽 대칭 로그 스케일

 

 

축 눈금 지정

이 외에 

plt.tick_params 메서드로 눈금 스타일을 설정할 수 있다.

 

그리드 표시

plt.grid(True)

plt.grid(True, axis='x' / 'y' / 'both') : 그리드 방향 지정

plt.grid(which='major', 'minor', 'both') : 그리드를 어떤 tick에 맞출 것인지 지정
이외 옵션으로 linestyle, alpha 등을 변경할 수 있다.

 

수평/수직선 표시

  • axhline(): 축을 따라 수평선을 표시합니다.
  • axvline(): 축을 따라 수직선을 표시합니다.
  • hlines(): 지정한 점을 따라 수평선을 표시합니다.
  • vlines(): 지정한 점을 따라 수직선을 표시합니다.

 

범례 표시

plt.legend()

로 사용할 경우 범례 상자에 plot의 label과 함께 line style이 표시된다.

plt.legend(loc='best', ncol=2)

loc parameter는 (1, 1) 등의 tuple, 혹은 'lower right'등의 문자열을 받을 수 있고

best로 설정할 경우 알아서 여백에 표시해준다.

 

ncol은 범례 내부 표시 데이터의 열 개수를 설정

frameon 은 테두리 표시 여부를 설정

shadow는 텍스트 상자에 그림자 표시

이 외 facecolor, edgecolor, borderpad, labelspacing 등 다양한 parameter가 있다.

 

 

특정 영역 채우기

fill_between(x[1:3], y[1:3], alpha=0.5) : 네 점 사이의 수직 영역 채우기

fill_betweenx() : 수평 영역 채우기

 

위를 응용하면 

fill_between(x[1:3], y1[1:3], y2[1:3], alpha=0.5) 등으로

두 그래프 사이의 영역을 채울 수도 있다.

 

그래프 위치 외의 다른 영역을 채우고 싶으면

fill(x, y)을 사용한다.

ex) fill([1, 3, 5, 6], [2, 4, 5, 6])

 

 

 

 

여러 곡선 그리기

 

Discrete data로 부드러운 Curved line 그리기

기본적으로 위의 경우처럼 2개의 discrete data를 주면

해당 점들을 marker로 표시하고, 점과 점 사이를 직선으로 이어주는 것을 알 수 있다.

그렇다면 곡선을 표현하고 싶다면 어떻게 해야 할까?

 

가장 간단한 방법으로 데이터의 간격을 줄여서 곡선처럼 보이게 하는 방법이 있다.

x = np.arange(0, 5, 0.1)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y, 'ro--')

 

다른 방법으로는, scipy에서 제공하는

scipy.interpolate.make_interp_spline() method를 이용하는 방법과

Cubic Interpolation을 이용하는 방법이 있다.

 

1) scipy.interpolate.make_interp_spline()

import numpy as np
from scipy.interpolate import make_interp_spline
import matplotlib.pyplot as plt

# Dataset
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([20, 30, 5, 12, 39, 48, 50, 3])

X_Y_Spline = make_interp_spline(x, y)

# Returns evenly spaced numbers
# over a specified interval.
X_ = np.linspace(x.min(), x.max(), 500)
Y_ = X_Y_Spline(X_)

# Plotting the Graph
plt.plot(X_, Y_)
plt.title("Plot Smooth Curve Using the scipy.interpolate.make_interp_spline() Class")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

(8,  ) dataset인 x, y를 만들고

make_interp_spline method를 이용해서 X_Y_Spline 객체를 만들었다.  scipy.interpolate._bsplines.BSpline object

변수 X_에 linspace(start, stop, num) method를 이용하여 (Linearly Spaced) 1, 8까지의 간격을 500개의 수로 나누었다.(이때 endpoint=T/F parameter을 사용하여, stop 자체를 포함시킬지 여부를 설정할 수 있다.)

 

X_Y_Spline 객체에 X_를 넣어 Y_를 정의하였다.

 

2) Cubic interpolation을 이용하기

from scipy.interpolate import interp1d

cubic_interploation_model = interp1d(x, y, kind="cubic")
# Plotting the Graph
X_ = np.linspace(x.min(), x.max(), 500)
Y_ = cubic_interploation_model(X_)

x, y를 사용하여 cubic interpolation을 먼저 시행한 후이를 이용하여 Y_를 정의하였다.

 

 

Reference : 

scipy 및 matplotlib documentation

https://wikidocs.net/book/5011

'코딩 > Backend' 카테고리의 다른 글

PyQt5 #1. 기본 개념  (0) 2022.05.25
Matplotlib.pyplot #3. 기타 plot들  (0) 2022.03.10
Matplotlib.pyplot #1. 기본 사용법  (0) 2022.03.04
Pandas - Series, DataFrame  (0) 2022.03.04
Numpy - Array  (0) 2022.03.03

댓글()