seaborn可視化學習之category visualization
seaborn是一個做數據可視化效果很棒的庫。尤其是當數據維度很大的時候,seaborn可以讓我們用最少的代碼去繪製一些描述性統計的圖,便於找尋各維度變數之間的特徵。在看了官方tutorial之後,嘗試用Iris鳶尾花數據集實踐一下categorical visualization,也就是數據按類別進行可視化。
Iris鳶尾花數據集
內容摘自百度百科:Iris數據集是常用的分類實驗數據集,由Fisher 1936收集整理。「Iris也稱鳶尾花卉數據集,是一類多重變數分析的數據集。數據集包含150個數據集,分為3類,每類50個數據,每個數據包含4個屬性。可通過花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性預測鳶尾花卉屬於(Setosa,Versicolour,Virginica)三個種類中的哪一類」。
seaborn在做categorical visualization時可用的plot function:
- stripplot & swarmplot
- boxplot & violinplot
- barplot & pointplot
- 抽象化的factorplot.
下面就用紙鳶花數據集做一下講解,具體這幾個function可以做怎樣的效果出來。
Stripplot
Stripplot的本質就是把數據集中具有quantitative屬性的變數按照類別去做散點(Scatterplot)。我們將紙鳶花數據集中不同種類花的sepal length做stripplot可視化。
左上圖片便是在默認風格下用stripplot繪製的散點圖。在很多情況下,stripplot中的點會重疊,使得我們不容易看出點的分布情況。一個簡單的解決辦法就是用在stripplot的基礎上繪製抖動圖(jitterplot),僅沿著類別坐標軸的方向去隨機微調整點的位置,顯示出分布情況,如右上所示。
plt.figure(1,figsize=(12,6))nnplt.subplot(1,2,1)nsns.stripplot(x=species,y=sepal_length,data=iris) #stripplotnplt.title(Striplot of sepal length of Iris species)nnwith sns.axes_style("whitegrid"): n# 這個是臨時設置樣式的命令,如果不寫,則按默認格式darkgrid進行繪製n plt.subplot(1,2,2)n plt.title(Striplot of sepal length of Iris species)n sns.stripplot(x=species,y=sepal_length,data=iris,jitter=True) nnplt.show()n
Swarmplot
另一個解決stripplot中點重疊的辦法就是繪製swarmplot,它的本質就是用通過演算法,在類別坐標軸的方向上去『延展』繪製這些原本重合的點。 我們將紙鳶花數據集中不同種類花的petal length和petal width做swarmplot可視化。
plt.figure(1,figsize=(12,6))nnplt.subplot(1,2,1)nsns.swarmplot(x=species,y=petal_length,data=iris) nnwith sns.axes_style("ticks"): # 這次使用了ticks風格n plt.subplot(1,2,2)n sns.swarmplot(x=species,y=petal_width,data=iris)nnplt.show()n
Boxplot
箱形圖,主要包含六個數據節點,將一組數據從大到小排列,分別計算出上邊緣,上四分位數Q3,中位數,下四分位數Q1,下邊緣,還有異常值。 下面將紙鳶花數據集中的四個變數sepal_length, sepal_width, petal_length和petal_width做箱形圖可視化。
var = [sepal_length,sepal_width,petal_length,petal_width]naxes_style = [ticks,white,whitegrid, dark]nnfig = plt.figure(1,figsize=(12,12))nnfor i in range(4):n with sns.axes_style(axes_style[i]): # 將除了默認的darkgrid之外的樣式都展現一遍n plt.subplot(2,2,i+1)n sns.boxplot(x=species,y=var[i],data=iris)nnplt.show()n
Violinplot
Violinplot相當於結合了箱形圖與核密度圖,更好地展現出數據的量化形態。展示如下
context= [notebook,paper,talk,poster]naxes_style = [ticks,white,whitegrid, dark]nnplt.figure(1,figsize=(12,12))nfor i in range(4):n with sns.axes_style(axes_style[i]):n#設置axes_stylen sns.set_context(context[i]) n# 設置context style,默認為notebook,除此之外還有paper,talk,postern plt.subplot(2,2,i+1)n plt.title(str(var[i])+ in Iris species)n sns.violinplot(x=species,y=var[i],data=iris)nnplt.show()n
Violinplot用kernel density estimate去更好地描述了quantitative變數的分布。與此同時,也可以組合swarmplot和boxplot或violinplot去描述quantitative變數。用鳶尾花數據集展示如下:
plt.figure(1,figsize=(12,12))nfor i in range(4):n with sns.axes_style(axes_style[i]):#設置axes_stylen sns.set_context(context[i])#設置contextn plt.subplot(2,2,i+1)n plt.title(str(var[i])+ in Iris species)n sns.swarmplot(x=species, y=var[i], ndata=iris, color="w", alpha=.5) n sns.violinplot(x=species, y=var[i], data=iris, inner=None)n if i%2 ==0 else sns.boxplot(x=species, y=var[i], data=iris) n# 分別用swarmplot+violinplot 和swarmplot + boxplotnnplt.show()n
Barplot
Barplot主要是展現在分類中的quantitative變數的平均值情況,並且用了boostrapping演算法計算了估計值的置信區間和error bar.用鳶尾花數據集展示如下:
plt.figure(1,figsize=(12,12))nfor i in range(4):n with sns.axes_style(axes_style[i]):#設置axes_stylen sns.set_context(context[i])#設置contextn plt.subplot(2,2,i+1)n plt.title(str(var[i])+ in Iris species)n sns.swarmplot(x=species, y=var[i], data=iris, ncolor="w", alpha=.5) n sns.violinplot(x=species, y=var[i], data=iris, inner=None) nif i%2 ==0 else sns.boxplot(x=species, y=var[i], data=iris) n# 分別用swarmplot+violinplot 和swarmplot + boxplotnplt.show()n
Countplot
如果想知道在每個類別下面有多少個觀察值,用countplot就可以,相當於是做一個observation counts,用鳶尾花數據集展示如下:
plt.figure(figsize=(5,5))nsns.countplot(y="species", data=iris) nplt.title(Iris species count)nplt.show()n
Pointplot
Pointplot相當於是對barplot做了一個橫向延伸,一方面,用point estimate和confidence level去展示barplot的內容;另一方面,當每一個主類別下面有更細分的sub-category的時候,pointplot可以便於觀察不同sub-category在各主類別之間的聯繫。展示如下
plt.figure(1,figsize=(12,12))nfor i in range(4):n with sns.axes_style(axes_style[i]):n sns.set_context(context[i]) n plt.subplot(2,2,i+1)n plt.title(str(var[i])+ in Iris species)n sns.pointplot(x=species,y=var[i],data=iris)nplt.show()n
Factorplot
Factorplot可以說是seaborn做category visualization的精髓,前面講的這些plot都可以說是factorplot的具體展示。我們可以用PariGrid去實現對多個類別的數值特徵用同一種plot做可視化
sns.set(stylex="ticks")ng = sns.PairGrid(iris,x_vars = [sepal_length,sepal_width,npetal_length,petal_width],y_vars = species,aspect=0.75,size=4) ng.map(sns.violinplot,palette=pastel)nplt.show()n
小結
實踐出真知,鳶尾花數據集也是一個經典的入門數據科學領域的項目,本文代碼與後續的探索將會放在科賽網(kesci.com),歡迎查閱調試。
推薦閱讀:
※詳細解析:數據可視化專家的七個秘密
※由菜鳥到進行簡單的數據分析是怎樣的一種體驗
※數說快消(四)市場營銷人員必備「套路」
※數據時間軸展開後的上帝視角(一):銀行年報數據的可視化