【轉載】Seaborn繪圖

以前粗略的學習過Matplotlib繪圖、Pandas繪圖(這裏是pandas的常見繪圖總結),但是都未深入的去學習過,一遇到問題就翻文檔,效率低下。聽“他們”說matplotlib中的seaborn繪圖很好看而且實用,所以,這裏系統的總結一下seaborn常見的圖形繪製。其目的也是很簡單,方便自己和給大家提供一些幫助(由於英文很菜,每次都查單詞,有些詞彙就翻譯的很生硬,還請諒解……)。

差點忘了,這裏使用的數據還是seaborn的默認數據,很多人再看seaborn的時候對數據一頭霧水,這裏我將存放數據的GitHub放在這兒,理解數據的含義,對分析問題往往起着事半功倍的效果。

https://github.com/mwaskom/seaborn-data

根據Seaborn的API,具體如下:

正文

1.Relational plots(關係圖)

Seaborn中介紹的第一種類型的圖就是Relational plots(關係圖),這裏翻譯一下官網對他的解釋:“統計分析是理解數據集中變量如何相互關聯以及這些關係如何依賴於其他變量的過程。可視化可能是這個過程的核心部分,因爲當數據被正確地可視化時,人類視覺系統可以看到指示某種關係的趨勢和模式。”
Relational plots(關係圖)中主要討論的是三個seaborn函數。我們最常用的是relplot()。這是一個圖形級函數使用兩種常用方法可視化統計關係:散點圖(scatter plots)和線圖(line plots)。

 1. scatterplot() (與kind="scatter";默認值)
 2. lineplot() (與kind="line")
  • 1
  • 2

還是第一步,導入我們需要的各種模塊:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid") #這是seaborn默認的風格
  • 1
  • 2
  • 3
  • 4
  • 5

1.1 scatterplot(散點圖)

散點圖是統計可視化的重要組成部分。它使用點雲來描述兩個變量的聯合分佈,其中每個點代表數據集中的一個觀察。這種描繪可以推斷出大量關於它們之間是否有任何有意義的關係的信息。
在seaborn中有幾種(後面介紹)繪製散點圖的方法,當兩個變量都是數字時,應該使用的最基本的是scatterplot()功能。在Categorical plots(分類圖)中,我們將看到使用散點圖可視化分類數據的專門工具。

#scatterplot參數
seaborn.scatterplot(x=None, y=None, hue=None, style=None, size=None, 
data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, 
size_order=None, size_norm=None, markers=True, style_order=None,
 x_bins=None, y_bins=None, units=None, estimator=None, ci=95, n_boot=1000, 
 alpha='auto', x_jitter=None, y_jitter=None, legend='brief', ax=None, **kwargs)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在所有的seaborn繪圖時,裏面的參數是衆多的,但是不用擔心,大部分參數是相同的,只有少部分存在差異,有些通過對單詞的理解就可知道其含義,這裏我只根據每個具體的圖形重要的參數做一些解釋,並簡單的介紹這些常用參數的含義。

  • x,y:容易理解就是你需要傳入的數據,一般爲dataframe中的列;
  • hue:也是具體的某一可以用做分類的列,作用是分類;
  • data:是你的數據集,可要可不要,一般都是dataframe;
  • style:繪圖的風格(後面單獨介紹);
  • size:繪圖的大小(後面介紹);
  • palette:調色板(後面單獨介紹);
  • markers:繪圖的形狀(後面介紹);
  • ci:允許的誤差範圍(空值誤差的百分比,0-100之間),可爲‘sd’,則採用標準差(默認95);
  • n_boot(int):計算置信區間要使用的迭代次數;
  • alpha:透明度;
  • x_jitter,y_jitter:設置點的抖動程度。

先來個簡單的散點圖,繪製看看效果

#數據來源可在seaborn的GitHub上查找
tips = sns.load_dataset("tips")
ax = sns.scatterplot(x="total_bill", y="tip", data=tips)
  • 1
  • 2
  • 3

在這裏插入圖片描述
接下來,複雜一點,按另一個變量分組(hue參數起了作用),不同類型的方式(style),點的大小(size),並顯示具有不同顏色的組:

ax = sns.scatterplot(x="total_bill", y="tip",hue="day",
 style="time",size='size',data=tips)
  • 1
  • 2

在這裏插入圖片描述
是不是複雜的多,當然還有很多參數可以改,這裏就不一一介紹了,接下來看lineplot。

1.2 lineplot(線圖)

seaborn.lineplot(x=None, y=None, hue=None, size=None, style=None,
 data=None, palette=None, hue_order=None, hue_norm=None, sizes=None,
  size_order=None, size_norm=None, dashes=True, markers=None, 
  style_order=None, units=None, estimator='mean', ci=95, n_boot=1000, 
  sort=True, err_style='band', err_kws=None, legend='brief', ax=None, **kwargs)
  • 1
  • 2
  • 3
  • 4
  • 5

可以看出,參數並沒有較散點圖有較大的改變,所以話不多說,直接上圖:

還是下來個簡單的:

fmri = sns.load_dataset("fmri")
ax = sns.lineplot(x="timepoint", y="signal", data=fmri)

#陰影是默認的置信區間,可設置ci=0,將其去除

  • 1
  • 2
  • 3
  • 4

陰影是默認的置信區間,可設置ci=0,將其去除
接下來,來個複雜一點兒的:

