import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
iris = sns.load_dataset('iris', data_home='.')
iris.head(2)
1 一圖多繪¶
一圖多繪是指在同一個坐標系繪制多個圖表,這種方法原理是因為每個軸級繪圖方法返回值都是AxesSubplot類實例,且每個軸級繪圖方法都有ax參數可以接收一個AxesSubplot類實例進行指定坐標繪圖:
axesSub = sns.boxplot(x='species', y='sepal_length', data=iris)
axesSub = sns.stripplot(x='species', y='sepal_length', data=iris, ax=axesSub) # ax=axesSub,指定坐標性, 在之前箱型圖基礎上,繼續繪制條帶圖
axesSub = sns.lineplot(x='species', y='sepal_length', data=iris, ax=axesSub) # ax=axesSub,指定坐標性, 在之前箱型圖基礎上,繼續繪制折線圖
2 ax:指定子圖坐標系¶
這個方法在此前介紹各繪圖方法時,也有介紹並多次使用過,那就是各軸級繪圖方法的ax參數傳遞坐標系,這種方法配合matplotlib的subplots()方法,是我認為最靈活,可定制化程度最高的一種多子圖繪圖方法,可以實現每一個子圖都繪制不同種類的圖表:
fig, ax =plt.subplots(1,3,constrained_layout=True, figsize=(12, 3))
axesSub = sns.boxplot(x="species", y="sepal_length", data=iris, ax=ax[0])
axesSub.set_title('boxplot')
axesSub = sns.stripplot(x="species", y="sepal_length", data=iris, ax=ax[1])
axesSub.set_title('stripplot')
axesSub = sns.histplot(x="sepal_length", data=iris, ax=ax[2])
_ = axesSub.set_title('histplot')
3 PairGrid:成對關系網格子圖¶
PairGrid用於繪制數據集中成對關系的子圖網格。此類將數據集中的每個變量映射到多個軸的網格中的列和行。可以使用不同的軸級繪圖函數來繪制上三角和下三角的雙變量圖,並且對角線上可以顯示每個變量的邊際分布。它還可以通過hue參數用不同顏色繪制不同的數據子集來表示附加級別的條件化。這使用顏色來解析第三維的元素,但只是在彼此之上繪制子集,並且不會像接受hue的軸級函數那樣為特定可視化定制hue參數。
- hue:將繪圖的不同面映射為不同的顏色
- hue_order:字符串組成的list,設置hue后設置各顏色順序
- hue_kws:要插入到繪圖調用中的其他關鍵字參數,以使其他繪圖屬性在色調變量的不同級別(例如散點圖中的標記)之間變化。例如按顏色使用不同標記,hue_kws={"marker": ["o", "s", "D"]}
- palette:調色板
- vars: 同時指定x軸、y軸繪圖字段,否則使用所有數值型字段
- x_vars:指定x軸繪圖字段
- y_vars:指定y軸繪圖字段
- height標量,可選,每個刻面的高度(以英寸為單位)
- aspect:標量,可選,aspect 和 height 的乘積得出每個刻面的寬度(以英寸為單位)
- despine:布爾值,可選,從圖中移除頂部和右側外邊框。
- dropna:布爾值,可選,在繪圖之前刪除數據中的缺失值。
3.1 map方法:指定繪圖方法¶
PairGrid所有參數中,只有data是必傳參數,實例化時,seaborn會根據傳入數據集的各個字段情況,繪制n行n列個坐標系,但僅限於繪制坐標系,坐標系中並未有任何圖像,后續需通過調用map方法指定繪圖方法后才會完成繪圖。注意,在map方法文檔中明確說明,此方法的作用是用同一方法在所有子圖進行繪圖,所以PairGird類繪圖的所有子圖,都是同類圖表。
PairGrid類實例化時,只傳遞data參數,則繪制所有字段的子圖,繼續通過map方法傳遞sns.scatterplot作為繪圖方法繪制散點圖,當然,也可以傳入其他繪圖方法,繪制其他圖形。在對角線上的圖形,由於x軸和y軸都是同一字段,所以圖形呈45度角直線,但並無實際意義。
g=sns.PairGrid(iris)
g=g.map(sns.scatterplot)
3.2 hue:根據指定字段繪制不同顏色圖形¶
在實例化PairGrid類時,通過指定hue參數,可以根據字段繪制不同顏色圖像,不過注意,默認情況下是沒有圖例的,后續需要調用add_legend()添加圖例:
g=sns.PairGrid(iris, hue="species")
g=g.map(sns.scatterplot)
g = g.add_legend() # 手動添加圖例
3.3 vars:指定字段繪圖¶
g = sns.PairGrid(iris, vars=["sepal_length", "sepal_width"])
g = g.map(sns.scatterplot)
3.3 height:指定子圖高度¶
g = sns.PairGrid(iris, vars=["sepal_length", "sepal_width"],height=1.5)
g = g.map(sns.scatterplot)
3.4 g.map_diag()和g.map_offdiag():指定對角線和非對角線的繪圖方法¶
g.map_diag()和g.map_offdiag()是與g.map類似的方法,區別在於g.map_diag()用於指定對角線上子圖繪圖方法,g.map_offdiag()用於指定非對角線上繪圖方法,而g.map一次性指定所有子圖繪圖方法。
例如,非對角線繪制散點圖,對角線上繪制直方圖,可以這么做:
g = sns.PairGrid(iris)
g.map_offdiag(sns.scatterplot) #指定非對角線繪圖類型為散點圖
g.map_diag(sns.histplot) #指定對角線繪圖類型為直方圖
無論是g.map,還是g.map_offdiag和g.map_diag,都可以傳遞指定的繪圖方法本身的參數,對圖形進行設置:
g = sns.PairGrid(iris)
g.map_offdiag(sns.scatterplot) #指定非對角線繪圖類型為散點圖
g.map_diag(sns.histplot, color='red', element="step") #指定對角線繪圖類型為直方圖
3.5 g.map_upper和g.map_lower:指定上三角和下三角的繪圖方法¶
g = sns.PairGrid(iris, hue="species")
g.map_diag(sns.histplot) #指定對角線繪制直方圖
g = g.map_upper(sns.scatterplot) # 指定上三角繪制散點圖
g = g.map_lower(sns.kdeplot) # 指定下三角繪制核密度圖
4 FacetGrid:多面網格子圖¶
FacetGrid通過row, col, hue三個參數,最多從三個維度對數據進行分組,然后通過map方法指定繪圖方法和x軸,y軸字段進行繪圖,主要參數如下:
- row, col, hue:定義數據子集的變量,這些數據將繪制在網格中的不同面上。row(行)縱向,col(列)橫向,hue:顏色
- col_wrap:每行最多顯示子圖個數
- height標量,可選,每個刻面的高度(以英寸為單位)
- aspect:標量,可選,aspect 和 height 的乘積得出每個刻面的寬度(以英寸為單位)
- despine:布爾值,可選,從圖中移除頂部和右側外邊框。
- dropna:布爾值,可選,在繪圖之前刪除數據中的缺失值。
- palette:顏色面板
- row_order:字段顯示順序
- col_order:字段顯示順序
- hue_order:字段顯示順序
- hue_kws:要插入到繪圖調用中的其他關鍵字參數,以使其他繪圖屬性在色調變量的不同級別(例如散點圖中的標記)之間變化。例如按顏色使用不同標記,hue_kws={"marker": ["o", "s", "D"]}
tips = sns.load_dataset('tips')
tips.head(2)
4.1 col, row, hue:分組統計字段¶
g = sns.FacetGrid(tips, col="time", row="sex")
g.map(sns.histplot, "total_bill")
g = sns.FacetGrid(tips, col="time", row="sex")
g.map(sns.scatterplot, "total_bill", "tip")
col="time", row="sex"僅表示分組統計的字段,左上角圖表示按time、sex兩個字段進行分組統計后,sex值為Male,time值為Launch的這一部分數據,以total_bill為x軸數據,以tip為y軸數據進行繪圖。當然,可以只指定col或row,還可以添加hue。當使用了hue之后,建議通過add_legend()方法添加圖例:
g = sns.FacetGrid(tips, col="sex", hue="smoker")
g.map(sns.scatterplot, "total_bill", "tip")
g = g.add_legend()
4.2 col_wrap:每行最多顯示子圖個數¶
g = sns.FacetGrid(tips, col="size", hue="smoker", col_wrap=4) # 每行最多顯示4個子圖,所以分兩行顯示了,第二行2個子圖
g.map(sns.scatterplot, "total_bill", "tip")
g = g.add_legend()
4.3 height, aspect:指定子圖高度、寬高比¶
g = sns.FacetGrid(tips, col="day", height=2.5, aspect=1.5)
g.map(sns.histplot, "total_bill")
4.4 g.refline:添加輔助線¶
g = sns.FacetGrid(tips, col="time", margin_titles=True)
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.refline(y=tips["tip"].median())
4.5 添加文本說明¶
def annotate(data, **kws):
n = len(data)
ax = plt.gca()
ax.text(.1, .6, f"N = {n}", transform=ax.transAxes)
g = sns.FacetGrid(tips, col="time")
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.map_dataframe(annotate)