일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 글또
- dfs
- 최단경로
- 부스트캠프_AITech3기
- 부스트캠프_AITech_3기
- 정렬
- ODQA
- python3
- 단계별문제풀이
- 알고리즘스터디
- 이코테
- 이진탐색
- dp
- Level1
- 백준
- mrc
- U_stage
- 알고리즘_스터디
- 주간회고
- 프로그래머스
- 개인회고
- 기술면접
- 그래프이론
- 다시보기
- 파이썬 3
- 백트랙킹
- Level2_PStage
- 구현
- Level2
- 그리디
- Today
- Total
국문과 유목민
[일일리포트] Day 12 (Matplotlib2) 본문
해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.
▶ Today I Learned (핵심 요약 정리)
MatplotLib Factors
Text
Visual Representation들이 줄 수 없는 많은 설명을 추가해줄 수 있으며, 전달에서 생기는 오해를 방지할 수 있다. 하지만 Text를 과하게 사용할 경우 오히려 이해를 방해할 수 있다.
- 텍스트의 구성요소
- Title: 가장 큰 주제
- Label: 축에 해당하는 데이터 정보 제공
- Tick Label: 축에 눈금을 사용해 스케일 정보 추가(Master, Minor)
- Legend: 한 그래프에서 2개 이상의 서로 다른 데이터를 분류하기 위해서 사용하는 보조 정보
- Annotation: 그 외의 시각화에 대한 설명을 추가
- Text API in Matplotlib
pyplot API | Objecte-oriented API | description |
---|---|---|
sup title |
suptitle |
title of figure |
title |
set_title |
title of subplot ax |
xlabel |
set_xlabel |
x-axis label |
ylabel |
set_ylabel |
y-axis label |
figtext |
text |
figure text |
text |
text |
Axes taext |
annoatate |
annotate |
Axes annotation with arrow |
- Fonts Demo
- Details: 폰트 자체와는 조금 다르지만, 커스텀할 수 있는 요소들
- color
- linespacing: 줄 간격
- backgroundcolor
- alpha: 투명도
- zorder: z축(앞으로 가져오기 개념)
- visible
- Alignments: 정렬과 관련해서 조정할 수 있는 요소들
- ha : horizontal alignment
- va : vertical alignment
- rotation
- multialignment
fig, ax = plt.subplots()
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.text(x=0.5, y=0.5, s='Text\nis Important',
fontsize=20,
fontweight='bold',
fontfamily='serif',
color='royalblue',
linespacing=2,
va='center', # top, bottom, center
ha='center', # left, right, center
rotation='horizontal' # vertical?
)
plt.show()
Text API별 추가 사용법의 경우 코드의 길이도 길고, 실제 사용례를 다루고 있기 때문에 추후 다른 포스팅을 통해 따로 정리할 예정 (그래프 시각화 방법 및 Annotation 설정 등)
## Color
위치와 색은 채널구분에 효과적인 방법이다. 위치는 시각화 방법에 따라 결정되지만 색은 우리가 직접 골라야 한다. 그리고 시각화를 할 때에는 화려함이 시각화의 전부가 아니라는 점을 기억해야 한다. 오히려 가장 중요한 것은 인사이트를 독자에게 전달하는 것이다. 색은 기존의 정보와 느낌을 잘 활용하는 것이 중요하다. 만약 감이 부족하다면 이미 사용되고 있는 색을 사용하는 것도 하나의 방법이 될 수 있다.
- 범주형(Categorical): 독립된 색상으로 구성되어 범주형 변수에 사용한다. 최대 10개의색상까지 사용한다. 그 외에는 '기타'로 묶는다. 색의 차이로 구분하기때문에 채도, 명도를 개별적으로 조정하는 것은 지양해야 한다.
- 연속형(Sequential): 정렬된 값을 가지는 순서형, 연속형 변수에 적합하다. 연속적인 색상을 사용해서 값을 표현하기 때문에 균일한 색상 변화가 중요하며, 보통 단일 색상으로 표기한다.
- 발산형 (diverge): 연속형과 유사하지만 중앙을 기준으로 발산 (ex. 기온이나 지지율) 양끝으로 갈 수록 색이 진해지며 중앙의 색은 양쪽 점에 편향되지 않아야 한다.
- One Color: 전체적인 분포를 보기에 유용
- Categorical:이산적인 개별 값에 적합
- Diverge, Sequential: 같은 값에 대해서도 다른 가중치처럼 보이는 경우 (잉크 양 비례 원칙에 위배 될 수 있다)
범주형 | 연속형 | 발산형 |
- 그 외의 팁
- 데이터에서 다름을 보이기 위해 Highlighting기능 사용
- 강조를 위한 방법 중 하나로 색상대비를 사용한다.
- 명도 대비: 밝은 색과 어두운색을 배치
- 색상 대비: 가까운 색은 차이가 더 크게 보임
- 채도 대비: 채도의 차이가 나면, 더 잘 보이게된다.
- 보색 대비: 정반대 색상을 사용하면 더 선명해보인다. (ex.빨강&초록)
- 대비별 예시
명도대비 채도대비 보색대비 - 색각이상 고려: 삼원색 중 특정 색을 감지 못함(색맹), 부분적인지 이상이 있음(색약). 색 인지가 중요한 분야에 있어서는 이에 대한 고려가 필수
- 색상 이해하가: 색을 이해하기 위해서는 rgb보다 hsl을 이해하는 것이 더 중요하다.
- Hue(색조) : 빨강, 파랑, 초록 등 색상으로 생각하는 부분
- 빨강에서 보라색까지 있는 스펙트럼에서 0-360으로 표현
- Saturate(채도) : 무채색과의 차이
- 선명도라고 볼 수 있음 (선명하다와 탁하다.)
- Lightness(광도) : 색상의 밝기
## Facet
Facet이란 분할을 의미하며, 화면 상에 View를 분할 및 추가하여 다양한 관점을 전달하는 방법이다. 같은 데이터셋에 서로 다른 인코딩을 통해 다른 인사이트를 전달할 수 있있다. 또한 같은 방법으로 동시에 여러ㅗ feature를 볼 수도 있고 큰 틀에서 볼 수 없는 부분집합을 세세하게 볼 수 도 있다.
- Matplotlib에서 구현: Figure와 Axes를 통해서 쉽게 구현이 가능하다.
- 가장 쉬운 3가지 방법: plt.subplot(), plt.figure() + fig.add_subplot(), plt.subplots()
- 쉽게 조정할 수 있는 요소: figuresize, dpi, sharex, sharey, squeeze, aspectGridSpec
- GridSpec
그리드 형태의 subplots을 만들 수 있는데, grid형태가 아닌 subplot을 slicing(fig.add_gridspec(n, m))이나 x, y, dx, dy (plt.subplot2grid)등을 활용해서 만들 수도 있다. 미니맵과 같은 형태나 아주 적은 형태의 그래프를 넣을 수도 있고 (ax.inset_axes([0.8, 0.8, 0.2, 0.2])), 그리드를 사용하지 않고 사이드에 추가하는 방법 (make_axes_locatable)도 있다.
- 그 외 요소들
- dpi: 이미지 해상도 [ fig = plt.figure(dpi=150) ]
- sharex/sharey: 개별 ax에 대해서나 subplots함수를 사용할 때, 축 공유[ fig, axes = plt.subplots(1, 2, sharey=True) ]
- squeeze: 사용하면 항상 2차원으로 배열을 받을 수 있고, 가변 크기에 대해 반복문을 사용하기에 유용
[ fig, axes = plt.subplots(n, m, squeeze=False, figsize=(m*2, n*2)) ] - flatten: plt.subplots()나plt.gca()로 받는 ax 리스트는 numpy ndarray로 전달되기에 1중 반복문을 쓰고 싶다면 해당 메소드를 사용할 수 있다.
n, m = 2, 3
fig, axes = plt.subplots(n, m, figsize=(m*2, n*2))
for i, ax in enumerate(axes.flatten()):
ax.set_title(i)
ax.set_xticks([])
ax.set_yticks([])
plt.show()
- aspect: 축에 대한 비례표시 [ ax2 = fig.add_subplot(122, aspect=0.5) ]
## Moreinfo
- Grid
기본적인 Grid는 축과 평행한 선을 사용해 거리 및 값 정보를 보조적으로 제공한다. 보통은 무채색을 사용하고, Layer 순서 상 맨 밑에 오도록 조정하며, 큰 격자, 세부격자 등을 표현할 수도 있고, x축, y축도 필요한 부분만 설정할 수 있다.
- X+Y = C Grid: 선에 걸치는 값은 X+Y값이 동일한 것으로 본다. Feature의 절대적 합이 중요한 경우에 사용한다.
- Y=CX Grid: 가파를 수록 Y/X가 커진다. Feature의 비율이 중요한 경우에 사용한다.
- 동심원 Grid: 특정 지점에서 거리를 살펴볼 수 있다. 가장 가까운 포인트를 찾거나 한 데이터에서 특정 범위의 데이터를 찾을 떄 사용한다.
- line, Span
- axvline(), axhline(): 직교좌표계에서 평행선을 원하는 부분 그릴 수 있다.
- axvspan(), axhspan(): 선과 함께 특정 부분 면적을 표시할 수 있으며, 특정 부분을 강조할 때 사용한다.
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_aspect(1)
math_mean = student['math score'].mean()
reading_mean = student['reading score'].mean()
ax.axvspan(-3, math_mean, color='gray', linestyle='--', zorder=0, alpha=0.3)
ax.axhspan(-3, reading_mean, color='gray', linestyle='--', zorder=0, alpha=0.3)
ax.scatter(x=student['math score'], y=student['reading score'],
alpha=0.4, s=20,
color=['royalblue' if m>math_mean and r>reading_mean else 'gray' for m, r in zip(student['math score'], student['reading score'])],
zorder=10,
)
ax.set_xlabel('Math')
ax.set_ylabel('Reading')
ax.set_xlim(-3, 103)
ax.set_ylim(-3, 103)
plt.show()
- Spines
ax.spinesd에는 많은 요소가 있지만 대표적인 3가지는 다음과 같다.
- set_visible
- set_linewidth
- set_position: set의 위치 설정 (중요하다)
fig = plt.figure(figsize=(12, 6))
_ = fig.add_subplot(1,2,1)
ax = fig.add_subplot(1,2,2)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('center')
plt.show()
- Theme
rcParams를 한 번에 모두 바꿀 수 있는 것을 thme라고 한다.
print(mpl.style.available)
mpl.style.use('ggplot') # 많이 사용하는 세팅 (ggplot, seaborn ...)
# mpl.style.use('./CUSTOM.mplstyle') # 커스텀을 사용하고 싶다면
plt.plot([1, 2, 3])
"""
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast',
'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind',
'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted',
'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk',
'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
"""
# Seaborn
▶ Review (생각)
시각화의 경우 데이터를 다룰 때 한 번쯤은 사용하게 될 것이라는 생각이 들어 제대로 정리하고 싶었다. 그래서 제대로 정리해보고 싶었는데, 코드와 출력 결과를 같이 올리다보니 내용이 많지 않음에도 불구하고 길어졌다. 그리고 일부 코드에는 내가 원하는 데이터가 있다면 바로 적용시킬 수 있을 법한 것도 많아서 따로 정리해두면 좋을 것 같다는 생각이 들었다. 그래서 MatPlotlib에서 배웠던 내용들 중에서 테크닉적인 요소나 추후에 사용할 것 같은 코드들을 별도로 모아서 키워드 및 사용방법 등을 정리할 계획이다.
Seaborn의 경우 해당 포스팅에서 또 다루게 되면 코드가 너무 길어지기에 아예 별도의 포스팅을 통해서 정리할 계획이다. 언젠가 다시 한 번 사용하게 될 라이브러리들의 경우 정리해두면 꽤나 도움이 되는 것 같다.
'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글
[일일리포트] Day 13 (DL Basics) (0) | 2022.02.07 |
---|---|
[3주차] 학습 정리 및 회고 (0) | 2022.02.04 |
[일일리포트] Day 11 (Matplotlib) (0) | 2022.02.03 |
[2주차] 학습 정리 및 회고 (1) | 2022.01.28 |
[일일리포트] Day 10 (0) | 2022.01.28 |