#使用標記而不是破折號來識別組
ax = sns.lineplot(x="timepoint", y="signal",hue="event", style="event",
markers=True, dashes=False, data=fmri)
  • 1
  • 2
  • 3

在這裏插入圖片描述

1.3 relplot(關係圖)

seaborn.relplot(x=None, y=None, hue=None, size=None, style=None, 
data=None, row=None, col=None, col_wrap=None, row_order=None, 
col_order=None, palette=None, hue_order=None, hue_norm=None, 
sizes=None, size_order=None, size_norm=None, markers=None, dashes=None,
 style_order=None, legend='brief', kind='scatter', height=5, aspect=1,
  facet_kws=None, **kwargs)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

relplot(關係圖)可以看做是lineplot和scatterplot的歸約,可以通過kind參數來指定畫什麼圖形,重要參數解釋如下:

  • kind:默認scatter(散點圖),也可以選擇kind=‘line’(線圖);
  • sizes:List、dict或tuple,可選,簡單點就是圖片大小,注意和size區分;
  • col、row:將決定網格的面數的分類變量,具體看實例;
tips = sns.load_dataset("tips")
g = sns.relplot(x="total_bill", y="tip", data=tips)
#兩者效果一模一樣
ax = sns.scatterplot(x="total_bill", y="tip", data=tips)
  • 1
  • 2
  • 3
  • 4

在這裏插入圖片描述
其他參數設置:

g = sns.relplot(x="total_bill", y="tip", hue="time", size="size",
palette=["b", "r"], sizes=(10, 100),col="time",row='sex', data=tips)
  • 1
  • 2

在這裏插入圖片描述
關於kind=‘line’,這裏就不畫了,重點是理解參數的意義。

2.Categorical plots(分類圖)

Categorical plots(分類圖)可以具體分爲下面三種類型,8個小圖:

  1. Categorical scatterplots(分類散點圖)
    stripplot(分佈散點圖)
    swarmplot(分佈密度散點圖)
  2. Categorical distribution plots(分類分佈圖)
    boxplot(箱線圖)
    violinplot(小提琴圖)
    boxenplot(字母價值圖???)
  3. Categorical estimate plots(分類估計圖)
    pointplot(點圖)
    barplot(條形圖)
    countplot(計數統計圖)

2.1 Categorical scatterplots(分類散點圖)

2.1.1 stripplot(分佈散點圖)

stripplot(分佈散點圖)的意思就是按照不同類別對樣本數據進行分佈散點圖繪製。stripplot(分佈散點圖)一般並不單獨繪製,它常常與boxplot和violinplot聯合起來繪製,作爲這兩種圖的補充。

seaborn.stripplot(x=None, y=None, hue=None, data=None, order=None, 
hue_order=None, jitter=True, dodge=False, orient=None, color=None, 
palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)
  • 1
  • 2
  • 3
  • x,y,data:輸入數據可以多種格式傳遞,在大多數情況下,使用Numpy或Python對象是可能的,但是更可取的是pandas對象,因爲相關的名稱將用於對軸進行註釋。此外,還可以對分組變量使用分類類型來控制情節元素的順序。
  • order:用order參數進行篩選分類類別,例如:order=[‘sun’,‘sat’];
  • jitter:抖動項,表示抖動程度,可以使float,或者True;
  • dodge:重疊區域是否分開,當使用hue時,將其設置爲True,將沿着分類軸將不同色調級別的條帶分開。
  • orient:“v” | “h”,vertical(垂直) 和 horizontal(水平)的意思;

基本的圖

tips = sns.load_dataset("tips")
ax = sns.stripplot(x="day", y="total_bill", data=tips)
  • 1
  • 2

在這裏插入圖片描述
多增加幾個參數的修改:

ax = sns.stripplot(x="day", y="total_bill", hue="smoker",data=tips, 
jitter=True,palette="Set2", dodge=True)
  • 1
  • 2

在這裏插入圖片描述

2.1.2 swarmplot(分佈密度散點圖)

這個函數類似於stripplot(),但是對點進行了調整(只沿着分類軸),這樣它們就不會重疊。這更好地表示了值的分佈,但它不能很好地擴展到大量的觀測。

seaborn.swarmplot(x=None, y=None, hue=None, data=None, order=None,
 hue_order=None, dodge=False, orient=None, color=None, palette=None, size=5, 
 edgecolor='gray', linewidth=0, ax=None, **kwargs)
  • 1
  • 2
  • 3

可以看出,swarmplot和stripplot參數上基本一致,少了jitter,因爲它顯示的是分佈密度,不需要添加抖動項。

ax = sns.swarmplot(x="day", y="total_bill", data=tips)
  • 1

在這裏插入圖片描述
多增加幾個參數的修改:

ax = sns.swarmplot(x="day", y="total_bill", hue="smoker",data=tips,palette="Set2", dodge=True)
  • 1

在這裏插入圖片描述

2.2 Categorical distribution plots(分類分佈圖)

2.2.1 boxplot(箱線圖)

boxplot(箱線圖,又稱爲盒須圖、盒式圖)便於在變量之間或跨類別變量級別比較的方式,顯示定量數據的分佈情況。框顯示數據集的四分位數,線顯示分佈的其餘部分,它能顯示出一組數據的最大值、最小值、中位數及上下四分位數,使用四分位數範圍函數的方法可以確定“離羣值”的點。具體用法如下:

seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, 
hue_order=None, orient=None, color=None, palette=None, saturation=0.75, 
width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)
  • 1
  • 2
  • 3
  • saturation:飽和度,可設置爲1;
  • width:float,控制箱型圖的寬度大小;
  • fliersize:float,用於指示離羣值觀察的標記大小;
  • whis:可理解爲異常值的上限IQR比例;
  • notch:我也不知道……
ax = sns.boxplot(x="day", y="total_bill", data=tips)
  • 1

在這裏插入圖片描述

#這些參數不一定要加,簡單最好,這裏只是爲了展示參數的含義
ax = sns.boxplot(x="day", y="total_bill", hue="time",data=tips, 
                 linewidth=0.5,saturation=1,width=1,fliersize=3)
  • 1
  • 2
  • 3

在這裏插入圖片描述

2.2.2 violinplot(小提琴圖)

violinplot與boxplot扮演類似的角色,箱線圖展示了分位數的位置,它顯示了定量數據在一個(或多個)分類變量的多個層次上的分佈,這些分佈可以進行比較。不像箱形圖中所有繪圖組件都對應於實際數據點,小提琴繪圖以基礎分佈的核密度估計爲特徵,通過小提琴圖可以知道哪些位置的密度較高。在圖中,白點是中位數,黑色盒型的範圍是下四分位點到上四分位點,細黑線表示須。外部形狀即爲核密度估計。
這是一種可以同時顯示多個數據分佈的有效和有吸引力的方法,但請記住,估計過程受樣本大小的影響,相對較小的樣本的小提琴手看起來可能會顯得非常平滑。具體用法如下:

seaborn.violinplot(x=None, y=None, hue=None, data=None, order=None, 
hue_order=None, bw='scott', cut=2, scale='area', scale_hue=True, gridsize=100, 
width=0.8, inner='box', split=False, dodge=True, orient=None, linewidth=None, 
color=None, palette=None, saturation=0.75, ax=None, **kwargs)
  • 1
  • 2
  • 3
  • 4
  • bw:‘scott’, ‘silverman’, float,控制擬合程度。在計算內核帶寬時,可以引用規則的名稱(‘scott’, ‘silverman’)或者使用比例(float)。實際內核大小將通過將比例乘以每個bin內數據的標準差來確定;
  • cut:空值外殼的延伸超過極值點的密度,float;
  • scale:“area”, “count”, “width”,用來縮放每把小提琴的寬度的方法;
  • scale_hue:當使用hue分類後,設置爲True時,此參數確定是否在主分組變量進行縮放;
  • gridsize:設置小提琴圖的平滑度,越高越平滑;
  • inner:“box”, “quartile”, “point”, “stick”, None,小提琴內部數據點的表示。分別表示:箱子,四分位,點,數據線和不表示;
  • split:是否拆分,當設置爲True時,繪製經hue分類的每個級別畫出一半的小提琴;
ax = sns.violinplot(x="day", y="total_bill", data=tips)
  • 1

在這裏插入圖片描述
設置按性別分類,調色爲“Set2”,分割,以計數的方式,不表示內部。

ax = sns.violinplot(x="day", y="total_bill", hue="sex",data=tips, 
palette="Set2", split=True,scale="count", inner=None)
  • 1
  • 2

在這裏插入圖片描述

2.2.3 violinplot+stripplot(小提琴圖+分佈散點圖)

ax = sns.violinplot(x="tip", y="day", data=tips, inner=None,whis=np.inf)
ax = sns.stripplot(x="tip", y="day", data=tips,jitter=True, color="c")
  • 1
  • 2

在這裏插入圖片描述

2.2.4 violinplot+swarmplot(小提琴圖+分佈密度散點圖)

ax = sns.violinplot(x="tip", y="day", data=tips,inner=None, whis=np.inf)
ax = sns.swarmplot(x="tip", y="day", data=tips, color="c")
  • 1
  • 2

在這裏插入圖片描述

2.2.5 boxplot+stripplot(箱線圖+分佈散點圖)

ax = sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
ax = sns.stripplot(x="tip", y="day", data=tips,jitter=True, color="c")
  • 1
  • 2

在這裏插入圖片描述

2.2.6 boxplot+swarmplot(箱線圖+分佈密度散點圖)

ax = sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
ax = sns.swarmplot(x="tip", y="day", data=tips, color="c")
  • 1
  • 2

在這裏插入圖片描述

2.3 Categorical estimate plots(分類估計圖)

2.3.1 barplot(條形圖)

條形圖表示數值變量與每個矩形高度的中心趨勢的估計值,用矩形條表示點估計和置信區間,並使用誤差線提供關於該估計值附近的不確定性的一些指示。具體用法如下:

seaborn.barplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, 
estimator=<function mean>, ci=95, n_boot=1000, units=None, orient=None, 
color=None, palette=None, saturation=0.75, errcolor='.26', errwidth=None,
capsize=None, dodge=True, ax=None, **kwargs)
  • 1
  • 2
  • 3
  • 4
  • estimator:用於估計每個分類箱內的統計函數,默認爲mean。當然你也可以設置estimator=np.median/np.std/np.var……
  • order:選擇和空值順序,例如:order=[‘Sat’,‘Sun’];
  • ci:允許的誤差的範圍(控制誤差棒的百分比,在0-100之間),若填寫"sd",則用標準誤差(默認爲95),也可設置ci=None;
  • capsize:設置誤差棒帽條(上下兩根橫線)的寬度,float;
  • saturation:飽和度;
  • errcolor:表示置信區間的線條的顏色;
  • errwidth:float,設置誤差條線(和帽)的厚度。

