seaborn 數據可視化(二)帶有類別屬性的數據可視化

 

 

 

Seaborn的分類圖分爲三類,將分類變量每一個級別的每一個觀察結果顯示出來,顯示每一個觀察分佈的抽象表示,以及應用統計估計顯示的權重趨勢和置信區間:html

  • 第一個包括函數swarmplot()和stripplot()
  • 第二個包括函數boxplot()和violinplot()
  • 第三個包括函數barplot()和pointplt()

導入所須要的庫:算法

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='darkgrid',color_codes=True)
import pandas as pd
import matplotlib as mpl

導入所須要的數據:數組

iris=sns.load_dataset('iris')
tips=sns.load_dataset('tips')
titanic=sns.load_dataset('titanic')

tips.head()

一.Other變量&類別變量(striplot和searmplot)

  當咱們的數據中有兩個變量,其中包含一個類別變量.另一個能夠是類別,也能夠是其餘的變量,這個時候咱們經常會用stripplot()函數來繪製兩者的關係.app

  常見於用來分析label爲連續型變量(迴歸問題中的label),而咱們特徵中出現了分類l數據.dom

  而針對這些問題,在seaborn中最經常使用的函數有striplot和searmplot函數.函數

sns.stripplot(x='day',y='total_bill',data=tips)  #

 

   可是咱們很快便發現一個較爲嚴重的問題,就是這樣沒法很好體現咱們label在某個點的分佈狀況,可能一個點附近有大量的點,但上面那個圖咱們倒是很難發現的(覆蓋太嚴重),爲了解決這個問題,咱們採用random jitter,將同一個地方的點隨機的分開,由於是隨機的,因此每次運行都會不同,具體的結果以下所示,這樣咱們就很容易的看到分類變量對於label的影響.工具

sns.stripplot(x='day',y='total_bill',data=tips,jitter=True)

 

雖然stripplot的jitter = True在必定程度上緩解了該問題,可是還有一個更好的函數swarmplot,該函數利用一種特定算法使得咱們的能更好的看到數據的分佈狀況.編碼

函數swarmplot(),它使用避免重疊點的算法將分類軸上的每一個散點圖點定位spa

sns.swarmplot(x='day',y='total_bill',data=tips)

還能夠傳入hue參數添加多個嵌套的分類變量。高於分類軸上的顏色和位置時冗餘的,如今每一個都提供有兩個變量之一的信息:設計

sns.swarmplot(x='day',y='total_bill',hue='sex',data=tips)

使用這些圖,將分類變量放在垂直軸上是很是有用的(當類別名稱相對較長或有不少類別時,這一點特別有用)。 您可使用orient關鍵字強制定向,但一般能夠從傳遞給x和/或y的變量的數據類型推斷繪圖方向:

sns.swarmplot(x='total_bill',y='day',hue='sex',data=tips)

 

 

Stripplot VS Swarmplot

① swarmplot的優點在當咱們的兩個變量都是分類變量的時候更加明顯.具體的參考下圖便可.

② swarmplot的缺點則是很是耗時,當數據量很是大的時候並不適用.

sns.stripplot(x='size',y='size',data=tips,jitter=True,ax=ax1)
sns.swarmplot(x='size',y='size',data=tips,ax=ax2)
plt.show()

 

 

二.類別特徵對應的特徵分佈(boxplot和violinplot)

  在某種程度上,類別型數據的可視化可能會沒法反應某類中信息的一個分佈狀況,例如上面的day和total_bill的狀況,在不少狀況下較難看出究竟哪一天total_bill的好一點,尤爲在兩個類別中total都相近的時候(Sta,Sun),那此時咱們就須要另一些更好的可視化工具來幫助咱們完成這些任務.

  而針對這些問題,在seaborn中最多見的函數有Boxplots和Violinplot函數.

sns.boxplot(x='day',y='total_bill',data=tips)

注意: 由於hue是和x,y變量嵌套的,當咱們使用hue變量的時候,它會被分割出來併產生"位移",也就是咱們看到的下面的一條線被分割成爲多條線的狀況. 有時爲了防止位移,咱們能夠設置dodge=False能夠抵消位移.

具體實例:

sns.boxplot(x="day", y="total_bill", hue="size", data=tips, dodge=False);

