plot() 함수
plt.plot(x, y)
함수에 x와 y 데이터를 입력하여 플롯을 작성합니다. 이 경우 y 값만을 제공하는 경우 y의 인덱스를 x값으로 인식합니다. 또한 함수에 의한 결과 역시 좌표의 값이 됩니다.
import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler import yfinance as yf import matplotlib as mpl import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False import seaborn as sns
matplotlib하에서 작성된 플롯이지만 seaborn에서 제공하는 플롯의 스타일을 사용할 수 있습니다. 위 코드 sns.set_style()
함수에 의해 이루어집니다.
np.random.RandomState(3) x=np.arange(20) y=np.random.standard_normal(20) plt.figure(figsize=(4,3)) plt.plot(x,y) plt.show()
다음 코드의 plt.subplots(rows, columns, figsize, gridspec_kw, …)
는 그림을 작성하는 프레임을 여러개의 하위그룹으로 구분하기 위한 함수입니다. 이 함수는 다양한 매개변수를 가질 수 있습니다.
- rows, columns는 전체 그림 프레임을 분리하기 위한 행과 열수를 지정, 다음 코드는 1행 2열로 2개의 하위 그림을 작성
- 전체 프레임의 이름 fig, 두 개의 하위 프레임은 각각 ax1, ax2로 지정
- 하위 그림 프레임은 인덱스를 사용하여 지정할 수도 있음
행 또는 열이 1개인 경우는 벡터로 고려되므로 인덱스는 [0], [1] 과 같이 1개로 표시
그러나 하위 프레임이 [2,2]와 같이 행렬이라면 인덱스[0,0]과 같이 행과 열 인덱스를 모두 지정해야함
- figsize=(너비, 높이): 전체 그림 프레임의 크기를 지정
- gridspec_kw:각 그림의 너비의 비율(width_ratios), 높이의 비율(height_ratios)를 지정
- 하위 프레임의 그래프를 꾸미기 위한 여러 함수는
set_함수()
와 같이 함수명이 수정됨
이 함수들을 생성된 하위 프레임(객체)에서 작동하는 메서드 입니다.
np.random.RandomState(2) y1=np.random.standard_normal(20) fig, (ax1, ax2)=plt.subplots(1, 2, figsize=(7,3), gridspec_kw=dict(width_ratios=[3,3])) #(1) ax1.plot(y1) ax2.plot(y1.cumsum()) plt.show()
x와 y축은 plt.axis()
함수로 조절할 수 있습니다. 다음의 plt.axis("equal")
은 두 축의 scale을 같게 하기 위한 것입니다.
plt.axis() 함수에 전달할 수 있는 인수들을 다음 표와 같습니다.
매개변수 | 설명 |
---|---|
- | 각 축은 데이터의 극값에 따라 자동으로 조정 |
off | 축제거 |
equal | x,y 축 스케일을 동일하게 작성 |
scaled | 두 축의 스케일을 동일한 상태 x, y 축을 각 값의 범위 내에서 작성(그림 상자의 크기를 조정) |
tight | 각 축의 최소, 최대를 한계값으로 축의 범위를 설정 |
image | 각 축의 최소, 최대를 한계값으로 축의 범위를 설정하고 두 축의 스케일을 동일하게 작성 |
[xmin, xmax, ymin, ymax] | 각 축의 최소, 최대를 한계값으로 축의 범위를 설정하고 두 축의 스케일을 동일하게 작성 |
plt.xlim(xmin, xmax), plt.ylim(ymin,ymax)와 같음, 이 함수는 각 축의 범위를 인위적으로 지정 |
csum=np.cumsum(y1) arg=["off","equal", "scaled","tight", "image", [0, len(csum), csum.min(), csum.max()]] plt.subplots_adjust(wspace=0.2, hspace=0.5) for i in range(len(arg)): plt.subplot(3,2,i+1) plt.plot(csum) plt.axis(arg[i]) if i != 5: plt.title(f"axis:{arg[i]}") else: plt.title("min & max") plt.show()
plt.figure(figsize=(4,3)) plt.plot(csum) plt.axis([0, 15, csum.min(), csum.max()]) plt.show()
다음 함수들로 플롯의 정보를 전달할 수 있습니다.
- xlabel(), ylabel() 함수를 사용하여 x, y 축이름을 지정할 수 있습니다.
- plt.xlabel(이름, loc="left/center/right", color)
- plt.ylabel(이름, loc="bottom/center/upper", rotation, color): 이름은 축과 평행하게 표시가 기본 즉, y축 이름을 수직으로 표시 되므로 수평으로 전환을 위한 회전은 인수 rotation=horizontal 적용
- title() 함수로 그림의 제목을 지정할 수 있습니다.
위 그림들과 같이 plot() 함수는 연속적인 선을 작성합니다. 이산 데이터가 입력되는 경우도 이러한 결과는 마찬가지 입니다. 그러나 함수의 스타일 옵션(인수)의 선택에 따라 산점도를 동시에 나타낼 수 있습니다. 또한 인수 color를 사용하여 선이나 점의 색을 지정할 수 있습니다.
character | Color |
---|---|
b | Blue |
g | Green |
r | Red |
c | Cyan |
m | Magenta |
y | Yellow |
k | Black |
w | White |
character | symbol |
---|---|
- | Solid line style |
-- | Dashed line style |
-. | Dash-dot line style |
: | Dotted line style |
. | Point marker |
, | Pixel marker |
o | Circle marker |
v | Triangle_down marker |
^ | Triangle_up marker |
< | Triangle_left marker |
> | Triangle_right marker |
1 | Tri_down marker |
2 | Tri_up marker |
3 | Tri_left marker |
4 | Tri_right marker |
s | Square marker |
p | Pentagon marker |
* | Star marker |
h | Hexagon1 marker |
H | Hexagon2 marker |
+ | Plus marker |
x | X marker |
D | Diamond marker |
d | Thin diamond marker |
| | Vline marker |
_ | Hline marker |
다음은 코스피 주가의 일일 자료에 대해 플롯을 작성한 것입니다.
st=pd.Timestamp(2024, 8, 17) et=pd.Timestamp(2024, 10, 17) kos=yf.download("^KS11",st, et) kos=kos.drop('Adj Close', axis=1) kos.head(3)
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2024-08-19 | 2697.969971 | 2699.840088 | 2664.280029 | 2674.360107 | 395600 |
2024-08-20 | 2699.739990 | 2706.050049 | 2686.060059 | 2696.629883 | 484200 |
2024-08-21 | 2687.199951 | 2704.979980 | 2684.610107 | 2701.129883 | 417300 |
scaler=StandardScaler().fit(kos) kos1=scaler.transform(kos) kos1df=pd.DataFrame(kos1) kos1df.columns=kos.columns kos1df.index=kos.index kos1df.head(3)
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2024-08-19 | 1.276833 | 1.155869 | 1.010041 | 0.965561 | 0.275897 |
2024-08-20 | 1.307979 | 1.272339 | 1.390104 | 1.369090 | 1.433808 |
2024-08-21 | 1.087325 | 1.252269 | 1.364803 | 1.450630 | 0.559494 |
plt.figure(figsize=(4,3)) plt.plot(kos1df.Close, "b", lw=1.5, ls="dashed", label="Close") plt.plot(kos1df.Close, 'ro') plt.xticks(rotation=45) plt.xlabel("Time(2014년)") plt.ylabel("Price") plt.legend(loc="best") plt.axis("tight") plt.title("kospi 종가") plt.show()
위 그래프는 각 축의 x 축의 각 틱은 데이터 kos1df의 인덱스 일부를 분취하여 나타낸 것입니다. 이것은 모든 인덱스를 표시하기 어려운 경우 자동적으로 이루어집니다. 이 인덱스의 표시 방향을 변경하기 위해 xticks()
의 인수인 rotation을 조정한 것입니다.
- plt.xticks(target, label, rotation, …) 또는 plt.yticks()
- target(원래의 ticks의 표현)을 label(지정한 tick의 표현)으로 교체할 수 있음
- rotation=int: 지정한 각도
- 이 함수의 인수들은 모두 선택사항입니다.
다음 코드는 xticks()의 인수 target으로 데이터의 인덱스에서 7개를 선택하여 특정한 형식으로 변경한 label을 생성한 것입니다.
date=pd.date_range(start=kos1df.index[0], end=kos1df.index[-1], inclusive='both', periods=7) date1=date.strftime("%m/%d") date[-1], date1[-1]
(Timestamp('2024-10-16 00:00:00'), '10/16')
범례(legend)를 나타내기 위해 함수 legend()
를 적용하였으며 이 함수는 범례의 위치를 지정하기 위한 인수 loc를 가집니다. 범례에 입력될 내용은 각 선이나 점등을 작성하기 위한 함수내에 label이란 인수로 지정합니다.
loc의 인수 | 설명 |
---|---|
Default | Upper right |
0 | Best possible |
1 | Upper right |
2 | Upper left |
3 | Lower left |
4 | Lower right |
5 | Right |
6 | Center left |
7 | Center right |
8 | Lower center |
9 | Upper center |
10 | Center |
loc=(x, y): x,y 축의 크기를 각각 1로 설정하고 각 위치를 입력 |
또한 이 함수의 인수인 frameon은 범례의 외부선의 유무에 관계된 것은 기본값은 frameon=True입니다.
plt.figure(figsize=(4,3)) plt.plot(kos1df.Close, "b", lw=1.5, ls="dashed", label="Close") plt.plot(kos1df.Close, 'ro') plt.xticks(date, date1) plt.xlabel("Time( 2024년)") plt.ylabel("Price") plt.legend(loc="best", frameon=False) plt.axis("tight") plt.title("kospi 종가") plt.show()
한 플롯에 그려진 선의 수는 관계된 함수들의 수와 같습니다.
plt.figure(figsize=(7,3)) plt.plot(kos1df.Close, 'b', lw=1.5, label="종가") plt.plot(kos1df.Volume,'r', ls="dashed", label="거래량") plt.xticks(date, date1) plt.xlabel("Time( 2024년)") plt.ylabel("Price, Volume") plt.legend(loc="best", frameon=False) plt.axis("tight") plt.title("kospi 종가와 거래량") plt.show()
여러개의 그래프를 작성할 경우 각각의 scale 차이로 축을 별도로 작성해야 되는 경우 또는 여러개의 플롯을 작성할 경우 plt.subplots(행의 갯수, 열의 갯수) 함수를 사용합니다.
다음은 위 데이터 중 kos의 Close와 Volume을 작성합니다. 표준화 전의 이 두 변수의 scale에 차이를 보이므로 왼쪽 y축은 Close, 오른쪽은 Volume을 지시하도록 생성합니다.
%matplotlib inline fig, ax1=plt.subplots(1,1, figsize=(6,3)) plt.plot(kos.index, kos.Close, "b", label="Close") plt.xticks(date, date1) plt.xlabel("Time(2024 년)") plt.ylabel("종가") plt.legend(loc=(0.5, 0.9), frameon=False) ax2=ax1.twinx() plt.plot(kos.Volume, "r", ls="dashed", label="Volume") plt.legend(loc=(0.5, 0.8), frameon=False) plt.show()
위 그림의 두 y 축은 x 축을 공유합니다. 이 경우 .twinx()
메서드를 사용합니다. 위 코드에 대한 설명은 다음과 같습니다.
- fig, ax1=plt.subplots(1,1): fig라는 프레임에 1행 1열에 위치하는 1개의 그래프 ax를 위한 프레임을 생성
- kos.Close에 대한 선그래프를 작성=ax
- ax2=ax1.twinx(): 두번째 그래프 ax2는 ax1의 x축을 공유
- kos.Volume에 대한 선그래프 작성
- ax1, ax2는 하나의 플롯으로 작성되지만 파이썬은 별도의 두 개의 그래프로 인식하므로 legend()는 별도로 지정해야 됨
위 그림을 두개의 별도의 플롯으로 작성해봅니다.
%matplotlib inline fig, ax=plt.subplots(2,1, figsize=(6,4), gridspec_kw=dict(height_ratios=[2,2]), sharex=True) #(1) ax[0].plot(kos.index, kos.Close, "b", label="Close") ax[0].set_ylabel("종가") ax[1].plot(kos.Volume, "r", ls="dashed", label="Volume") ax[1].set_xticks(date, date1) ax[1].set_xlabel("Time(2024 년)") ax[1].set_ylabel("거래량") plt.show()
댓글
댓글 쓰기