Seaborn 基於matplotlib且數據結構與pandas統一的統計製圖庫
功能:
- 計算多變量間關係的面向數據集接口
- 可視化類別變量的觀測與統計
- 可視化單變量或多變量分佈並與其子數據集比較
- 控制線性迴歸的不同因變量並進行參數估計與作圖
- 對複雜數據進行易行的整體結構可視化
- 對多表統計圖的製作高度抽象並簡化可視化過程
- 提供多個內建主題渲染matpotlib的圖像樣式
- 提供調色板工具生動再現數據
一般情況下跟matplotlib一起使用
目錄
使用light_palette() 和dark_palette()調用定製連續調色板
**********分佈數據集的可視化(---開始有丶用---)
核密度估計(KDE) Kernel density estimaton
**********藝術化的圖表控制
# seaborn 是第三方庫,需要pip安裝
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
# 生成一個含偏移的正弦圖像
def sinplot(flip=1):
x = np.linspace(0,14,100)
for i in range(1,7):
plt.plot(x,np.sin(x+i*.5)*(7-i)*flip)
# 直接使用matplotlib畫圖
sinplot()
使用seaborn控制畫圖樣式
# 以下全是默認參數,可以不填
sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif',
font_scale=1, color_codes=True, rc=None)
sinplot()
爲了控制樣式,使用axes_style()和set_style()函數。爲了擴展繪圖,請使用plotting_context()和set_context()函數。在這兩種情況下,第一個函數返回一個參數字典,第二個函數則設置matplotlib默認屬性。
控制樣式
# context:
#darkgrid 黑色網格(默認)
#whitegrid 白色網格
#dark 黑色背景
#white 白色背景
#ticks 應該是四周有刻度線的白背景
# 控制樣式
sns.axes_style() # 返回set_style函數的參數字典,如果需要傳給set_index函數,所有的參數以字典的形式傳給rc參數
sns.set_style() # 設置matplotlib默認屬性
sns.set_style("whitegrid")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data)
# 修改底色
sns.set_style("dark")
sinplot()
f, ax = plt.subplots()
sns.violinplot(data=data)
# offset 兩座標軸離開距離;
sns.despine(offset=10, trim=True)
# despine 管理邊框
# despine(fig=None, ax=None, top=True, right=True, left=False, bottom=False, offset=None,trim=False)
sns.set_style("whitegrid")
sns.boxplot(data=data, palette="deep")
sns.despine(left=True) # 刪除左邊邊框
st = sns.axes_style("darkgrid")
# 設置臨時圖形樣式(只對with塊內的繪圖函數起作用)
with sns.axes_style("darkgrid"):
plt.subplot(211)
sinplot()
plt.subplot(212)
sinplot(-1)
# 重置圖形樣式
sns.set()
擴展繪圖
# 拓展繪圖
sns.plotting_context() # 返回一個參數字典,設置字體、線條
sns.set_context() # 設置參數
# 設置線條粗細
# 按相對尺寸的順序(線條越來越粗),分別是paper,notebook, talk, and poster
sns.set_context("paper")
plt.figure(figsize=(8,6))
sinplot()
# default 默認設置
sns.set_context("notebook")
plt.figure(figsize=(8,6))
sinplot()
**********斑駁陸離的調色板
最重要的直接設置調色板的函數就是color_palette()。color_palette()允許任意的seaborn調色板或matplotlib的顏色映射(除了jet,你應該完全不使用它)。它還可以使用任何有效的matplotlib格式指定的顏色列表(RGB元組、十六進制顏色代碼或HTML顏色名稱)。返回值總是一個RGB元組的列表。
直接調用沒有傳入參數的color_palette()將返回默認的顏色循環。
對應的函數set_palette()接受相同的參數,併爲所有圖設置默認的顏色循環。你也可以在with塊中使用color_palette()來實現臨時的更改調色板配置。
分類色板
分類色板(定性)是在區分沒有固定順序的數據時最好的選擇。
在導入seaborn庫後,默認的顏色循環被更改爲一組六種顏色(最新版本已經更新爲10種)。
# 默認顏色循環
current_palette = sns.color_palette()
sns.palplot(current_palette)
對應的RGB元組:
(0.2980392156862745, 0.4470588235294118, 0.6901960784313725)
(0.8666666666666667, 0.5176470588235295, 0.3215686274509804)
(0.3333333333333333, 0.6588235294117647, 0.40784313725490196)
(0.7686274509803922, 0.3058823529411765, 0.3215686274509804)
(0.5058823529411764, 0.4470588235294118, 0.7019607843137254)
(0.5764705882352941, 0.47058823529411764, 0.3764705882352941)
(0.8549019607843137, 0.5450980392156862, 0.7647058823529411)
(0.5490196078431373, 0.5490196078431373, 0.5490196078431373)
(0.8, 0.7254901960784313, 0.4549019607843137)
(0.39215686274509803, 0.7098039215686275, 0.803921568627451)
默認顏色主題共有六種不同的變化分別是:deep, muted, pastel, bright, dark, 和 colorblind。類似下面的方式直接傳入即可。
current_palette = sns.color_palette("colorblind") # 直接傳入對應的參數即可變化
sns.palplot(current_palette)
使用圓形顏色系統
當你有六個以上的分類要區分時,最簡單的方法就是在一個圓形的顏色空間中畫出均勻間隔的顏色(這樣的色調會保持亮度和飽和度不變)。這是大多數的當他們需要使用比當前默認顏色循環中設置的顏色更多時的默認方案。
最常用的方法是使用hls的顏色空間,這是RGB值的一個簡單轉換。
sns.palplot(sns.color_palette("hls", 8))
當然,也可以使用hls_palette()函數來控制顏色的亮度和飽和。
sns.palplot(sns.hls_palette(8, l=.3, s=.8))
# l-亮度 lightness / s-飽和 saturation
由於人類視覺系統的工作方式,會導致在RGB度量上強度一致的顏色在視覺中並不平衡。比如,我們黃色和綠色是相對較亮的顏色,而藍色則相對較暗,使得這可能會成爲與hls系統一致的一個問題。
爲了解決這一問題,seaborn爲husl系統提供了一個接口,這也使得選擇均勻間隔的色彩變得更加容易,同時保持亮度和飽和度更加一致。
sns.palplot(sns.color_palette("husl", 8))
使用xkcd顏色來命名顏色
xkcd包含了一套衆包努力的針對隨機RGB色的命名。產生了954個可以隨時通過xdcd_rgb字典中調用的命名顏色。
plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3)
plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3)
連續色板
調色板中第二大類稱爲“順序”。這種顏色映射對應的是從相對低價值(無意義)數據到高價值(有意義)的數據範圍。雖然有時候你會需要一個連續的離散顏色調色板,用他們像kdeplot()或者corrplot()功能映射更加常見(以及可能類似的matplotlib功能)。
Color Brewer的字典中就有一組很好的調色板。它們是以在調色板中的主導顏色(或顏色)命名的。
sns.palplot(sns.color_palette("Blues"))
就像在matplotlib中一樣,如果您想要翻轉漸變,您可以在面板名稱中添加一個_r後綴。
sns.palplot(sns.color_palette("BuGn_r"))
seaborn還增加了一個允許創建沒有動態範圍的"dark"面板。如果你想按順序畫線或點,這可能是有用的,因爲顏色鮮豔的線可能很難區分。
類似的,這種暗處理的顏色,需要在面板名稱中添加一個_d後綴
sns.palplot(sns.color_palette("GnBu_d"))
cubehelix_palette()函數的連續調色板
cubehelix調色板系統具有線性增加或降低亮度和色調變化順序的調色板。這意味着在你的映射信息會在保存爲黑色和白色(爲印刷)時或被一個色盲的人瀏覽時可以得以保留。
Matplotlib擁有一個默認的內置cubehelix版本可供創建:
sns.palplot(sns.color_palette("cubehelix", 8))
seaborn爲cubehelix系統添加一個接口使得其可以在各種變化中都保持良好的亮度線性梯度。
通過seaborn的cubehelix_palette()函數返回的調色板與matplotlib默認值稍有所不同,它不會在色輪周圍旋轉或覆蓋更廣的強度範圍。seaborn還改變了排序使得更重要的值顯得更暗:
sns.palplot(sns.cubehelix_palette(8))
其他cubehelix_palette()的參數主要調整色板的視覺。兩個重要的選擇是:start(值的範圍爲0--3)和rot,還有rot的次數(-1--1之間的任意值)
sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))
也可以控制斷點的亮度和甚至對調結果順序
n_colors:調色板中的顏色數,int
start
:第一個色調,float,0 <= start <= 3
rot
:圍繞調色板範圍內的色相控制盤旋轉,float
gamma
:float 0 <= gamma,Gamma 係數用以強調較深 (Gamma < 1) 或較淺 (Gamma > 1) 的顏色
hue
:float, 0 <= hue <= 1,顏色的飽和度
dark
:float 0 <= dark <= 1,調色板中最暗顏色的強度
light
:float 0 <= light <= 1,調色板中最淺顏色的強度
reverse
:bool,如果爲 True 值,則調色板將從暗到亮。
as_cmap
:bool,如果爲 True 值,則返回 matplotlib colormap 而不是顏色列表。
返回值:palette or cmap
:seaborn 調色板或者 matplotlib colormap
sns.palplot(sns.cubehelix_palette(8, start=2, rot=0, dark=0, light=.95, reverse=True))
默認情況下只會得到一些與seaborn調色板相似的顏色的列表,也可以讓調色板返回一個可以用as_cmap=True傳入seaborn或matplotlib函數的顏色映射對象
使用light_palette() 和dark_palette()調用定製連續調色板
調用light_palette() 和dark_palette(),這與一個單一顏色和隨機種子產生的從亮到暗的飽和度的調色板相同。
sns.palplot(sns.light_palette("green"))
sns.palplot(sns.dark_palette("purple"))
這些調色板結果也可以顛倒
sns.palplot(sns.light_palette("navy", reverse=True))
也可以創建一個顏色映射對象取代顏色列表
pal = sns.dark_palette("palegreen", as_cmap=True)
sns.kdeplot(x, y, cmap=pal);
離散色板
調色板中的第三類被稱爲“離散”。用於可能無論大的低的值和大的高的值都非常重要的數據。數據中通常有一個定義良好的中點。例如,如果你正在繪製溫度變化從基線值,最好使用不同色圖顯示相對降低和相對增加面積的地區。
sns.palplot(sns.color_palette("BrBG", 7))
sns.palplot(sns.color_palette("RdBu_r", 7))
另一個在matplotlib中建立的明智的選擇是coolwarm面板。請注意,這個顏色映射在中間值和極端之間並沒有太大的對比
sns.palplot(sns.color_palette("coolwarm", 7))
用diverging_palette()使用定製離散色板
你也可以使用海運功能diverging_palette()爲離散的數據創建一個定製的顏色映射。(當然也有一個類似配套的互動工具:choose_diverging_palette())。該函數使用husl顏色系統的離散色板。你需隨意傳遞兩種顏色,並設定明度和飽和度的端點。函數將使用husl的端點值及由此產生的中間值進行均衡。
seaborn.diverging_palette(h_neg, h_pos, s=75, l=50, sep=10, n=6, center='light', as_cmap=False)
h_neg, h_pos
:float in [0, 359],圖的正負範圍的錨定色調
s
:[0, 100] 範圍內的浮點數,可選,圖的兩個範圍的錨定飽和度
l
:[0, 100] 範圍內的浮點數,可選,圖的兩個範圍的錨定亮度
n
:int,可選,調色板中的顏色數(如果爲not,返回一個colormap)
center
:{“light”, “dark”}, 可選,調色板中心爲亮或暗
as_cmap
:bool, 可選,如果爲 true,返回一個 matplotlib colormap 而不是一個顏色列表。
返回值:palette or cmap
:seaborn color palette or matplotlib colormap
sns.palplot(sns.diverging_palette(220, 20, n=7))
sns.palplot(sns.diverging_palette(145, 280, s=85, l=25, n=7))
用set_palette()更改色變的默認值
color_palette() 函數有一個名爲set_palette()的配套。它們之間的關係類似於在美學教程中涉及的aesthetics tutorial. set_palette()。set_palette()接受與color_palette()相同的參數,但是它會更改默認的matplotlib參數,以便成爲所有的調色板配置。
def sinplot(flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, 7):
plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
sns.set_palette("husl")
sinplot()
color_palette()函數也可以在一個with塊中使用,以達到臨時更改調色板的目的
with sns.color_palette("PuBuGn_d"):
sinplot()
簡單常用色彩總結:
- 分類:hls husl Paired Set1~Set3(色調不同)
- 連續:Blues[藍s,顏色+s] BuGn[藍綠] cubehelix(同色系漸變)
- 離散:BrBG[棕綠] RdBu[紅藍] coolwarm[冷暖](雙色對稱)
**********分佈數據集的可視化(---開始有丶用---)
用於檢查單變量和雙變量分佈的一些工具,用來了解變量是如何分佈的。從視覺上來看,seaborn的作圖效果比matplotlib好很多。
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
# 導入seaborn
import seaborn as sns
sns.set(color_codes=True)
# 設置隨機種子
np.random.seed(sum(map(ord, "distributions")))
單變量分佈
最方便的方式是快速查看單變量分佈無疑是使用distplot()函數。默認情況下,這將繪製一個直方圖,並擬合出核密度估計(KDE)。
x = np.random.normal(size=100)
sns.distplot(x)
直方圖
直方圖應當是非常熟悉的函數了,在matplotlib中就存在hist函數。直方圖通過在數據的範圍內切成數據片段,然後繪製每個數據片段中的觀察次數,來表示整體數據的分佈。
刪除密度曲線並添加了地毯圖,每個觀察點繪製一個小的垂直刻度。可以使用rugplot()函數來製作地毯圖,但它也可以在distplot()中使用:
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
該函數結合了matplotlib中的 hist
函數(自動計算一個默認的合適的bin大小)、seaborn的kdeplot()
和rugplot()
函數。它還可以擬合scipy.stats
分佈並在數據上繪製估計的PDF(概率分佈函數)。
a
:Series、1維數組或者列表。觀察數據,如果是具有name
屬性的Series對象,則該名稱將用於標記數據軸。
bins
:matplotlib hist()的參數,或None。可選參數。直方圖bins(柱)的數目,若填None,則默認使用Freedman-Diaconis規則指定柱的數目。
hist
:布爾值,可選參數。是否繪製(標準化)直方圖。
kde
:布爾值,可選參數。是否繪製高斯核密度估計圖。
rug
:布爾值,可選參數。是否在橫軸上繪製觀測值豎線。
fit
:隨機變量對象,可選參數。一個帶有fit方法的對象,返回一個元組,該元組可以傳遞給pdf方法一個位置參數,該位置參數遵循一個值的網格用於評估pdf(概率分佈函數)。
{hist, kde, rug, fit}_kws
:字典,可選參數。底層繪圖函數的關鍵字參數。
color
:matplotlib color,可選參數。可以繪製除了擬合曲線之外所有內容的顏色。
vertical
:布爾值,可選參數。如果爲True,則觀測值在y軸顯示(即把圖形順時針旋轉90°)。
norm_hist
:布爾值,可選參數。如果爲True,則直方圖的高度顯示密度而不是計數。如果繪製KDE圖或擬合密度,則默認爲True。
axlabel
:字符串,False或者None,可選參數。橫軸的名稱。如果爲None,將嘗試從a.name獲取它;如果爲False,則不設置標籤。
label
:字符串,可選參數。圖形相關組成部分的圖例標籤。
ax
:matplotlib axis,可選參數。若提供該參數,則在參數設定的軸上繪圖。
返回值:ax
:matplotlib Axes
sns.distplot(x, kde=False, rug=True)
將特定參數傳遞給基礎繪圖函數:
ax = sns.distplot(x, rug=True, rug_kws={"color": "g"},
kde_kws={"color": "k", "lw": 3, "label": "KDE"},
hist_kws={"histtype": "step", "linewidth": 3,
"alpha": 1, "color": "g"})
核密度估計(KDE) Kernel density estimaton
使用核密度估計和小的垂直線繪製分佈圖:
ax = sns.distplot(x, rug=True, hist=False)
使用直方圖和最大似然高斯分佈擬合繪製分佈圖:
from scipy.stats import norm
ax = sns.distplot(x, fit=norm, kde=False)
繪製KDE比繪製直方圖更有計算性。所發生的是,每一個觀察都被一個以這個值爲中心的正態( 高斯)曲線所取代。
x = np.random.normal(0, 1, size=30)
bandwidth = 1.06 * x.std() * x.size ** (-1 / 5.)
support = np.linspace(-4, 4, 200)
kernels = []
for x_i in x:
kernel = stats.norm(x_i, bandwidth).pdf(support)
kernels.append(kernel)
plt.plot(support, kernel, color="r")
sns.rugplot(x, color=".2", linewidth=3)
接下來,這些曲線可以用來計算支持網格中每個點的密度值。得到的曲線再用歸一化使得它下面的面積等於1:
density = np.sum(kernels, axis=0)
# 標準化
# from scipy import stats, integrate
density /= integrate.trapz(density, support)
plt.plot(support, density)
可以看到,如果我們在seaborn中使用kdeplot()函數,我們得到相同的曲線。 這個函數由distplot()使用,但是當您只想要密度估計時,它提供了一個更直接的界面,更容易訪問其他選項:
sns.kdeplot(x, shade=True)
擬合參數分佈
使用distplot()將參數分佈擬合到數據集,並可視化地評估其與觀察數據的對應關係:
x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma)
繪製雙變量分佈
在繪製兩個變量的雙變量分佈也是有用的。在seaborn中這樣做的最簡單的方法就是在jointplot()函數中創建一個多面板數字,顯示兩個變量之間的雙變量(或聯合)關係以及每個變量的單變量(或邊際)分佈和軸。
sns.jointplot(x=df['A'], y=df['B'], #設置xy軸,顯示columns名稱
data = df, #設置數據
color = 'b', #設置顏色
#s = 50, edgecolor = 'w', linewidth = 1,#設置散點大小、邊緣顏色及寬度(只針對scatter)
stat_func=sci.pearsonr,
kind = 'hex',#設置類型:'scatter','reg','resid','kde','hex'
space = 0.1, #設置散點圖和佈局圖的間距
size = 8, #圖表大小(自動調整爲正方形))
ratio = 5, #散點圖與佈局圖高度比,整型
# marginal_kws = dict(bins=15, rug =True) #設置柱狀圖箱數,是否設置rug
)
散點圖
mean, cov = [0, 1], [(1, .5), (.5, 1)]
# 根據實際情況生成一個多元正態分佈矩陣
# mean:mean是多維分佈的均值維度爲1
# cov:協方差矩陣,注意:協方差矩陣必須是對稱的且需爲半正定矩陣
# size:指定生成的正態分佈矩陣的維度(例:若size=(1, 1, 2),則輸出的矩陣的shape即形狀爲 1X1X2XN(N爲mean的長度))
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
sns.jointplot(df['x'], df['y'])
HexBin圖
直方圖的雙變量類似物被稱爲“hexbin”圖,因爲它顯示了落在六邊形倉內的觀測數。該圖適用於較大的數據集。通過matplotlib plt.hexbin函數和jointplot()中的樣式可以實現。 它最好使用白色背景:
x, y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"):
sns.jointplot(x=x, y=y, kind="hex", color="k")
核密度估計
使用上述內核密度估計程序可視化雙變量分佈也是可行的。在seaborn中,這種圖用等高線圖顯示,可以在jointplot()中作爲樣式傳入參數使用:
sns.jointplot(x="x", y="y", data=df, kind="kde")
還可以使用kdeplot()函數繪製二維核密度圖。這樣可以將這種繪圖繪製到一個特定的(可能已經存在的)matplotlib軸上,而jointplot()函數只能管理自己:
f, ax = plt.subplots(figsize=(6, 6))
sns.kdeplot(df.x, df.y, ax=ax)
sns.rugplot(df.x, color="g", ax=ax)
sns.rugplot(df.y, vertical=True, ax=ax)
jointplot()函數使用JointGrid來管理。爲了獲得更多的靈活性,您可能需要直接使用JointGrid繪製圖形。jointplot()在繪製後返回JointGrid對象,您可以使用它來添加更多圖層或調整可視化的其他方面:
g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")
g.plot_joint(plt.scatter, c="w", s=30, linewidth=1, marker="+")
g.ax_joint.collections[0].set_alpha(0)
g.set_axis_labels("$X$", "$Y$")
呈現數據集中成對的關係(可以用於單變量分析)
要在數據集中繪製多個成對雙變量分佈,可以使用pairplot()函數。這將創建一個軸的矩陣,並顯示DataFrame中每對列的關係。默認情況下,它也繪製每個變量在對角軸上的單變量:
iris = sns.load_dataset("iris")
sns.pairplot(iris)
對於jointplot()和JointGrid之間的關係,pairplot()函數是建立在一個PairGrid對象上的,可以直接使用它來獲得更大的靈活性:
g = sns.PairGrid(iris)
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6)
**********線性關係的可視化
許多數據集包含多個定量變量,分析的目的通常是將這些變量相互關聯起來。然而,使用統計模型來估計兩個噪聲觀測組之間的簡單關係可能是非常有幫助的。Seaborn的迴歸圖主要是爲了添加一個視覺指南,有助於在探索性數據分析期間強調數據集中的模式。 也就是說,Seaborn本身並不是統計分析的一攬子計劃。Seaborn的目標是通過可視化快速,輕鬆地探索數據集,使之變得與通過統計表格來探索數據集一樣重要。
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
# 導入seaborn
import seaborn as sns
sns.set(color_codes=True)
# 設置隨機種子
np.random.seed(sum(map(ord, "regression")))
# 加載數據集
tips = sns.load_dataset("tips")
繪製線性迴歸模型的函數
使用Seaborn中的兩個主要功能可視化通過迴歸確定的線性關係。這些函數regplot()和lmplot()是密切相關的,並且共享了大部分的核心功能。然而,瞭解他們不同的方式很重要,以便您可以快速爲特定工作選擇正確的工具。
在最簡單的調用中,兩個函數繪製了兩個變量x和y的散點圖,然後擬合迴歸模型y〜x並繪製了該迴歸線的結果迴歸線和95%置信區間:
sns.regplot(x="total_bill", y="tip", data=tips)
sns.lmplot(x="total_bill", y="tip", data=tips)
顯然,所得到的的圖的結果是相同的,除了圖形形狀略有些不同。
目前,已知的另一個主要區別是regplot()以各種格式接受x和y變量,包括numpy數組、Pandas的Series列或DataFrame對象的變量引用;不一樣的是,lmplot()將數據集作爲一個必需的參數,而x和y變量必須指定爲字符串。這種數據格式稱爲“長格式”或“整潔”數據。除了這種輸入靈活性,regplot()可以看做是擁有lmplot()特徵的子集。
注:上面的結果可以在regplot()函數中通過只傳入x和y繪出:sns.regplot(x=tips["total_bill"], y=tips["tip"]);而相應的sns.lmplot(x=tips["total_bill"], y=tips["tip"])這種寫法就會報錯,因爲數據集data是lmplot()的必傳參數。
當其中一個變量取值爲離散型的時候,可以擬合一個線性迴歸。然而,這種數據集生成的簡單散點圖通常不是最優的:
tips.head()
# total_bill tip sex smoker day time size big_tip
# 16.99 1.01 Female No Sun Dinner 2 False
# 10.34 1.66 Male No Sun Dinner 3 True
# 21.01 3.50 Male No Sun Dinner 3 True
# 23.68 3.31 Male No Sun Dinner 2 False
# 24.59 3.61 Female No Sun Dinner 4 False
sns.lmplot(data=tips,x="size",y="tip")
一個常用的方法是爲離散值添加一些隨機噪聲的“抖動”(jitter),使得這些值的分佈更加明晰。
值得注意的是,抖動僅適用於散點圖數據,且不會影響擬合的迴歸線本身
sns.lmplot(x="size", y="tip", data=tips, x_jitter=.05)
另一種選擇是在每個獨立的數據分組中對觀察結果進行摺疊,以繪製中心趨勢的估計以及置信區間:
sns.lmplot(x="size", y="tip", data=tips, x_estimator=np.mean)
不同類型的模型擬合
上面使用的簡單線性迴歸模型非常簡單,但是,它不適用於某些種類的數據集。
Anscombe數據集顯示了一些簡單線性迴歸提供了簡單目視檢查清楚顯示差異的關係估計的例子。 例如,在第一種情況下,線性迴歸是一個很好的模型:
anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'I'"),
ci=None, scatter_kws={"s": 80})
第二個數據集中的線性關係是一樣的,但是基本清楚地表明這不是一個好的模型:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
ci=None, scatter_kws={"s": 80});
在存在這些高階關係的情況下,lmplot()和regplot()可以擬合多項式迴歸模型來擬合數據集中的簡單類型的非線性趨勢:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
order=2, ci=None, scatter_kws={"s": 80})
除了正在研究的主要關係之外,“異常值”觀察還有一個不同的問題,它們由於某種原因而偏離了主要關係:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
ci=None, scatter_kws={"s": 80})
在有異常值的情況下,它可以使用不同的損失函數來減小相對較大的殘差,擬合一個健壯的迴歸模型,傳入robust=True:
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'III'"),
robust=True, ci=None, scatter_kws={"s": 80})
tips["big_tip"] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x="total_bill", y="big_tip", data=tips,
y_jitter=.03)
在這種情況下,解決方案是擬合邏輯(Logistic)迴歸,使得迴歸線顯示給定值x的y=1的估計概率:
sns.lmplot(x="total_bill", y="big_tip", data=tips,
logistic=True, y_jitter=.03)
邏輯迴歸估計比簡單迴歸計算密集程度(Robust迴歸也是如此),並且由於使用引導程序計算迴歸線周圍的置信區間,您可能希望將其關閉獲得更快的迭代速度(使用參數ci=None)。
一個完全不同的方法是使用一個lowess smoother擬合非參數迴歸。 這種方法具有最少的假設,儘管它是計算密集型的,因此目前根本不計算置信區間:
sns.lmplot(x="total_bill", y="tip", data=tips,
lowess=True)
residplot()是一個有用的工具,用於檢查簡單的迴歸模型是否擬合數據集。它擬合併移除一個簡單的線性迴歸,然後繪製每個觀察值的殘差值。 理想情況下,這些值應隨機散佈在y = 0附近:
如果殘差中有結構,則表明簡單的線性迴歸是不合適的:
sns.residplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
scatter_kws={"s": 80})
上面的圖表顯示了許多方法來探索一對變量之間的關係。然而,通常,一個更有趣的問題是“這兩個變量之間的關係如何作爲第三個變量的函數而變化?”這是regplot()和lmplot()之間的區別。 雖然regplot()總是顯示單個關係,lmplot()將regplot()與FacetGrid結合在一起,提供了一個簡單的界面,可以在“faceted”圖上顯示線性迴歸,從而允許探索與多達三個其他類別變量的交互。
分類關係的最佳方式是繪製相同軸上的兩個級別,並使用顏色來區分它們:
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
除了顏色之外,還可以使用不同的散點圖標記來使黑色和白色的圖像更好地繪製。 您還可以完全控制所用的顏色:
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips,
markers=["o", "x"], palette="Set1")
要添加另一個變量,您可以繪製多個“facet”,每個級別的變量出現在網格的行或列中:
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", data=tips);
sns.lmplot(x="total_bill", y="tip", hue="smoker", col="time", row="sex", data=tips)
控制繪製的大小和形狀
由regplot()和lmplot()創建的默認繪圖看起來是一樣的,但在軸上卻具有不同大小和形狀。 這是因爲func:regplot是一個“軸級”功能繪製到特定的軸上。 這意味着可以自己製作多面板圖形,並精確控制迴歸圖的位置。 如果沒有提供軸,它只需使用“當前活動的”軸,這就是爲什麼默認繪圖與大多數其他matplotlib函數具有相同的大小和形狀的原因。要控制大小,您需要自己創建一個圖形對象。
f, ax = plt.subplots(figsize=(5, 6))
sns.regplot(x="total_bill", y="tip", data=tips, ax=ax)
相反,lmplot()圖的大小和形狀通過FacetGrid界面使用size和aspect參數進行控制,這些參數適用於每個圖中的設置,而不是整體圖形:
sns.lmplot(x="total_bill", y="tip", col="day", data=tips, col_wrap=2, size=3)
sns.lmplot(x="total_bill", y="tip", col="day", data=tips, aspect=.5)
在其他背景下繪製迴歸
另外一些Seaborn函數在更大,更復雜的繪製中使用regplot()。 第一個是在上一章分佈介紹的jointplot()函數。 除了前面討論的繪圖樣式之外,jointplot()可以使用regplot()通過傳遞kind ="reg"來顯示關節軸上的線性迴歸擬合:
sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg")
使用kind="reg"的pairplot()函數結合了regplot()和PairGrid來顯示數據集中變量之間的線性關係。 注意這是不同於lmplot()的。 在下圖中,兩軸在第三個變量的兩個級別上不顯示相同的關係; 相反,PairGrid()用於顯示數據集中變量的不同配對之間的多個關係:
sns.pairplot(tips, x_vars=["total_bill", "size"], y_vars=["tip"], size=5, aspect=.8, kind="reg")
類似lmplot(),但不同於jointplot(),使用hue參數在pairplot()中內置了一個附加分類變量的條件:
sns.pairplot(tips, x_vars=["total_bill", "size"], y_vars=["tip"], hue="smoker", size=5, aspect=.8, kind="reg")
**********分類數據的繪製
**********繪製數據網格