yuwei
Jacky’s blog
Published in
13 min readFeb 10, 2019

--

NEIHU

Hello, if you do not read Chinese version article, you could move to my github or nbviewer. That would give you as same as the article in here but in English version. (I would upload these links as soon as possible)

Hi, 大家最近過的好嗎? 今天我要來介紹一個新的套件,想必各位如果有在持續增進自己python的視覺化能力,你會發現,可能必須花費好幾個小時去研究自己想要的功能如何展現?如何製作註解?如何將在圖表上看的特性標記出來?你常常要花好幾行的code才能呈現你所想要的功能,為了解決這些問題,我將使用plotly來取代原本你所使用matplotlib,它能夠更好的解決你所面臨的麻煩,也是我今天想要撰寫這篇文章的目的

這篇文章所有的內容都會包含在我的github裡,可以去看看

plotly

那什麼是plotly呢? plotly是一個能讓你畫出互動式圖表的一個開源套件,其基本操作是免費的,如果你想要使用網頁的版本,可以使用更多plotly的進階功能的話,就必須付費

plotly+cufflinks

cufflinks這個套件是用來結合pandas和plotly的,你可以使用dataframe的同時,直接加iplot就可以產生比matplotlib還要更fancy的圖表

pip install plotly
pip install cufflinks

現在要先導入要使用的套件

#可以製作互動式圖表的套件
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import iplot,init_notebook_mode
#為可以將pandas和plotly結合的套件
import cufflinks
cufflinks.go_offline(connected=True)
init_notebook_mode(connected=True)

Data

這次的資料集我依舊會使用之前第一篇文章所用來分析Lebron James常規賽的比賽數據當作我這次視覺化專案的工具

之後我也將根據圖的不同一種一種的做介紹

可以使用在cufflinks下的圖表有這一些

scatter, bar, box, spread,
ratio, heatmap, surface, histogram,
bubble, bubble3d,scatter3d, scattergeo,
ohlc, candle, pie, choroplet

iplot裡面有的參數,我將針對其中的幾項進行探索與教學,你可以根據你想要的圖表進行分別給予

DataFrame.iplot(
["kind='scatter'", 'data=None', 'layout=None', "filename=''", 'sharing=None', "title=''", "xTitle=''", "yTitle=''", "zTitle=''", 'theme=None', 'colors=None', 'colorscale=None', 'fill=False', 'width=None', "dash='solid'", "mode='lines'", "interpolation='linear'", "symbol='circle'", 'size=12', "barmode=''", 'sortbars=False', 'bargap=None', 'bargroupgap=None', 'bins=None', "histnorm=''", "histfunc='count'", "orientation='v'", 'boxpoints=False', 'annotations=None', 'keys=False', 'bestfit=False', 'bestfit_colors=None', 'mean=False', 'mean_colors=None', "categories=''", "x=''", "y=''", "z=''", "text=''", 'gridcolor=None', 'zerolinecolor=None', 'margin=None', 'labels=None', 'values=None', "secondary_y=''", "secondary_y_title=''", 'subplots=False', 'shape=None', 'error_x=None', 'error_y=None', "error_type='data'", 'locations=None', 'lon=None', 'lat=None', 'asFrame=False', 'asDates=False', 'asFigure=False', 'asImage=False', 'dimensions=None', 'asPlot=False', 'asUrl=False', 'online=None', '**kwargs'],
)

histogram

給予單一變數進行畫圖,表示x軸為該變數,而y軸在為其計數

#kind=''為指定想要何種圖
#xTitle='' x軸的名稱 yTitle='' title=''圖名
df['PTS'].iplot(kind='hist',xTitle='score',yTitle='count',title='Claps Distribution')
如果你自行畫出來這個圖時,你可以根據你的鼠標拉到你想要的位置,會顯示出該位置的x軸y軸數值,也可以透過右上方進行圖表的放大或縮小

呈現的數據主要Lebron的得分數據圖,基本上因為數據夠大,撇除一些異常值之後,圖形會呈現常態分配,其中在20~40分

更detailed一點設計參數的話

