euny!
errorlog
euny!
전체 방문자
오늘
어제
  • 분류 전체보기 (22)
    • Python (13)
    • 데이터분석 (3)
    • WIL (4)
    • SQL (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • SQL
  • BeautifulSoup
  • 크롤링
  • ㅗ
  • 웹크롤링
  • 웹스크래핑

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
euny!

errorlog

[WIL] Matplotlib
WIL

[WIL] Matplotlib

2023. 2. 2. 17:22

파이썬에서 시각화를하는 다양한 방법이 있다.

 

강사님이 숙제로 내주신 혼란한 Matplotlib에서 질서찾기 영상을 보고 연습하였다. 

 

 

일단, Seaborn 을 통해서는 아래와 같이 다양한 환경설정을 통해 시각화를 좀 더 예쁘게 할 수 있다. 
set_context() : font, line, marker 등의 구성요소의 크기를 일괄적으로 조정한다.
* talk : 발표에서 사용하기 적절한 크기로 커진다


set_palette() : 배색을 바꾼다.
set_style() : 눈금, 배경, 격자 설정
scatter() : 산점도를 그린다.
* alpha : 투명도

 

from matplotlib import pyplot as plt
import numpy as np
import seaborn as sns

flights = sns.load_dataset("flights")    # 여객운송 데이터
year = flights["year"]
month = flights["month"]
passengers = flights["passengers"]

sns.set_context("talk")
sns.set_palette("Set2")
sns.set_style("whitegrid")

plt.scatter(year, passengers, alpha = 0.5)

 

이 강의에서는 Matplot을 사용하여 시각화를 예쁘고 수정하기 쉬운 코드로 하는 방법에 대해 설명한다. 

 

state based :상태기반 방식

* 그림을 그리는 순서에 맞게 코딩을 한다.
* plt 그리는 명령어만 익히면되서 입문서에 많이 언급된다.
* 공간 제어를 코드 순서와 일치시켜야 하므로 위아래를 오가며 코딩한다.
* 코드가 쳬계를 갖추기 어렵고 나열식 코드가 될 수 밖에 없다.

# 그림크기설정
plt.figure(figsize = (8, 4))

# 왼쪽 공간만듬
plt.subplot(121)
# 데이터를 뿌린다.
plt.plot(passengers, year, marker = "o", ms = 10, label = "year")
# x축, y축 label 삽입
plt.xlabel("time")
plt.ylabel("output")

# 오른쪽공간 만듬
plt.subplot(122)
# 데이터를 뿌린다.
plt.plot(passengers, month, ls = ":", label = "month")
# x축 label 삽입
plt.xlabel("time")
# 법례 추가
plt.legend()

#여기서 왼쪽 그래프에 법례를 넣으려면 위로 올라가서 적고 다시 내려와야함

# 전체 제목을 넣음
plt.suptitle("flight")
# 두 그래프 사이의 간격 조정
plt.subplots_adjust(wspace = 0.1)
plt.tight_layout()

 

object-oriented framework : 객체지향 방식

* 대상을 지정해 그리는 방식
* 결과물의 일부를 수정하기 유리한 방식

fig, axs = plt.subplots(ncols=2, figsize =(8, 4),
                        gridspec_kw = {"wspace" : 0.1},
                        constrained_layout=True)

axs[0].plot(passengers, year, marker = "o", ms=10, label = "power")
axs[1].plot(passengers, month, ls = ":", label = "torque")

for ax in axs:
    ax.set_xlabel("passengers")
    ax.legend()
axs[0].set_ylabel("output")

fig.suptitle("Flight")

 

 

바이올린그래프 그려보기

titanic = sns.load_dataset("titanic")    # 타이타닉호 데이터

fig, ax = plt.subplots()
sns.violinplot(x = "class", y = "fare", data = titanic,
              hue = "sex", split=True, ax = ax)
ax.set(xlabel ="", ylabel = "",
      title = "Titnic ")

 

부가요소 설정 및 중요데이터 강조

import matplotlib.colors as mcolors
import colorsys

def set_hls(c, dh=0, dl=0, ds=0, dalpha=0):
    """
    c : (array -like, str) color in RGB space
    dh : (float) change in Hue
        default = 0
    dl : (float) change in Lightness
        default = 0
    ds : (float) change in Saturation
        default = 0
    """
    # 입력된 color를 RGBA numpy array로 변환
    c_rgba = mcolors.to_rgba(c)
    
    # RGB와 alpha 분리
    c_rgb = c_rgba[:3]
    alpha = c_rgba[3]
    
    # RGB 색공간을 HLS 색공간으로 변환 후 입력된 변화 적용
    c_hls = colorsys.rgb_to_hls(*c_rgb)
    h = c_hls[0] + dh
    l = max(min(c_hls[1] + dl, 1), 0)     # 0~1 범위를 넘지 않도록 제어
    s = max(min(c_hls[2] + ds, 1), 0)     # 0~1 범위를 넘지 않도록 제어
    
    # HLS 색공간에서 변경된 색을 RGB 색공간으로 변환
    c_rgb_new = colorsys.hls_to_rgb(h, l, s)
    alpha = max(min(alpha+dalpha, 1), 0)  # 0~1 범위를 넘지 않도록 제어
    
    return np.append(c_rgb_new, alpha) # alpha 추가하여 return

강의에서는 위의 함수에대해 자세히 나오지 않지만 검색을 통해 위의 함수를 찾았다.

출처 : https://jehyunlee.github.io/2022/09/05/Python-DS-112-sethls/

 

Emphasis on main data

시각화에서 색은 매우 중요한 요소입니다. 중요 데이터를 강조하기 위해 특정 영역의 색을 다르게 지정하기도 합니다. HLS 색공간을 사용해 특정 데이터만 강조합니다. 1. 중요 데이터 강조 Claus W

jehyunlee.github.io

 

#위의 그래프를 조금씩 수정하겠다
fig, ax = plt.subplots()
sns.violinplot(x = "class", y = "fare", data = titanic,
              hue = "sex", split=True, ax = ax)
ax.set(xlabel ="", ylabel = "",
      title = "Titnic ")

# 1. y축의 범위를 조정하는 코드 위 그래프에서는 충분히 범례가 잘보이므로 주석처리

#ax.set_ylm(ymin = 100)

# 2. 불필요한 요소 제거
# data-ink ratio : 데이터를 필하는데 들어간 잉크와 데이터를 제외한 부가요소에 들어간 잉크 
# 부가요소에 들어간걸 최대한 줄어라!

# spined : 그래프 테두리
ax.spines[["left", "top", "right"]].set_visible(False)
# y축의 눈금의 길이를 0으로 만들어라 
ax.tick_params(axis = "y", length = 0)
# y축에서 grid를 뻗어라
ax.grid(axis = "y", c = "lightgray")


# for문으로 바이올린 모양의 다각형을 순회하면서 First, Second 만 수정
for i, obj in enumerate(ax.collections):
    ec = "gray" if i < 6 else "k"
    lw = 0.5 if i < 6 else 1
    # 엣지 컬러 수정
    obj.set_ec(ec)
    # 윤곽선 두께 수정
    obj.set_lw(lw)
    # 중앙값을 의미하는 마커가 너무 작아 크기 키움
    if (i+1)%3 == 0:
        obj.set_sizes([60])
        # First, Second 명도 높이고 채도 낮춤(비중요데이터 흐리게)
    if i < 6:
        obj.set_fc(set_hls(obj.get_fc(), ds =- 0.3, dl=0.2))

# Third 선명하게 수정
for i, line in enumerate(ax.lines):
    if i > 3:
        line.set_color("k")
        
# 범례를 오른쪽 아래로 바꾼다.
# legend 새로 만들 준비
handles = ax.collections[-3:-1]
labels = ["Male", "Female"]
ax.legend(handles, labels, fontsize = 14, 
         title = "sex", title_fontsize = 14,
         edgecolor = "lightgray", loc = "upper right")

'WIL' 카테고리의 다른 글

[WIL] 한주동안의 강의 요약, 버거지수  (0) 2023.02.09
[WIL] Jupyter Notebook 사용하기, Pandas  (0) 2023.01.19
[WIL] Pandas 기초, 데이터 수집하기  (1) 2023.01.12
    'WIL' 카테고리의 다른 글
    • [WIL] 한주동안의 강의 요약, 버거지수
    • [WIL] Jupyter Notebook 사용하기, Pandas
    • [WIL] Pandas 기초, 데이터 수집하기
    euny!
    euny!

    티스토리툴바