파이썬에서 시각화를하는 다양한 방법이 있다.
강사님이 숙제로 내주신 혼란한 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/
#위의 그래프를 조금씩 수정하겠다
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 |