#histnorm如同plt.hist裡的norm參數一樣,只是可以調整成''(frequency),'percent','density'等不同
#barmode=['group','stack','overlay']
df[['TRB','AST]].iplot(kind='hist',xTitle='score',yTitle='count(%)',
title='Claps Distribution',
histnorm='percent', linecolor='Black',
bins=30, barmode='group', bargap=0.1)
也是用hist來看籃板和助攻的的比例分配圖,基本上也是呈現常態分配的分佈

Bar

bar 和hist主要的差別在,hist是用來呈現連續型資料,而bar是用來呈現非連續型資料,所謂的非連續型資料,每一條長條間沒有什麼連續性,順序性

這次的資料我會將其轉成以一季一季的方式表示之

df2=df[['PTS','TRB','AST']].resample('A-SEP').mean()
df2.iplot(kind='bar',xTitle='Date',yTitle='Average',title='Year Average Points, Rebounds and Assists',linecolor='Black')
df2=df[['PTS','TRB','AST']].resample('A-SEP').mean()
ticktext=['第%d季' %i for i in range(1,df2.shape[0]+1)]
df2.iplot(kind='bar',
linecolor='Black',
layout={'xaxis':go.layout.XAxis(
ticktext=ticktext,
tickvals=df2.index,
title='季'),
'yaxis':go.layout.YAxis(title='季平均'),
'title':'Year Average Points, Rebounds and Assists'})

這裡多了個參數layout是給予plotly你想要根據x軸y軸做出什麼的設置,並更改xticks和yticks,go是graph_objs 中文意思大概是指圖片中的物件,也就只是指x,y軸和整張圖

我改變原本設定x軸以每年來表示,來設定成每一季,如果你使用matplotlib的話,就必須調整圖片的中文配置,使用plotly的話就可以直接設定

Box

盒型圖主要是透過分析資料的分配程度,看出資料的在不同比例時的數值

#data.pivot可以根據你想要的columns,index和values來reshape資料,跟pivot_table不同,不需要透過加減乘除來整合資料
data.pivot(columns='Tm',values='PTS').iplot(
kind='box',
yTitle='PTS')

接下來要介紹的是直線圖,並在data點上特別標記,給予其data點註記,使其更能得知該資料點代表什麼意義,

基本上都是一行code可以完成,只是需要學習參數的應用,這個不難,看得懂英文就能夠妥善應用

Scatter

散佈圖的畫圖方法有很多種,如果沒有很detailed敘述的話,因為放入的為兩個變數,所以會改成以散佈圖的方式來呈現

data['WIN']=data['WIN'].apply(lambda x:'WIN' if x==1 else 'LOSE')
#categroies='' 同一個變數下包含不同種類
data.iplot(x='PTS',y='AST',categories='WIN',xTitle='Points',yTitle='Assists',opacity=0.8)
data.iplot(x='PTS',  
y='AST',
mode='markers',
size=data['MP'], #根據上場時間的大小來改散佈圖點的大小
categories='WIN',
xTitle='PTS',
yTitle='AST',
title='PTS vs AST by Game Minutes')

我現在要使用另一種方法,用我剛剛import的go函數來繪製散佈圖

這裡再多介紹vspan的應用,讓你可以更輕而易舉標記出要看這圖片的人該看的區域

不知你是否有注意到,symbol=1時是square,而symbol=5時是三角形,你可以自己去試自己喜歡的圖案

進階圖形

這邊我會再向你介紹使用機率不高,但是對資料分析幫助卻十分巨大的圖,如果你覺得心有餘力,可以繼續學習,就繼續往下讀吧!

現在,我要多import一個函數,來讓圖片能夠進行更進一步的加工

import plotly.figure_factory as ff

pairgrid

如同sns.pairgrid給予對角線,右上方和左下方的圖不同的圖形,什麼時候要用什麼圖,我們都是需要根據數據的內容去做判斷,例如,想看單一變數的累計圖可用直方圖,散步圖可以用來看兩個變數之間的關係等等

figure=ff.create_scatterplotmatrix(
df1[['PTS','TRB','AST','WIN']],
height=1000,
width=1000,
diag='histogram', #斜線的圖以直方圖來表示
index='WIN') #根據'WIN'來在同一張子圖下分win或lose

Heatmap

heatmap主要是用來呈現兩變數間的相關係數圖

corr=df.corr()
figure=ff.create_annotated_heatmap(
z=corr.values,
x=list(corr.columns),
y=list(corr.index),
colorscale='Earth',
annotation_text=corr.round(2).values,
reversescale=True)
figure.layout.margin=dict(l=200,t=200)
figure.layout.height=800
figure.layout.width=1000

Pie

很重要的圖,簡單的比較在一件事發生下,各種原因所佔的比例

ata.groupby('Opp',as_index=False)['PTS']\
.sum().iplot(kind='pie',
labels='Opp', #屬性資料
values='PTS', #屬量資料(連續型資料)
title='Odds Ration')

結論

這篇的文章主要不是在述說資料的分析,而是進行資料視覺化,在你分析完資料之後,你必須要有能力將你的想法視覺化,說服別人為什麼應該要相信你分析的結果,沒有適當的視覺化能力,是不能做一個好的資料分析師的,更甚至於要成為一個傑出的資料科學家,所以,希望你能隨時精進自己的視覺化能力,多想一點可以增加在圖表上的內容,並且自己去看tutorial或論壇要怎麼實現你的想法,加油!共勉之!

一樣,非常歡迎你寄信到我的email一起討論, jack308082@gmail.com

--

--

yuwei
Jacky’s blog

Curious Data scientist. Strong Lebron James’s fan. #StriveForGreatness #JustAKidFromTaiwan https://www.linkedin.com/in/yu-wei-chung/