sns.boxplot(x="day", y="total_bill", hue="size", data=tips);

  如上圖所示,選擇將dodge設置爲False,每一個變量都沒有位移,即每一個分類x軸對應的y都只有一個類型,那麼此時的位移反而會使得咱們的圖變得很難看.

tips["weekend"] = tips["day"].isin(["Sat", "Sun"])
sns.boxplot(x="day", y="total_bill", hue="weekend", data=tips, dodge=False);

Violinplot(提琴圖)

violinplot(),它結合了箱體圖和分佈教程中描述的核心密度估計過程.

sns.violinplot(x="day", y="total_bill", hue="time", split=True, data=tips);

將swarmplot()或者swarmplot()與violinplot()或boxplot()結合使用能夠顯示每一個觀察結果以及分佈的摘要:

sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5);

三.類別特徵的統計信息

  上面的幾種關於分類l特徵的可視化技術主要用以觀察數據的分佈的狀況,可是卻總感受缺了一些東西,到底是什麼呢?做爲作過一些數據分析的咱們很容易就明白,咱們不能僅僅只看數據的一個外在的表現,咱們須要一些工具將它的一些內在信息(主要是統計信息)反應出來,例如某類數據的總的個數,均值等狀況.

此處主要介紹barplot(條形圖)、countplot與piontplot(點圖)

3.1. barplot(條形圖)

 barplot須要注意的是縱軸y默認的是計算的對應cate的均值

sns.barplot(x="sex", y="survived", data=titanic);

sns.barplot(x='sex',y='survived',hue='class',data=titanic)

3.2 countplot(計數圖)

  barplot會默認將縱軸計算爲均值,這在二分類的時候很是有幫助,由於均值就是爲1的機率,可是是否是具備統計意義,咱們不能只看機率還得看個數,這個時候咱們就得用到countplot函數了,coutplot函數不能同時使用x,y因此若是想要統計某個cate變量對應的變量的個數最好用hue進行分開.例子以下:

sns.countplot(hue='sex',x='survived',data=titanic)

sns.countplot(hue='sex',x='survived',data=titanic,palette='Greens_d')

3.3. Pointplot

  pointplot()函數提供了可視化相同信息的另外一種風格。該函數還對另外一軸的高度估計值進行編碼,而不是顯示一個完整的柱型,它只繪製點估計和置信區間。另外,這個函數和Barplot很類似,y特徵都是計算對應的機率,不一樣的是該函數更加豐富,它還會對相同的hue特徵進行鏈接,獲得特徵的變化曲線.

 

sns.pointplot(x="sex", y="survived", hue="class", data=titanic);

爲了使可以在黑白中重現的圖形,可使用不一樣的標記和線條樣式來展現不一樣hue類別的層次:

 

sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
              palette={"male": "g", "female": "m"},
              markers=["^", "o"], linestyles=["-", "--"]);

sns.pointplot(x="sex", y="survived", hue="class", data=titanic,
              palette={"First": "g", "Second": "m", "Third":'b'},
              markers=["^", "o","+"], linestyles=["-", "--",""]);

 

繪製「寬格式」數據

  雖然使用「長格式」或「整潔」數據是優選的,可是這些功能也能夠應用於各類格式的「寬格式」數據,包括pandas DataFrame或二維numpy數組陣列。這些對象應該直接傳遞給數據參數:

sns.boxplot(data=iris,orient="h");

 

 此外,這些函數接受Pandas或numpy對象的向量,而不是DataFrame中的變量

sns.violinplot(x=iris.species, y=iris.sepal_length);

爲了控制由上述功能製做的圖形的大小和形狀,您必須使用matplotlib命令本身設置圖形。 固然,這也意味着這些圖塊能夠和其餘種類的圖塊一塊兒在一個多面板的繪製中共存:

f, ax = plt.subplots(figsize=(7, 3))
sns.countplot(y="deck", data=titanic, color="c");

 

 四. 繪製多層面板分類圖

  此處咱們介紹兩個更加高級的方法.這些方法將上面的方法集中在一塊兒,但是隨時調用.上述的方法能夠經過kind = ""進行隨時的切換.

 

sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips);

若是咱們但願barplot的形式的話,將kind設置爲bar便可.爲了對比,此處咱們也繪製barplot的形式,是否是發現和barplot同樣的結果.