根據性別分組:

ax = sns.barplot(x="day", y="total_bill", hue="sex", data=tips)
  • 1

在這裏插入圖片描述
設置estimator爲中位數(numpy的統計函數都可以,只要你覺得有意義),設置誤差棒的寬度,誤差棒的顏色爲“c”。

ax = sns.barplot(x="day", y="total_bill",hue='sex', data=tips, 
estimator=np.median,capsize=0.2,errcolor='c')
  • 1
  • 2

在這裏插入圖片描述

2.3.2 countplot(計數圖)

一個計數圖可以被認爲是一個分類直方圖,而不是定量的變量。基本的api和選項與barplot()相同,因此您可以比較嵌套變量中的計數。(工作原理就是對輸入的數據分類,條形圖顯示各個分類的數量)。具體參數如下:

seaborn.countplot(x=None, y=None, hue=None, data=None, order=None, 
hue_order=None, orient=None, color=None, palette=None, saturation=0.75, 
dodge=True, ax=None, **kwargs)
  • 1
  • 2
  • 3

這裏參數並沒有太多改變,orient就是改變方向。但是,值得注意的是缺少了一些參數,而且countplot中不能同時輸入x和y,卻可以使用hue(這我就很納悶了???還望大佬解釋解釋)。

titanic = sns.load_dataset("titanic")
ax = sns.countplot(x="class", hue="who", data=titanic)
  • 1
  • 2

在這裏插入圖片描述

2.3.3 piontplot(點圖)

用散點圖符號表示點估計和置信區間,點圖代表散點圖位置的數值變量的中心趨勢估計,並使用誤差線提供關於該估計的不確定性的一些指示。點圖可能比條形圖(barplot)更有用於聚焦一個或多個分類變量的不同級別之間的比較。他們尤其善於表現交互作用:一個分類變量的層次之間的關係如何在第二個分類變量的層次之間變化。連接來自相同色調等級的每個點的線允許交互作用通過斜率的差異進行判斷,這比對幾組點或條的高度比較容易。具體用法如下:

seaborn.pointplot(x=None, y=None, hue=None, data=None, order=None, 
hue_order=None, estimator=<function mean>, ci=95, n_boot=1000, 
units=None, markers='o', linestyles='-', dodge=False, join=True, 
scale=1, orient=None, color=None, palette=None, errwidth=None, 
capsize=None, ax=None, **kwargs)
  • 1
  • 2
  • 3
  • 4
  • 5
  • join:默認兩個均值點會相連接,若不想顯示,可以通過join=False參數實現;
  • scale:float,均值點(默認)和連線的大小和粗細。
tips = sns.load_dataset("tips")
ax = sns.pointplot(x="time", y="total_bill", data=tips)
  • 1
  • 2

在這裏插入圖片描述
嘗試更多參數,按性別分組,用中位數進行比較,分開顯示,使用調色板,修改標記類型和線條類型(很多參數都不是必要的,這裏只是儘量充分介紹其用法)。

ax = sns.pointplot(x="time", y="total_bill", hue="smoker",data=tips,estimator=np.median,
dodge=True, palette="Set2",markers=["o", "x"],linestyles=["-", "--"])
  • 1
  • 2

在這裏插入圖片描述

2.3.4 catplot()

該函數提供了對幾個軸級函數的訪問,這些函數使用幾種可視化表示形式之一顯示一個數字變量和一個或多個分類變量之間的關係。其實說白了就是利用kind參數來畫前面Categorical plots(分類圖)中的任意8個圖形。具體如下:

seaborn.catplot(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='strip',
 height=5, aspect=1, orient=None, color=None, palette=None, legend=True, 
 legend_out=True, sharex=True, sharey=True, margin_titles=False, 
 facet_kws=None, **kwargs)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

有沒有發現,它和regplot(關係圖)的使用方法差不多?

  • kind:默認strip(分佈散點圖),也可以選擇“point”, “bar”, “count”,
  • col、row:將決定網格的面數的分類變量,可具體制定;
  • col_wrap:指定每行展示的子圖個數,但是與row不兼容;
  • row_order, col_order : 字符串列表,安排行和列,以及推斷數據中的對象;
  • height,aspect:與圖像的大小有關;
  • sharex,sharey:bool, ‘col’or ‘row’,是否共享想,x,y座標;

注:單個圖形裏面的參數也是可以傳入裏面的

繪製一個小提琴圖,按數據中的kind類別分組(數據中的),不要中心框線。

exercise = sns.load_dataset("exercise")
g = sns.catplot(x="time", y="pulse", hue="kind",data=exercise, kind="violin",inner=None)
  • 1
  • 2

在這裏插入圖片描述
使用diet來分成幾個圖形,並用height、aspect來設置圖片比例:

g = sns.catplot(x="time", y="pulse", hue="kind",kind='bar',col="diet", 
data=exercise,height=4, aspect=0.8)
  • 1
  • 2

在這裏插入圖片描述

3 Distribution plots(分佈圖)

