기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

[matplotlib] plot()

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() 함수에 전달할 수 있는 인수들을 다음 표와 같습니다.

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를 사용하여 선이나 점의 색을 지정할 수 있습니다.

매개변수 color
character Color
b Blue
g Green
r Red
c Cyan
m Magenta
y Yellow
k Black
w White
매개변수 style
charactersymbol
- Solid line style
-- Dashed line style
-. Dash-dot line style
:Dotted line style
. Point marker
, Pixel marker
oCircle 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의 속성값 loc의 인수로 정수값 대신 설명을 입력해도 됨
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()

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...