參考資料:活用pandas庫
# 導入庫
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
tips=pd.read_csv(r"...\seaborn常用數據案例\tips.csv")
print(tips.head())
1、成對關系表示
? ? ? ? 當數據大部分是數據時,可以使用pairplot函數把所有成對關系描繪出來,該函數會為每對變量繪制散點圖,并且為單變量數據繪制直方圖。
fig=sns.pairplot(tips)
? ? ? ? pairplot的一個缺點就是存在冗余信息,即圖的上半部分和下半部分相同。可以使用pairgrid手動指定圖的上半部分和下半部分。如下:
pair_grid=sns.PairGrid(tips)
# 可以使用plt.scatter代替sns.regplot
pair_grid=pair_grid.map_upper(sns.regplot)
pair_grid=pair_grid.map_lower(sns.kdeplot)
pair_grid=pair_grid.map_diag(sns.histplot,kde=True)
2、多變量數據的可視化
(1)顏色
? ? ? ? 使用violinplot函數是,可以通過hue參數按性別(sex)給圖著色。可以為“小提琴”的左右兩半著不同顏色,用于區分性別,以此減少冗余信息。
fig,ax=plt.subplots()
ax=sns.violinplot(x='time',y='total_bill',hue='sex',data=tips,split=True)
? ? ? ? 其他繪圖函數也存在hue參數,如lmplot函數,pairplot函數。
sns.lmplot(x='total_bill',y='tip',data=tips,hue='sex',fit_reg=False)
sns.pairplot(tips,hue='sex')
(2)大小和形狀
? ? ? ? 我們還可以通過點的大小表示更多的信息,但應該謹慎使用該方法,因為人眼不太擅長區分點的大小。
sns.lmplot(x='total_bill',y='tip',data=tips,fit_reg=False,scatter_kws={'s':tips['size']*10})
? ? ? ? 另外,在處理多個變量時,有時綜合運用不同元素顯示信息會非常有用。下例中,運用了顏色和形狀區分變量sex的值。
sns.lmplot(x='total_bill',y='tip',data=tips,fit_reg=False,hue='sex',markers=['o','x'])
(3)分面
? ? ? ? 如果想顯示更多變量,或者確定了要實現的可視化圖,但向基于一個分類變量畫出多幅圖,可以使用分面(facet)來滿足這些需求。要使用分面,數據必須是“整潔數據”:數據中的每一行都表示一個觀測值,每一列是一個變量(也是“長數據”)。
? ? ? ? 如下圖所示在lmplot創建這個可視化,需要將另外兩個參數col和col_wrap傳遞到seaborn中的散點圖中。col參數用于指定分面變量,col_wrap參數用于指定圖的每行包含的具體列數。如果不適用col_wrap參數,所有圖將會在同一行中。
# 導入數據
anscombe=pd.read_csv(r"...\seaborn常用數據案例\anscombe.csv")
# 查看數據
anscombe.sample(10)
# 可視化分面
sns.lmplot(x='x',y='y',data=anscombe,fit_reg=False,col='dataset',col_wrap=2)
? ? ? ? 我們知道lmplot是圖級(figure-level)函數,而在seaborn中,許多圖使用軸域級(axes-level)函數創建的。這意味著并不是每個繪圖函數都有分面參數col和col_wrap。為此必須先創建FacetGrid,它知道要在哪個變量上進行分面,然后為每個分面提供單獨的繪圖代碼。如下:
# 創建FacetGrid
facet=sns.FacetGrid(tips,col='time')
# 針對每個用餐時段,繪制總消費額的直方圖
facet.map(sns.histplot,'total_bill',kde=True)
? ? ? ? 各個分面不限于單變量圖,如下:
facet=sns.FacetGrid(tips,col='day',col_wrap=2,hue='sex')
facet=facet.map(plt.scatter,'total_bill','tip')
facet.add_legend()
? ? ? ? 對于分面,還可以讓一個變量在x軸上分面,另一個變量在y軸上分面,可以通過傳遞row參數來實現,如下:
facet=sns.FacetGrid(tips,col='time',row='smoker',hue='sex')
facet.map(plt.scatter,'total_bill','tip')