3.1 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)
  • 1
  • 2
  • 3
  • bins:int或list,控制直方圖的劃分,設置矩形圖(就是塊兒的多少)數量,除特殊要求一般默認;
  • hist:是否顯示方塊;
  • kde:是否顯示核密度估計曲線;
  • rug:控制是否生成觀測數值的小細條(邊際毛毯);
  • fit:控制擬合的參數分佈圖形,能夠直觀地評估它與觀察數據的對應關係(黑色線條爲確定的分佈);
    -{hist, kde, rug, fit}_kws :參數接收字典類型,可以自行定義更多高級的樣式;
  • norm_hist:若爲True, 則直方圖高度顯示密度而非計數(含有kde圖像中默認爲True);
  • vertical:放置的方向,如果爲真,則觀測值位於y-軸上(默認False,x軸上);
  • axlabel : string, False, or None, 設置標籤。

設置隨機種子(666),隨機生成1000個符合正態分佈的數:

np.random.seed(666)
x = np.random.randn(1000)
ax = sns.distplot(x)
  • 1
  • 2
  • 3

在這裏插入圖片描述
修改更多參數,設置方塊的數量,方塊、密度曲線和邊際毛毯都顯示,顏色爲‘k’,axlabel=‘norm’。

np.random.seed(666)
x = np.random.randn(1000)
ax = sns.distplot(x, bins=100,hist=True, kde=True, rug=True,color='k',axlabel='norm')
  • 1
  • 2
  • 3

在這裏插入圖片描述

3.2 kdeplot(核密度圖)

核密度估計(kernel density estimation)是在概率論中用來估計未知的密度函數,屬於非參數檢驗方法之一。通過核密度估計圖可以比較直觀的看出數據樣本本身的分佈特徵。具體用法如下:

seaborn.kdeplot(data, data2=None, shade=False, vertical=False, kernel='gau', 
bw='scott', gridsize=100, cut=3, clip=None, legend=True, cumulative=False, 
shade_lowest=True, cbar=False, cbar_ax=None, cbar_kws=None, ax=None, **kwargs)
  • 1
  • 2
  • 3
  • data、data2:表示可以輸入雙變量,繪製雙變量核密度圖;
  • shade:是否填充陰影,默認不填充;
  • vertical:放置的方向,如果爲真,則觀測值位於y軸上(默認False,x軸上);
  • kernel:{‘gau’ | ‘cos’ | ‘biw’ | ‘epa’ | ‘tri’ | ‘triw’ }。默認高斯核(‘gau’)二元KDE只能使用高斯核。至於什麼是核函數,這個學問就大了,建議多看看論文;
  • bw:{‘scott’ | ‘silverman’ | scalar | pair of scalars }。四類核密度帶方法,默認scott (斯考特帶寬法),建議下來了解一下這四種方法的區別;
  • gridsize:這個參數指的是每個格網裏面,應該包含多少個點,越大,表示格網裏面的點越多(覺得電腦OK的可以試試,有驚喜),越小表示格網裏面的點越少;
  • cut:參數表示,繪製的時候,切除帶寬往數軸極限數值的多少,這個參數可以配合bw參數使用;
  • cumulative:是否繪製累積分佈;
  • shade_lowest:是否有最低值渲染,這個參數只有在二維密度圖上纔有效;
  • clip:表示查看部分結果,是一個區間;
  • cbar:參數若爲True,則會添加一個顏色棒(顏色幫在二元kde圖像中才有);

有木有覺得參數超多,所以說核密度圖還是比較難的(雖然容易畫,但原理很複雜)。下面看幾個簡單的例子:簡單生成一個多元正態分佈(對numpy隨機分佈不瞭解的朋友,可以看我總結的numpy函數)。

mean, cov = [0, 2], [(1, .5), (.5, 1)]
#這是一個多元正態分佈
x, y = np.random.multivariate_normal(mean, cov, size=50).T
ax = sns.kdeplot(x)
  • 1
  • 2
  • 3
  • 4

在這裏插入圖片描述
接下來繪製雙變量核密度圖①:

ax=sns.kdeplot(x,y,shade=True,shade_lowest=False,cbar=True,color='r')
  • 1

在這裏插入圖片描述
接下來繪製雙變量核密度圖②:二色二元密度圖,使用大名鼎鼎的鳶尾花數據集

iris = sns.load_dataset("iris")
setosa = iris.loc[iris.species == "setosa"]
virginica = iris.loc[iris.species == "virginica"]
ax = sns.kdeplot(setosa.sepal_width, setosa.sepal_length,cmap="Reds",
 shade=True, shade_lowest=False)
