Python matplotlib : spy (sparsity pattern, 희소성 패턴 그래프)
데이터를 보다 보면 Sparcity pattern이라는 개념을 접하게 됩니다.
한글로 번역을 해보면 희소성 패턴이라고 하죠.
sparce -> 부족한, 희박한
sparcity -> 부족, 희박함
단어의 뜻을 보자면 위와 같습니다.
이러한 sparcity pattern을 그래프로 나타내주는 것이 matplotlib의 spy라는 method라고 합니다.
Syntax
spy(
Z=2D-array,
precision=value
)
spy method에서 주로 사용하는 parameter는 위와 같습니다.
- Z
2차원 array를 받습니다.
Sparcity pattern 그래프를 그릴 때 사용되는 데이터입니다.
- precision
precision = 0이라면 Z에서 0이 아닌 모든 값에 대해 graph가 plot됩니다.
precision = x라면 |Z| > precision인 값에 대해서만 graph가 plot됩니다.
직접 예시를 보죠.
import matplotlib.pyplot as plt
list_test = [
[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7]
]
plt.spy(Z=list_test, # 2차원 list or 2차원 array
precision=0 # plot 숫자 기준
)
plt.show()
위 코드를 실행시킨 결과입니다.
2차원 list를 전달했고 이 list에는 여러 값이 있습니다.
보면 (0, 0)만 흰색이고 나머지는 다 검은색입니다.
왜냐면 2차원 list에서 왼쪽 가장 위에 있는 값만 0이기 때문입니다. 또한 precision=0으로 설정되었기 때문에 0이 아닌 값들에 대해 검정색으로 칠해진 sparcity pattern graph가 그려집니다.
import matplotlib.pyplot as plt
list_test = [
[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7]
]
plt.spy(Z=list_test, precision=2)
plt.show()
precision=2로 설정했습니다.
precision=2로 설정되었기 때문에
|Z| > 2인 값에 대해서만 검은색으로 칠해지며 sparcity pattern graph가 그려집니다.
그래서 절대값이 2 이하인 값의 위치는 검은색이 되지 않습니다.
import matplotlib.pyplot as plt
list_test = [
[-2, -1, -10, 2, 4],
[1, 2, 0, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7]
]
plt.spy(Z=list_test, precision=0)
plt.show()
이번엔 2차원 array에 음수를 넣어보았습니다.
spy에서 plot을 하는 기준을 |Z| > precision 으로 Z의 절대값을 보기 때문에
음수값들도 검은색으로 칠해지며 plot이 됩니다.
import matplotlib.pyplot as plt
list_test = [
[-2, -1, -10, 2, 4],
[1, 2, 0, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7]
]
plt.spy(Z=list_test, precision=2)
plt.show()
이번에는 precision=2로 설정해 보았습니다.
|Z| > 2인 값만 plot되므로
따라서 음수건 양수건 절대값이 2를 초과하는 값의 위치만 검은색으로 칠해지며 나타내어집니다.
import matplotlib.pyplot as plt
list_test = [
[-2, -1, -10, 2, 4],
[1, 2, 0, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7]
]
plt.spy(Z=list_test, precision=-1)
plt.show()
precision=-1로 설정한 예시입니다.
|Z| > -1인 값만 plot되기 때문에 이런 경우 모든 값이 조건을 만족하므로 그래프 상의 모든 값이 검은색으로 칠해집니다.
아래는 spy method의 기타 parameter들입니다.
import matplotlib.pyplot as plt
list_test = [
[-2, -1, -10, 2, 4],
[1, 2, 0, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7]
]
plt.spy(Z=list_test, precision=0,
markersize=10)
plt.show()
markersize=10으로 설정한 예시입니다.
marker의 크기가 10으로 설정됩니다.
import matplotlib.pyplot as plt
list_test = [
[-2, -1, -10, 2, 4],
[1, 2, 0, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7]
]
plt.spy(Z=list_test, precision=0,
markersize=10,
markeredgecolor='red', # marker 테두리 색상
markeredgewidth=2, # marker 테두리 두께
markerfacecolor='green' # marker 색상
)
plt.show()
markeredgecolor -> marker 테두리 색상을 결정합니다.
markeredgewidth -> marker 테두리 두께를 결정합니다.
markerfacecolor -> marker의 색상을 결정합니다.
import matplotlib.pyplot as plt
list_test = [
[-2, -1, -10, 2, 4],
[1, 2, 0, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7]
]
plt.spy(Z=list_test, precision=0,
markersize=10,
markeredgecolor='red', # marker 테두리 색상
markeredgewidth=2, # marker 테두리 두께
markerfacecolor='green', # marker 색상
alpha=0.3 # marker 투명도
)
plt.show()
alpha -> 투명도를 의미합니다. 0 이상 1 이하의 실수를 값으로 받으며 0은 완전한 투명, 1은 완전한 불투명을 의미합니다.
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
arr_test = np.random.randn(20, 30)
arr_test[10, :] = 0
arr_test[:, 20] = 0
row_cnt = 2
col_cnt = 2
fig, graph = plt.subplots(nrows=row_cnt, ncols=col_cnt)
for r in range(row_cnt):
for c in range(col_cnt):
graph[r][c].spy(Z=arr_test, precision=0.3)
plt.show()
numpy와 함께 위같은 코드도 작성할 수 있습니다.
- 참고
아래 링크는 spy method 관련 참고할만한 문서입니다.
https://www.geeksforgeeks.org/how-to-visualize-sparse-matrix-in-python-using-matplotlib/