[TS] μκ³μ΄ μ΄μνμ§ μκ°ν
μλ³Έ κ²μκΈ: https://velog.io/@euisuk-chung/TS-μκ³μ΄-μ΄μνμ§-μκ°ν
μ€λμ μ½λ
μκ³μ΄ μ λ¬Έκ°λ‘μ, μκ³μ΄ λ°μ΄ν°λΆμκ°λ‘μ λ€λ³λ μκ³μ΄ λ°μ΄ν°λ₯Ό μκ°ννκ³ μ΄λ₯Ό μ΄ν΄λ³΄λ μμ
μ λ§€μ° μ€μν©λλ€. μ΄μ μ€λμ μ κ° μ£Όλ‘ μ°κ΅¬/μ
무μ μ¬μ©νλ μ΄μνμ§ μκ°ν μ½λ
λ₯Ό μ 리νκ³ μ ν©λλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
def plot_mul_ad(df, df_w_result, model_name='IForest'):
# Define a color palette with enough colors
colors = plt.cm.viridis(np.linspace(0, 1, df.shape[1]))
# Create a figure with GridSpec
fig = plt.figure(figsize=(12, 2 * df.shape[1])) # Adjust the figure size
gs = gridspec.GridSpec(df.shape[1], 1, fig, 0, 0, 1, 1, hspace=0.5)
for i, (col, color) in enumerate(zip(df.columns, colors)):
ax = fig.add_subplot(gs[i, 0])
ax.plot(df.index.values, df[col].values, label=col, color=color)
# Mark anomalies with red dots
anomalies = df[df_w_result[f'{model_name}'] == -1]
ax.scatter(anomalies.index, anomalies[col], color='red', label='Anomaly', zorder=5)
ax.set_ylabel(col)
ax.legend()
# Set common labels
plt.xlabel('Time (Index)')
plt.xticks(rotation=45)
fig.suptitle('Feature Values Over Time With Anomalies (Unique Colors)', fontsize=16, y=1.05)
plt.show()
μ£ΌμκΈ°λ₯1. cm.viridis
matplotlib
μμ plt.cm.viridis(np.linspace(0, 1, df.shape[1]))
μ½λλ viridis
컬λ¬λ§΅μ μ¬μ©νμ¬ λ°μ΄ν° νλ μ(df)μ μ΄ μμ λ°λΌ μμ λ°°μ΄μ μμ±νλ λ°©λ²μ
λλ€. μ΄ μ½λλ₯Ό λΆν΄νμ¬ κ° λΆλΆμ μλ―Έλ₯Ό μ΄ν΄ν΄ λ³΄κ² μ΅λλ€.
1. plt.cm.viridis
plt.cm
μmatplotlib.pyplot
μ 컬λ¬λ§΅ λͺ¨λμ μλ―Έν©λλ€. 컬λ¬λ§΅μ μ°μμ μΈ μμμ λ²μλ₯Ό μ 곡νλ©°, λ€μν λ°μ΄ν°λ₯Ό μκ°νν λ μ μ©νκ² μ¬μ©λ©λλ€.viridis
λmatplotlib
μμ μ 곡νλ κΈ°λ³Έ 컬λ¬λ§΅ μ€ νλμ λλ€. μ΄ μ»¬λ¬λ§΅μ λ°μ λ Έλμμμ μμνμ¬, λ°μ λ Ήμμ κ±°μ³ μ΄λμ΄ νλμμΌλ‘ λλλ μμ λ²μλ₯Ό κ°μ§λλ€.viridis
컬λ¬λ§΅μ λμ κ°λ μ±κ³Ό μλ§Ή μ κ·Όμ±μ μν΄ μ€κ³λμμΌλ©°, λ°μ΄ν°μ μΈλ°ν λΆλΆκΉμ§ ꡬλ³νκΈ° μ½κ² λ§λ€μ΄μ Έ μμ΅λλ€.
2. np.linspace(0, 1, df.shape[1])
np.linspace
λ NumPy λΌμ΄λΈλ¬λ¦¬μ ν¨μλ‘, μ§μ λ λ²μ λ΄μμ κ· λ±ν κ°κ²©μ μ«μλ€μ μμ±ν©λλ€.- μ΄ κ²½μ°
np.linspace(0, 1, df.shape[1])
λ 0κ³Ό 1 μ¬μ΄μ κ°μdf.shape[1]
(λ°μ΄ν° νλ μμ μ΄ μ)λ§νΌ κ· λ±νκ² λΆν ν©λλ€. μ΄λ κ² νλ©΄ κ° μ΄μ λν΄ κ³ μ ν μμμ ν λΉν μ μλ κ°μ λ°°μ΄μ΄ μμ±λ©λλ€.
κ²°ν©λ μ¬μ©
μ΄ μ½λμ κ²°ν©λ μ¬μ©μ λ°μ΄ν° νλ μμ κ° μ΄μ λν΄ κ³ μ νκ³ κ΅¬λ³ κ°λ₯ν μμμ ν λΉνλ λ° μ¬μ©λ©λλ€. viridis
컬λ¬λ§΅μ np.linspace
λ₯Ό μ μ©ν¨μΌλ‘μ¨, λ°μ΄ν° νλ μμ κ° μ΄μ ν΄λΉνλ κ³ μ ν μμμ μ»μ μ μμ΅λλ€. μ΄λ 볡μ‘ν λ°μ΄ν° μΈνΈλ₯Ό μκ°νν λ μ μ©νλ©°, κ° μ΄μ΄λ λ°μ΄ν° μ리μ¦λ₯Ό μ½κ² ꡬλ³ν μ μλλ‘ λμμ€λλ€.
μ£ΌμκΈ°λ₯2. GridSpec
GridSpec
μ matplotlib
μμ κ³ κΈ κ·Έλ¦¬λ λ μ΄μμμ λ§λλ λ° μ¬μ©λλ ν΄λμ€μ
λλ€. μ΄ ν΄λμ€λ 볡μ‘ν μ°¨νΈ λ μ΄μμμ μμ±νκ³ κ΄λ¦¬νλ λ° μ μ©νλ©°, μΌλ°μ μΈ μλΈνλ‘― λ μ΄μμλ³΄λ€ λ λ§μ μ μ°μ±κ³Ό μΈλ°ν μ μ΄λ₯Ό μ 곡ν©λλ€.
GridSpecμ μ£Όμ κΈ°λ₯κ³Ό νΉμ§
- μΈλ°ν λ μ΄μμ μ μ΄:
GridSpec
μ μ¬μ©νλ©΄, κ° μλΈνλ‘―μ ν¬κΈ°μ μμΉλ₯Ό νκ³Ό μ΄ λ¨μλ‘ μ ννκ² μ§μ ν μ μμ΅λλ€. μ΄λ νμ€subplots
ν¨μλ₯Ό μ¬μ©νλ κ²λ³΄λ€ λ μΈλ°ν μ μ΄λ₯Ό κ°λ₯νκ² ν©λλ€. - λΉκ· μΌ μλΈνλ‘― ν¬κΈ°: μλΈνλ‘―λ€μ΄ λͺ¨λ λμΌν ν¬κΈ°λ₯Ό κ°μ§ νμκ° μμ΅λλ€. μλ₯Ό λ€μ΄, ν νμ ν° μλΈνλ‘― νλμ μμ μλΈνλ‘― λ κ°λ₯Ό λ°°μΉνλ κ²κ³Ό κ°μ΄, λ€μν ν¬κΈ°μ λΉμ¨μ μλΈνλ‘―μ μμ±ν μ μμ΅λλ€.
- νκ³Ό μ΄μ μ‘°μ :
GridSpec
μ μ¬μ©νλ©΄, νκ³Ό μ΄μ μ, μλΈνλ‘― κ°μ κ°κ²©(hspace, wspace), κ·Έλ¦¬κ³ νλ‘―μ μλμ μΈ λλΉμ λμ΄λ₯Ό μ‘°μ ν μ μμ΅λλ€.
GridSpec μ¬μ© λ°©λ²
GridSpec
μ μΌλ°μ μΌλ‘ λ€μκ³Ό κ°μ λ¨κ³λ‘ μ¬μ©λ©λλ€:
-
GridSpec κ°μ²΄ μμ±: λ¨Όμ
matplotlib.gridspec.GridSpec
ν΄λμ€λ‘λΆν° κ°μ²΄λ₯Ό μμ±ν©λλ€. μ΄ λ νκ³Ό μ΄μ μλ₯Ό μ§μ ν©λλ€.1 2
import matplotlib.gridspec as gridspec gs = gridspec.GridSpec(nrows, ncols)
-
Figure κ°μ²΄ μμ±:
matplotlib
μfigure
κ°μ²΄λ₯Ό μμ±ν©λλ€. μ΄ κ°μ²΄λ λͺ¨λ μλΈνλ‘―μ ν¬ν¨ν©λλ€.1
fig = plt.figure()
-
μλΈνλ‘― μΆκ°:
fig.add_subplot
μ μ¬μ©νμ¬ κ° μλΈνλ‘―μGridSpec
μ λ°λΌ μΆκ°ν©λλ€. μ¬κΈ°μ μλΈνλ‘―μ μμΉλGridSpec
κ°μ²΄μ μ¬λΌμ΄μ±μ μ¬μ©νμ¬ μ§μ ν©λλ€.1 2
ax1 = fig.add_subplot(gs[0, 0]) # 첫 λ²μ§Έ ν, 첫 λ²μ§Έ μ΄ ax2 = fig.add_subplot(gs[1, :]) # λ λ²μ§Έ ν, λͺ¨λ μ΄
- μλΈνλ‘― 컀μ€ν°λ§μ΄μ§: μ΄μ κ° μλΈνλ‘―(
ax1
,ax2
, β¦)μ λν΄ νμν κ·Έλν½ μμ (νλ‘―, λ μ΄λΈ μΆκ° λ±)μ μ§νν©λλ€. - λ λλ§ λ° νμ: λ§μ§λ§μΌλ‘
plt.show()
λ₯Ό νΈμΆνμ¬ μμ±λ κ·Έλ¦Όμ νμν©λλ€.
GridSpec
μ 볡μ‘ν λ μ΄μμμ νμλ‘ νλ κ³ κΈ κ·Έλν½ μμ
μ λ§€μ° μ μ©νλ©°, matplotlib
μ κ°λ ₯ν μκ°ν κΈ°λ₯ μ€ νλμ
λλ€.
μ°Έκ³
π₯ μ λͺ©μ΄ κ·Έλνλ₯Ό μΉ¨λ²νλ€κ³ μ? λ€μκ³Ό κ°μ΄ ν΄λ³΄μΈμ.
μ λͺ©μ΄ κ·Έλνμ μΉ¨λ²νλ λ¬Έμ λ matplotlib
μμ μ’
μ’
λ°μνλ λ¬Έμ μ
λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λͺ κ°μ§ μ κ·Ό λ°©λ²μ μ¬μ©ν μ μμ΅λλ€:
-
suptitle
μy
λ§€κ°λ³μ μ‘°μ :fig.suptitle
λ©μλμλ μ 체 κ·Έλ¦Ό μ λͺ©μ μμΉλ₯Ό μ‘°μ νλy
λ§€κ°λ³μκ° μμ΅λλ€. μ΄ λ§€κ°λ³μμ κ°μ μ¦κ°μμΌ μ λͺ©μ λμ΄ λ°°μΉν μ μμ΅λλ€.1
fig.suptitle('Feature Values Over Time With Anomalies (Unique Colors)', fontsize=16, y=1.05)
-
μλΈνλ‘―κ³Όμ μ¬λ°± μ‘°μ :
subplots_adjust
λ©μλλ₯Ό μ¬μ©νμ¬ μλΈνλ‘―κ³Όμ μλ¨ μ¬λ°±μ μ‘°μ ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ λͺ©κ³Ό μλΈνλ‘― μ¬μ΄μ 곡κ°μ ν보ν μ μμ΅λλ€.1
plt.subplots_adjust(top=0.85)
-
tight_layout
μ λ§€κ°λ³μ μ‘°μ :tight_layout
λ©μλλ μλΈνλ‘―μ λ μ΄μμμ μλμΌλ‘ μ‘°μ νμ§λ§, λλλ‘ μ΄λ‘ μΈν΄ μ λͺ©μ΄ μλΈνλ‘―κ³Ό κ²ΉμΉ μ μμ΅λλ€.pad
λ§€κ°λ³μλ₯Ό μ‘°μ νμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.1
plt.tight_layout(pad=3)
-
Figure ν¬κΈ° μ‘°μ : Figureμ ν¬κΈ°λ₯Ό λλ €μ μλΈνλ‘―κ³Ό μ λͺ© κ°μ 곡κ°μ ν보ν μλ μμ΅λλ€. μ΄λ
figure
ν¨μμμfigsize
λ§€κ°λ³μλ₯Ό μ‘°μ ν¨μΌλ‘μ¨ κ°λ₯ν©λλ€.1
fig = plt.figure(figsize=(12, 24)) # λλΉμ λμ΄λ₯Ό μ μ ν μ‘°μ
μ΄λ¬ν λ°©λ²λ€μ μ‘°ν©νμ¬ μ¬μ©νλ©΄, μ λͺ©μ΄ κ·Έλνμ μΉ¨λ²νλ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€. κ·Έλνμ λ μ΄μμκ³Ό μλΈνλ‘―μ μμ λ°λΌ μ μ ν λ°©λ²μ μ ννκ³ μ‘°μ ν΄μΌ ν©λλ€.