ax = sns.kdeplot(virginica.sepal_width, virginica.sepal_length,cmap="Blues", 
shade=True, shade_lowest=False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在這裏插入圖片描述

3.3 jointplot(聯合分佈圖)

聯合概率分佈簡稱聯合分佈,是兩個及以上隨機變量組成的隨機向量的概率分佈。根據隨機變量的不同,聯合概率分佈的表示形式也不同。對於離散型隨機變量,聯合概率分佈可以以列表的形式表示,也可以以函數的形式表示;對於連續型隨機變量,聯合概率分佈通過一非負函數的積分表示。具體參數如下:

seaborn.jointplot(x, y, data=None, kind='scatter', stat_func=None, color=None, 
height=6, ratio=5, space=0.2, dropna=True, xlim=None, ylim=None, joint_kws=None,
 marginal_kws=None, annot_kws=None, **kwargs)
  • 1
  • 2
  • 3
  • x,y:爲DataFrame中的列名或者是兩組數據,data指向dataframe;
  • kind : { “scatter” | “reg” | “resid” | “kde” | “hex” }。默認散點圖;
  • stat_func:用於計算統計量關係的函數;
  • ratio:中心圖與側邊圖的比例,越大、中心圖佔比越大;
  • dropna:去除缺失值;
  • height:圖的尺度大小(正方形);
  • space:中心圖與側邊圖的間隔大小;
  • xlim,ylim:x,y的範圍

用邊緣直方圖繪製散點圖:

tips = sns.load_dataset("tips")
g = sns.jointplot(x="total_bill", y="tip", data=tips,height=5)
  • 1
  • 2

在這裏插入圖片描述
#用密度估計替換散點圖和直方圖,調節間隔和比例:

iris = sns.load_dataset("iris")
g = sns.jointplot("sepal_width", "petal_length", data=iris,kind="kde", space=0,ratio=6 ,color="r")
  • 1
  • 2

在這裏插入圖片描述

3.4 pairplot(變量關係組圖)

在數據集中繪製成對關係的圖。默認情況下,該函數將創建一個軸網格,這樣數據中的每個變量都將通過跨一行的y軸和跨單個列的x軸共享。對對角線軸的處理方式不同,繪製的圖顯示該列中變量的數據的單變量分佈。此外,還可以在行和列上顯示變量子集或繪製不同的變量。具體如下:

seaborn.pairplot(data, hue=None, hue_order=None, palette=None, vars=None, 
x_vars=None, y_vars=None, kind='scatter', diag_kind='auto', markers=None,
 height=2.5, aspect=1, dropna=True, plot_kws=None, diag_kws=None, 
 grid_kws=None, size=None)
  • 1
  • 2
  • 3
  • 4
  • var:data中的子集,否則使用data中的每一列;
  • x_vars / y_vars:可以具體細分,誰與誰比較;
  • kind:{‘scatter’, ‘reg’};
  • diag_kind:{‘auto’, ‘hist’, ‘kde’}。單變量圖(自己與自己比較)的繪圖,對角線子圖的圖樣。默認情況取決於是否使用“hue”。

採用默認格式繪製鳶尾花數據集,這樣對於分類問題來說並不能有效的觀察數據情況。

iris = sns.load_dataset("iris")
g = sns.pairplot(iris)
  • 1
  • 2

在這裏插入圖片描述
使用hue="species"對不同種類區分顏色繪製,並使用不同標記:

g = sns.pairplot(iris, hue="species", markers=["o", "s", "D"])
  • 1

在這裏插入圖片描述

4 Regression plots(迴歸圖)

4.1 lmplot(迴歸圖)

許多數據集都有着衆多連續變量。數據分析的目的經常就是衡量變量之間的關係,lmplot() 是一個非常有用的方法,它會在繪製二維散點圖時,自動完成迴歸擬合。具體參數如下:

seaborn.lmplot(x, y, data, hue=None, col=None, row=None, palette=None, 
col_wrap=None, height=5, aspect=1, markers='o', sharex=True, sharey=True, 
hue_order=None, col_order=None, row_order=None, legend=True, legend_out=True, 
x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, 
n_boot=1000, units=None, order=1, logistic=False, lowess=False, robust=False, 
logx=False, x_partial=None, y_partial=None, truncate=False, x_jitter=None, 
y_jitter=None, scatter_kws=None, line_kws=None, size=None)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • col,row:和前面一樣,根據所指定屬性在列,行上分類;
  • col_wrap:指定每行的列數,最多等於col參數所對應的不同類別的數量;
  • aspect:控制圖的長寬比;
  • x_jitter,y_jitter:給x,y軸隨機增加噪音點,設置這兩個參數不影響最後的迴歸直線;
  • order:多項式迴歸,控制進行迴歸的冪次,設定指數,可以用多項式擬合;
  • logistic:邏輯迴歸;
  • robust:如果是True,使用statsmodels來估計一個穩健的迴歸(魯棒線性模型)。這將減少異常值。請注意 logistic迴歸和robust迴歸相較於簡單線性迴歸需要更大的計算量,其置信區間的產生也依賴於bootstrap採樣,你可以關掉置信區間估計來提高速度(ci=None);
    • lowess:如果是True,使用statsmodels來估計一個非參數的模型(局部加權線性迴歸)。這種方法具有最少的假設,儘管它是計算密集型的,但目前無法爲這類模型繪製置信區間;
  • logx:轉化爲log(x)
  • truncate:默認情況下,繪製散點圖後繪製迴歸線以填充x軸限制。如果爲True,則它將被數據限制所限制;
    繪製一個第三個變量的條件,並繪製不同顏色的迴歸圖:
g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
  • 1

在這裏插入圖片描述

將變量分爲多行,並改變大小:

g = sns.lmplot(x="total_bill", y="tip", col="day", hue="day",data=tips,
 col_wrap=2, height=4)
  • 1
  • 2

在這裏插入圖片描述

4.2 regplot()

regplot()和lmplot()都可以繪製線性迴歸曲線。這兩個函數非常相似,甚至共有一些核心功能。具體參數如下:

seaborn.regplot(x, y, data=None, x_estimator=None, x_bins=None, x_ci='ci', 
scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, order=1, logistic=False, 
lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, 
truncate=False, dropna=True, x_jitter=None, y_jitter=None, label=None, color=None, 
marker='o', scatter_kws=None, line_kws=None, ax=None)
  • 1
  • 2
  • 3
  • 4
  • 5

至於兩者有什麼具體的區別,我也不清楚,但是感覺lmplot()要比regplot()強大一點……以後再總結吧,還是繼續繪圖。

g = sns.regplot(x="total_bill", y="tip",data=tips)
  • 1

在這裏插入圖片描述
嘗試邏輯迴歸分類:

tips["big_tip"] = (tips.tip / tips.total_bill) > .175
ax = sns.regplot(x="total_bill", y="big_tip", data=tips,logistic=True, n_boot=500, y_jitter=.03)
  • 1
  • 2

在這裏插入圖片描述

5.Matrix plots(矩陣圖)

5.1 heatmap(熱力圖)

利用熱力圖可以看數據表裏多個特徵兩兩的相似度,類似於色彩矩陣。具體參數如下:

seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, 
robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', 
cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', 
yticklabels='auto', mask=None, ax=None, **kwargs)
  • 1
  • 2
  • 3
  • 4
  • data:矩陣數據集,可以使numpy的數組(array),如果是pandas的dataframe,則df的index/column信息會分別對應到heatmap的columns和rows;
  • vmax,vmin:圖例中最大值和最小值的顯示值,沒有該參數時默認不顯示;
  • cmap:從數字到色彩空間的映射,取值是matplotlib包裏的colormap名稱或顏色對象,或者表示顏色的列表;
  • center:數據表取值有差異時,設置熱力圖的色彩中心對齊值。通過設置center值,可以調整生成的圖像顏色的整體深淺;設置center數據時,如果有數據溢出,則手動設置的vmax、vmin會自動改變 ;
  • robust:默認取值False;如果是False,且沒設定vmin和vmax的值,熱力圖的顏色映射範圍根據具有魯棒性的分位數設定,而不是用極值設定;
  • annot(annotate的縮寫):默認取值False;如果是True,在熱力圖每個方格寫入數據;如果是矩陣,在熱力圖每個方格寫入該矩陣對應位置數據;
  • fmt:字符串格式代碼,矩陣上標識數字的數據格式,比如保留小數點後幾位數字;
  • annot_kws:默認取值False;如果是True,設置熱力圖矩陣上數字的大小顏色字體;
  • square:設置熱力圖矩陣小塊形狀,默認值是False;
  • xticklabels, yticklabels:控制每行列標籤名的輸出。默認值是auto,自動選擇標籤的標註間距,將標籤名不重疊的部分(或全部)輸出。如果是True,則以DataFrame的列名作爲標籤名;
  • mask:控制某個矩陣塊是否顯示出來。默認值是None。如果是布爾型的DataFrame,則將DataFrame裏True的位置用白色覆蓋掉。

