本文由 保一雄@科賽網 數據分析師 原創。
Seaborn是一個很棒的可視化庫,尤爲是當數據維度很大時,它可讓咱們用最少的代碼去繪製一些描述性統計的圖,便於找尋各維度變量之間的特徵。算法
繼上篇Python可視化:Seaborn(一),分享過用Seaborn作Distribution Visualization,本篇咱們將分享用Seaborn作Categorial Visualization,包括其中涉及的Stripplot & Swarmplot,Boxplot & Violinplot,Barplot & Pointplot,以及抽象化的Factorplot。app
咱們此處結合科賽網上公開的Iris鳶尾花數據集進行演示說明。ide
文中全部完整源代碼都可經過 K-Lab在線數據分析協做工具 復現。它 涵蓋了Python、R等主流語言,完成了包括Seaborn、Pandas、Numpy等90%以上數據分析&挖掘相關庫的部署,幫助數據人才專一數據分析自己,提升效率。
Iris鳶尾花數據集:是經常使用的分類實驗數據集,由Fisher, 1936收集整理。是一類多重變量分析的數據集。共包含150個數據集,分爲3類,每類50個數據,每一個數據包含4個屬性。可經過花萼長度(sepal_length),花萼寬度(sepal_width),花瓣長度(petal_length),花瓣寬度(petal_width)4個屬性預測鳶尾花卉屬於(Setosa,Versicolour,Virginica)三個種類中的哪一類。
導入庫工具
import warnings warnings.filter
warnings("ignore")
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt %matplotlib inline
import seaborn as sns
Stripplot的本質就是把數據集中具備Quantitative屬性的變量按照類別去作散點圖(Scatterplot)。
post
咱們將紙鳶花數據集中不一樣種類花的Sepal Length作Stripplot可視化。學習
plt.figure(1,figsize=(12,6))
plt.subplot(1,2,1)
sns.stripplot(x='species',y='sepal_length',data=iris) #stripplot
plt.title('Striplot of sepal length of Iris species')with sns.axes_style("whitegrid"): # 這個是臨時設置樣式的命令,若是不寫,則按默認格式'darkgrid'進行繪製
plt.subplot(1,2,2)
plt.title('Striplot of sepal length of Iris species') sns.stripplot(x='species',y='sepal_length',data=iris,jitter=True) # jitterplot
plt.show()
上邊左側的圖片即是在默認風格下用Stripplot繪製的散點圖。在不少狀況下,Stripplot中的點會重疊,使得咱們不容易看出點的分佈狀況。一個簡單的解決辦法就是用在Stripplot的基礎上繪製抖動圖(jitterplot),僅沿着類別座標軸的方向去隨機微調整點的位置,顯示出分佈狀況。spa
另外一個解決Stripplot中點重疊的辦法就是繪製Swarmplot,它的本質就是用經過算法,在類別座標軸的方向上去‘延展’繪製這些本來重合的點。 咱們將紙鳶花數據集中不一樣種類花的Petal Length和Petal width作Swarmplot可視化。
3d
plt.figure(1,figsize=(12,6))
plt.subplot(1,2,1)
sns.swarmplot(x='species',y='petal_length',data=iris)
with sns.axes_style("ticks"): # 此次使用了ticks風格
plt.subplot(1,2,2)
sns.swarmplot(x='species',y='petal_width',data=iris)
plt.show()
箱形圖,主要包含六個數據節點,將一組數據從大到小排列,分別計算出上邊緣,上四分位數Q3,中位數,下四分位數Q1,下邊緣,還有異常值。 下面將紙鳶花數據集中的四個變量sepal_length, sepal_width, petal_length和petal_width作箱形圖可視化。
cdn
var = ['sepal_length','sepal_width','petal_length','petal_width']
axes_style = ['ticks','white','whitegrid', 'dark']
fig = plt.figure(1,figsize=(12,12))for i in range(4): with sns.axes_style(axes_style[i]): # 將除了默認的darkgrid以外的樣式都展示一遍
plt.subplot(2,2,i+1) sns.boxplot(x='species',y=var[i],data=iris)
plt.show()
Violinplot至關於結合了箱形圖與核密度圖,更好地展示出數據的量化形態。
blog
context= ['notebook','paper','talk','poster']
axes_style = ['ticks','white','whitegrid', 'dark']
plt.figure(1,figsize=(12,12))for i in range(4): with sns.axes_style(axes_style[i]):#設置axes_style
sns.set_context(context[i]) # 設置context style,默認爲notebook,除此以外還有paper,talk,poster
plt.subplot(2,2,i+1)
plt.title(str(var[i])+ ' in Iris species')
sns.violinplot(x='species',y=var[i],data=iris)
plt.show()
Violinplot用Kernel Density Estimate去更好地描述了quantitative變量的分佈。
與此同時,也能夠組合Swarmplot和Boxplot或Violinplot去描述Quantitative變量。用鳶尾花數據集展現以下:
context= ['notebook','paper','talk','poster']
axes_style = ['ticks','white','whitegrid', 'dark']
plt.figure(1,figsize=(12,12))for i in range(4): with
sns.axes_style(axes_style[i]):#設置axes_style sns.set_context(context[i])#設置context
plt.subplot(2,2,i+1)
plt.title(str(var[i])+ ' in Iris species')
sns.swarmplot(x='species', y=var[i], data=iris, color="w", alpha=.5)
sns.violinplot(x='species', y=var[i], data=iris, inner=None) if i%2 ==0 \ else sns.boxplot(x='species', y=var[i], data=iris) # 分別用swarmplot+violinplot 和swarmplot + boxplot
plt.show()
Barplot主要是展示在分類中的Quantitative變量的平均值狀況,而且用了Boostrapping算法計算了估計值的置信區間和Error bar.用鳶尾花數據集。
plt.figure(1,figsize=(12,12))for i in range(4): with sns.axes_style(axes_style[i]):#設置axes_style
sns.set_context(context[i]) # 設置context style,默認爲notebook,除此以外還有paper,talk,poster plt.subplot(2,2,i+1)
plt.title(str(var[i])+ ' in Iris species') sns.barplot(x='species',y=var[i],data=iris)
plt.show()
若是想知道在每一個類別下面有多少個觀察值,用Countplot就能夠,至關因而作一個Observation Counts,用鳶尾花數據集展現以下:
plt.figure(figsize=(5,5)) sns.countplot(y="species", data=iris) # 設置y='species',將countplot水平放置
plt.title('Iris species count')
plt.show()
Pointplot至關因而對Barplot作了一個橫向延伸,一方面,用Point Estimate和Confidence Level去展現Barplot的內容;另外一方面,當每個主類別下面有更細分的Sub-Category的時候,Pointplot能夠便於觀察不一樣Sub-Category在各主類別之間的聯繫。展現以下:
plt.figure(1,figsize=(12,12))for i in range(4): with sns.axes_style(axes_style[i]):#設置axes_style
sns.set_context(context[i]) # 設置context style,默認爲notebook,除此以外還有paper,talk,poster plt.subplot(2,2,i+1)
plt.title(str(var[i])+ ' in Iris species') sns.pointplot(x='species',y=var[i],data=iris)
plt.show()
Factorplot能夠說是Seaborn作Category Visualization的精髓,前面講的這些Plot均可以說是Factorplot的具體展現。咱們能夠用PariGrid去實現對多個類別的數值特徵用同一種Plot作可視化。
sns.set(style="ticks") g = sns.PairGrid(iris, x_vars = ['sepal_length','sepal_width','petal_length','petal_width'], y_vars = 'species', aspect=0.75,size=4) # 設置間距和圖片大小 g.map(sns.violinplot,palette='pastel')
plt.show()
在這個數據集中,Quantitative的變量主要有房屋的面積Area,每平米單價Price,以及房屋總價Tprice。
科賽網(kesci.com)是聚合數據人才和行業問題的在線社區,重點打造的K-Lab在線數據分析協做平臺,爲數據工做者的學習與工做帶來全新的體驗。