當探索具有中等數量(不多不少的意思……)維度的數據集時,一個很好的方式是基於不同的子數據集構建不同的實例,並將它們以網格的方式組織在一張圖之中。這種技術有時被稱為「lattice」或「trellis」(大概是格子圖、網格圖),這跟「small multiples」的概念類似(多張更小的子圖)。它能幫助我們快速從複雜的數據中提取大量信息。matplotlib
對於創建帶有多個坐標軸(每個坐標軸體系意味著一張子圖)的圖形有著良好的支持,seaborn
基於這些來直接地將圖形的排布結構與數據集的結構聯結起來。
要利用這些特性,我們的數據集應該保存在一個pandas DataFrame
中,並且應該是Hadley Whickam口中的「tidy data」格式。簡短來說,就是我們的dataframe
對象中,每一行是一個觀測樣本,每一列是一個變數。
對於一些更高級的應用來說,我們可以直接使用這篇教程中討論的一些對象來獲得最大的靈活性。一些seaborn
函數(如lmplot()/catplot()/pairplot()
)也隱式地使用了這些對象。很多seaborn
函數是坐標軸級別的,它們僅僅針對某個特定的matplotlib Axes
來繪圖,而不會修改圖形的屬性;而在這篇教程中即將討論到的這些方法是更高級別的函數,在被調用時,它們會創建一個新的圖形,而且一般情況下對於創建過程更加嚴格。在某些案例中,這些函數和他們依賴的類所需要輸入的參數依賴於不同的介面屬性,比如在lmplot()
中我們通過設置高度和寬高比(height
和aspect
)來控制每個子圖(facet)的大小,而非直接指定整個圖形的大小。這些函數在調用後都會返回這個圖形對象,而且大多數對象都提供了非常方便的方法來改變繪圖的方式,這些方法往往更加抽象和簡單。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="ticks")
一、條件式多圖
當我們想要基於不同的數據子集來展示某個變數的分布或者多個變數之間的關係時,FacetGrid
類會提供很大的幫助。一個FacetGrid
圖可以從三個維度來構建:row
、col
和hue
。前兩個與它返回的坐標軸數組有著之間的關聯;我們可以把hue
變數理解為第三個維度,就像長、寬和高一樣,只不過在這裡我們是用不同的顏色來體現它的。
在使用FacetGrid
時,我們會通過一個pandas DataFrame
以及控制圖形網格的行、列和顏色的變數名稱來初始化一個對象。這些維度變數(控制行、列和顏色的變數)應該是分類變數或者離散變數,然後這些變數的不同水平組合起來就構成了整個圖形的每一個子圖(facet
,在這裡可以理解為我們維度拆解的最小粒度)。比如說我們想要檢驗一下tips
數據集中午餐和晚餐的差異。
另外,relplot()/catplot()/lmplot()
內置了FacetGrid
對象,繪圖完成後他們都會返回這個對象,這樣我們就可以進行更多的調整。
tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="time")
TAG:Python | 可視化 | 數據可視化 |