PYTHON DATA 시각화 – MATPLOTLIB #2
Data 시각화 #2 (matplotlib)¶
matplotblib 에는 상상 가능한 거의 모든 종류의 도면을 그릴 수 있는 수십개의 도식화 메서드가 있다. 선, 막대, 히스토그램, 산포도, 상자, 바이올린, 등고선, 파이, 기타 많은 종류의 도면이 Axes 객체의 메서드로 제공된다.
1. alta 스키 리조트의 적설량의 데이터를 시각화¶
데이터 설명 : alta 스키 리조트의 데이터 정보|
In [1]:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
In [2]:
alta = pd.read_csv('data/alta-noaa-1980-2019.csv')
In [3]:
alta.info()
alta 스키장의 SNWD 의 컬럼의 데이터를 이용하여 적설량 데이터를 그린다. alta DATE 컬럼을 datetime 형태로 변환해주고 index 로 만든다. DATE 2018-09 : 2019-08 에서의 적설량을 확인한다.
In [4]:
data = (alta
.assign(DATE=pd.to_datetime(alta.DATE))
.set_index('DATE')
.loc['2018-09':'2019-08']
.SNWD
)
data
Out[4]:
2. data 를 이용하여 시각화¶
In [5]:
blue = '#99ddee'
white = '#ffffff'
fig, ax = plt.subplots(figsize=(12,4),linewidth=5, facecolor=blue)
ax.set_facecolor(blue)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.tick_params(axis='x', colors=white)
ax.tick_params(axis='y', colors=white)
ax.set_ylabel('Snow Depth(in)', color=white)
ax.set_title('2009-2010', color=white, fontweight='bold')
ax.fill_between(data.index, data, color=white)
fig.savefig('c13-alta1.png', dpi=300, facecolor=blue)
3. 단일 figure 여러개의 도면 시각화¶
interpolate 메서드를 이용하여 누락된 데이터 정리
In [6]:
import matplotlib.dates as mdt
blue = '#99ddee'
white = '#ffffff'
def plot_year(ax, data, years):
ax.set_facecolor(blue)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.tick_params(axis='x', colors=white)
ax.tick_params(axis='y', colors=white)
ax.set_ylabel('Snow Depth (in)', color=white)
ax.set_title(years, color=white, fontweight='bold')
ax.fill_between(data.index, data, color=white)
years = range(2009, 2019)
fig, axs = plt.subplots(ncols=2, nrows=int(len(years)/2), figsize=(16,10), linewidth=5, facecolor=blue)
axs = axs.flatten()
max_val = None
max_data = None
max_ax = None
for i, y in enumerate(years):
ax = axs[i]
data = (alta
.assign(DATE=pd.to_datetime(alta.DATE))
.set_index('DATE')
.loc[f'{y}-09':f'{y+1}-08']
.SNWD
.interpolate()
)
if max_val is None or max_val < data.max():
max_val = data.max()
max_data = data
max_ax = ax
ax.set_ylim(0, 180)
years = f'{y}-{y+1}'
plot_year(ax,data,years)
max_ax.annotate(f'Max Snow {max_val}', xy=(mdt.date2num(max_data.idxmax()), max_val), color=white)
fig.suptitle('Alta Snowfalll', color=white, fontweight='bold')
fig.tight_layout(rect=[0,0.03,1,0.95])
fig.savefig('c13-alta2.png', dpi=300, facecolor=blue)
4. 데이터 확인(그래프가 제대로 그려지지 않고 빈공간이 생기는 문제점)¶
겨울시즌중에 적설량이 너무 많이 떨어지는 지점이 있는 경우가 있다. 연속된 데이터를 비교하여 50 이상 차이가 나는 지점을 찾아보자
In [7]:
(alta
.assign(DATE=pd.to_datetime(alta.DATE))
.set_index('DATE')
.SNWD
.to_frame()
.assign(next=lambda df_:df_.SNWD.shift(-1),
snwd_diff=lambda df_:df_.next-df_.SNWD)
.pipe(lambda df_:df_[df_.snwd_diff.abs() > 50])
)
Out[7]:
5. 데이터 처리(0 이 되는 데이터 삭제)¶
시즌중에 np.nan 데이터가 아닌 데이터가 실제로 0이 되는 지점이 있다.
In [8]:
def fix_gaps(ser, threshold=50):
mask = (ser
.to_frame()
.assign(next=lambda df_:df_.SNWD.shift(-1),
snwd_diff=lambda df_:df_.next - df_.SNWD)
.pipe(lambda df_:df_.snwd_diff.abs() > threshold)
)
return ser.where(-mask, np.nan)
years = range(2009, 2019)
fig, axs = plt.subplots(ncols=2, nrows=int(len(years)/2), figsize=(16,10), linewidth=5, facecolor=blue)
axs = axs.flatten()
max_val = None
max_data = None
max_ax = None
for i,y in enumerate(years):
ax = axs[i]
data = (alta
.assign(DATE=pd.to_datetime(alta.DATE))
.set_index('DATE')
.loc[f'{y}-09':f'{y+1}-08']
.SNWD
.pipe(fix_gaps)
.interpolate()
)
if max_val is None or max_val < data.max():
max_val = data.max()
max_data = data
max_ax = ax
ax.set_ylim(0, 180)
years = f'{y}-{y+1}'
plot_year(ax,data,years)
max_ax.annotate(f'Max Snow {max_val}', xy=(mdt.date2num(max_data.idxmax()), max_val), color=white)
fig.suptitle('Alta Snowfalll', color=white, fontweight='bold')
fig.tight_layout(rect=[0,0.03,1,0.95])
fig.savefig('c13-alta2.png', dpi=300, facecolor=blue)