sns.factorplot(x="day", y="total_bill", hue="smoker", kind = 'bar', data=tips);

 

sns.barplot(x="day", y="total_bill", hue="smoker", data=tips)

使用factorplot()的主要優勢是很容易調用"facet"展開更多其餘分類變量:

sns.factorplot(x="day", y="total_bill", hue="smoker",
               col="time", data=tips, kind="swarm");

sns.factorplot(x="time", y="total_bill", hue="smoker", col="day", data=tips, kind="box", size=4, aspect=.5);

 

 任何一種圖形均可以畫出來。基於FacetGrid的工做原理,要更改圖形的大小和形狀,須要指定適用於每一個方面的size和aspect參數:

sns.factorplot(x="time", y="total_bill", hue="smoker",
               col="day", data=tips, kind="box", size=4, aspect=.5);

 

  重要的是要注意,你也能夠直接使用boxplot()和FacetGrid來製做這個圖。可是,必須特別注意確保分類變量的順序在每一個方面實施,方法是使用具備Categorical數據類型的數據或經過命令和hue_order。

  

sns.factorplot(x="time", y="total_bill", hue="smoker",hue_order=["No","Yes"]
               ,col="day", data=tips, kind="box", size=4, aspect=.5,
              palette="Set3");

g = sns.PairGrid(tips,
                 x_vars=["smoker", "time", "sex"],
                 y_vars=["total_bill", "tip"],
                 aspect=.75, size=3.5)
g.map(sns.violinplot, palette="pastel");
plt.show()

g = sns.PairGrid(tips,x_vars=["smoker", "time", "sex"],y_vars=["total_bill", "tip"],aspect=.75, size=3.5)
g.map(sns.barplot, palette="pastel");
plt.show()

 

 五. 總結 

  本文介紹了一些用於查看categorical變量與其餘變量(通常是label)之間關係的一些可視化技巧,其中主要涉及的包有:

  • 查看cate變量與一些其餘變量(連續或者cate):Stripplot,Swarmplot(通常是cate對應變量出現overlap比較嚴重的時候使用)
  • 查看cate變量對應的其餘變量分佈:Boxplot,Violinplot
  • 查看cate變量對應變量(含一些統計特徵):Barplot,Countplot,Pointplot
  • 集成的函數:Factorplot和PairGrid.

 

seaborn.factorplot函數的全部參數說明,方便參考:

seaborn.factorplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=<function mean>, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind='point', size=4, aspect=1, orient=None, color=None, palette=None, legend=True, legend_out=True, sharex=True, sharey=True, margin_titles=False, facet_kws=None, **kwargs)

Parameters:

  • x,y,hue 數據集變量 變量名
  • date 數據集 數據集名
  • row,col 更多分類變量進行平鋪顯示 變量名
  • col_wrap 每行的最高平鋪數 整數
  • estimator 在每一個分類中進行矢量到標量的映射 矢量
  • ci 置信區間 浮點數或None
  • n_boot 計算置信區間時使用的引導迭代次數 整數
  • units 採樣單元的標識符,用於執行多級引導和重複測量設計 數據變量或向量數據
  • order, hue_order 對應排序列表 字符串列表
  • row_order, col_order 對應排序列表 字符串列表
  • kind : 可選:point 默認, bar 柱形圖, count 頻次, box 箱體, violin 提琴, strip 散點,swarm 分散點(具體圖形參考文章前部的分類介紹)
  • size 每一個面的高度(英寸) 標量
  • aspect 縱橫比 標量
  • orient 方向 "v"/"h"
  • color 顏色 matplotlib顏色
  • palette 調色板 seaborn顏色色板或字典
  • legend hue的信息面板 True/False
  • legend_out 是否擴展圖形,並將信息框繪製在中心右邊 True/False
  • share{x,y} 共享軸線 True/False
  • facet_kws FacetGrid的其餘參數 字典

參考:

[1] http://seaborn.pydata.org/tutorial/distributions.html 

[2] http://seaborn.pydata.org/tutorial/categorical.html 

[3] http://seaborn.pydata.org/tutorial/regression.html 

[4] https://zhuanlan.zhihu.com/p/27683042

[5] https://www.kesci.com/apps/home/project/59f687e1c5f3f511952baca0

相關文章
相關標籤/搜索