국문과 유목민

[일일리포트] Day 12 (Matplotlib2) 본문

IT 견문록/2022_부스트캠프 AITech 3기(100일)

[일일리포트] Day 12 (Matplotlib2)

논곰 2022. 2. 4. 22:36

해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 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
suptitle 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

Matplotlib: FontsDemo

- 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 Details and Alignments Example

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()

Span code Example

- 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']
"""

ggplot theme

# Seaborn

Seaborn API별 사용법

 

Seaborn API별 사용법

 Seaborn의 다양한 API들을 가볍게 다루는 포스팅입니다. API가 어떻게 표현되고, 각 API에서 파라메터가 어떤 역할을 하는지 등에 대해 다룰 예정입니다. 파라메터에 대한 설명이 간단할 경우 코드

cold-soup.tistory.com

 

Seaborn 멀티차트 사용법

 

Seaborn 멀티차트 사용법

이전 포스팅에서 Plot API별 사용법을 정리했기 때문에 해당 포스팅에서는 MultiFaceted에 관해서만 다루고 있습니다. API의 사용방법이 궁금하시면 이전 포스팅(Saeborn API별 사용법)을 참고해주시기

cold-soup.tistory.com

▶ Review (생각)

 시각화의 경우 데이터를 다룰 때 한 번쯤은 사용하게 될 것이라는 생각이 들어 제대로 정리하고 싶었다. 그래서 제대로 정리해보고 싶었는데,  코드와 출력 결과를 같이 올리다보니 내용이 많지 않음에도 불구하고 길어졌다. 그리고 일부 코드에는 내가 원하는 데이터가 있다면 바로 적용시킬 수 있을 법한 것도 많아서 따로 정리해두면 좋을 것 같다는 생각이 들었다. 그래서 MatPlotlib에서 배웠던 내용들 중에서 테크닉적인 요소나 추후에 사용할 것 같은 코드들을 별도로 모아서 키워드 및 사용방법 등을 정리할 계획이다. 

 Seaborn의 경우 해당 포스팅에서 또 다루게 되면 코드가 너무 길어지기에 아예 별도의 포스팅을 통해서 정리할 계획이다. 언젠가 다시 한 번 사용하게 될 라이브러리들의 경우 정리해두면 꽤나 도움이 되는 것 같다.

Comments