繪製一個簡單的numpy數組的熱力圖:

x = np.random.rand(10, 12)
ax = sns.heatmap(x)
  • 1
  • 2

在這裏插入圖片描述
顯示數字和保留幾位小數,並修改數字大小字體顏色格式:

x= np.random.rand(10, 10)
ax = sns.heatmap(x,annot=True,annot_kws={'size':9,'weight':'bold', 'color':'w'},fmt='.2f')
  • 1
  • 2

在這裏插入圖片描述

5.2 clustermap(聚類圖)

clustermap() 可以將矩陣數據集繪製爲層次聚類熱圖。具體參數如下:

seaborn.clustermap(data, pivot_kws=None, method='average', metric='euclidean', 
z_score=None, standard_scale=None, figsize=None, cbar_kws=None, row_cluster=True, 
col_cluster=True, row_linkage=None, col_linkage=None, row_colors=None, col_colors=None, 
mask=None, **kwargs)
  • 1
  • 2
  • 3
  • 4

說實在的這個我也不太懂,就拋磚引玉的畫一下圖。

iris = sns.load_dataset("iris")
species = iris.pop("species")
g = sns.clustermap(iris)
  • 1
  • 2
  • 3

在這裏插入圖片描述

6 FacetGrid()

在探索中多維數據時,一種有用的方法是在數據集的不同子集上繪製同一類型圖的多個子圖。該類將數據集映射到與數據集中變量級別相對應的行和列網格中排列的多個軸上。它生成的圖形通常被稱爲“格子”或“格子”繪圖,它可以使查看者快速觀察到有關複雜數據的大量信息。

FacetGrid當您想要在數據集的子集中分別可視化變量的分佈或多個變量之間的關係時,該類非常有用。一個FacetGrid可以與多達三個維度可以得出:row,col,和hue。前兩個與得到的軸陣列有明顯的對應關係; 將hue變量視爲沿深度軸的第三個維度,其中不同的級別用不同的顏色繪製。通過使用FacetGrid數據框初始化對象以及將形成網格的行,列或hue維度的變量名稱來使用該類。這些變量(hue)應該是分類的或離散的,然後變量的每個級別的數據將用於沿該軸的小平面。此外,每個的relplot(),catplot()以及lmplot()在內部使用這些對象。

在大多數情況下,與直接使用FacetGrid相比,使用圖形級函數(例如relplot()或catart()要好得多。具體參數如下:

seaborn.FacetGrid(data, row=None, col=None, hue=None, col_wrap=None, 
sharex=True, sharey=True, height=3, aspect=1, palette=None, 
row_order=None, col_order=None, hue_order=None, hue_kws=None, 
dropna=True, legend_out=True, despine=True, margin_titles=False, 
xlim=None, ylim=None, subplot_kws=None, gridspec_kws=None, size=None)
  • 1
  • 2
  • 3
  • 4
  • 5

其實細心的您可能已經發現某些具有相同的規律,不妨看看前面relplot()、catplot()、lmplot()的參數,是不是基本上差不多呢?沒錯,其實上面三個繪圖函數,都用到了FacetGrid()的思想。此外,pairplot()走某種意義上來說,也與他們很像。

FacetGrid並不能直接繪製我們想要的圖像,它的基本工作流程是FacetGrid使用數據集和用於構造網格的變量初始化對象。然後,可以通過調用FacetGrid.map()或將一個或多個繪圖函數應用於每個子集 FacetGrid.map_dataframe(),最後,可以使用其他修改參數的方法調整繪圖。

下面展示具體實例:使用TIPS數據集初始化2x2個面網格:

tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="time", row="smoker")#2*2
  • 1
  • 2

在這裏插入圖片描述
然後,在每個方面上繪製一個二元函數:

tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="time", row="smoker")
g = g.map(plt.scatter, "total_bill", "tip", color="c")
  • 1
  • 2
  • 3

在這裏插入圖片描述
這裏我其實有個疑問,爲什麼g.map()裏面用的是plt.scatter等matplotlib.pyplot來繪製圖形,我嘗試了用seaborn裏面的sns.scatterplot等也可以繪製相應的圖形,區別在於點的大小形狀不一樣,還望各位看官指點一下其中的差別。

接下來比較一下FacetGrid.map()繪圖與relplot()、catplot()、lmplot()繪圖的區別(這裏只比較relplot()來繪製散點圖):

sns.relplot(x="total_bill", y="tip", color="c",col="time",  hue="smoker",data=tips)
  • 1

在這裏插入圖片描述
看出來了嗎?結果是不是很清晰,一目瞭然?所以說:在大多數情況下,與直接使用FacetGrid相比,使用圖形級函數(例如relplot()或catart()要好得多。

7 PairGrid()

用於繪製數據集中成對關係的子圖網格。該類將數據集中的每個變量映射到多軸網格中的列和行。不同的軸級繪圖函數可用於繪製上、下三角形的二元圖解,並可在對角線上顯示每個變量的邊緣分佈。讀到這裏你就會發現,它和pairplot()有什麼區別呢?

其實PairGrid和pairplot從原理來說是一樣的,但是前面我們可以發現pairplot繪製的圖像上、下三角形是關於主對角線對稱的,而PairGrid則可修改上、下三角形和主對角線的圖像形狀。具體事例如下:

iris = sns.load_dataset("iris")
g = sns.PairGrid(iris,hue="species")
g = g.map_upper(sns.scatterplot)#在上對角線子圖上用二元函數繪製的圖
g = g.map_lower(sns.kdeplot,color='r')#在下對角線子圖上用二元函數繪製的圖
g = g.map_diag(sns.kdeplot)#對角線單變量子圖
  • 1
  • 2
  • 3
  • 4
  • 5

在這裏插入圖片描述

8 主題和顏色

8.1 主題(set_style)

seaborn中主要有以下幾個主題:

sns.set_style("whitegrid")  # 白色網格背景
sns.set_style("darkgrid")   # 灰色網格背景
sns.set_style("dark")       # 灰色背景
sns.set_style("white")      # 白色背景
sns.set_style("ticks")      # 四周加邊框和刻度
  • 1
  • 2
  • 3
  • 4
  • 5

8.2 顏色(color_palette())

seaborn中主要有以下幾個調色板顏色(後面再說,學習中……)

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
                                            <div class="more-toolbox">
            <div class="left-toolbox">
                <ul class="toolbox-list">
                    
                    <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#csdnc-thumbsup"></use>
                    </svg><span class="name">點贊</span>
                    <span class="count">12</span>
                    </a></li>
                    <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#icon-csdnc-Collection-G"></use>
                    </svg><span class="name">收藏</span></a></li>
                    <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                        <use xlink:href="#icon-csdnc-fenxiang"></use>
                    </svg>分享</a></li>
                    <!--打賞開始-->
                                            <!--打賞結束-->
                                            <li class="tool-item tool-more">
                        <a>
                        <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                        </a>
                        <ul class="more-box">
                            <li class="item"><a class="article-report">文章舉報</a></li>
                        </ul>
                    </li>
                                        </ul>
            </div>
                        </div>
        <div class="person-messagebox">
            <div class="left-message"><a href="https://blog.csdn.net/qq_40195360">
                <img src="https://profile.csdnimg.cn/0/3/C/3_qq_40195360" class="avatar_pic" username="qq_40195360">
                                        <img src="https://g.csdnimg.cn/static/user-reg-year/1x/2.png" class="user-years">
                                </a></div>
            <div class="middle-message">
                                    <div class="title"><span class="tit"><a href="https://blog.csdn.net/qq_40195360" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">不會寫作文的李華</a></span>
                                        </div>
                <div class="text"><span>發佈了10 篇原創文章</span> · <span>獲贊 24</span> · <span>訪問量 1萬+</span></div>
            </div>
                            <div class="right-message">
                                        <a href="https://im.csdn.net/im/main.html?userName=qq_40195360" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                    </a>
                                                        <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">關注</a>
                                </div>
                        </div>
                </div>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章