Seaborn是基於matplotlib的圖形可視化python包。它提供了一種高度交互式界面,便於用戶能夠做出各種有吸引力的統計圖表。
Seaborn是在matplotlib的基礎上進行了更高級的API封裝,從而使得作圖更加容易,在大多數情況下使用seaborn能做出很具有吸引力的圖,而使用matplotlib就能製作具有更多特色的圖。應該把Seaborn視爲matplotlib的補充,而不是替代物。同時它能高度兼容numpy與pandas數據結構以及scipy與statsmodels等統計模式。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
Table of Contents
2.2 Categorical distribution plots
2.3 Categorical estimate plots
1.Relational plots(關係圖)
1.1 Scatter Plot(散點圖)
sns.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)
x,y:數據/數據向量/dataframe中的列;
hue:分組變量,可產生不同顏色的點;
size:分組變量,可產生不同大小的點;
style:分組變量,可產生不同標記的點;
data:dataframe;
palette:調色板,用於hue;
markers:繪圖的形狀;
ci:允許的誤差範圍(空值誤差的百分比,0-100之間),可爲‘sd’,則採用標準差(默認95);
n_boot(int):計算置信區間要使用的迭代次數;
alpha:透明度;
x_jitter,y_jitter:設置點的抖動程度
tips=pd.read_excel(r'C:\Users\小Q11\OneDrive\Documents\數據集\tips.xlsx')#sns.load_dataset('tips')
plt.figure(figsize=(8,6))
cmap = sns.cubehelix_palette(dark=.3, light=.8, as_cmap=True)
ax = sns.scatterplot(x="total_bill", y="tip",hue="day",style="time",size='size',palette='Set2',data=tips)
# seaborn是基於matplotlib,所以matplotlib的習慣不用發生改變
plt.legend(loc='best')
plt.show()
1.2 Line Plot(線圖)
#使用標記以及破折號來識別組
plt.figure(figsize=(8,6))
ax = sns.lineplot(x="total_bill", y="tip",hue="sex", style="smoker",markers=True, dashes=True, palette='RdBu_r', data=tips)
plt.show()
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)
sizes:List、dict或tuple,可選,簡單點就是圖片大小,注意和size區分;
col、row:決定網格的面數的分類變量,很像tableau
ax=sns.relplot(x="total_bill",y="tip",hue='time',size='size',palette=['b','r'],col='time',row='sex',sizes=(20,200),data=tips)
2.Categorical Plots(分類圖)
2.1 Categorical scatterplots
2.1.1 Stripplot(分佈散點圖)
sns.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)
x,y,data:輸入數據可以多種格式傳遞,在大多數情況下,使用Numpy或Python對象是可能的,但是更可取的是pandas對象,因爲相關的名稱將用於對軸進行註釋。此外,還可以對分組變量使用分類類型來控制情節元素的順序。
order:字符串列表,用order參數進行篩選分類類別,例如:order=[‘Dinner’,‘Lunch’];
jitter:抖動項,表示抖動程度,可以使float,或者True;
dodge:重疊區域是否分開,當使用hue時,將其設置爲True,將沿着分類軸將不同色調級別的條帶分開。
orient:“v” | “h”,vertical(垂直) 和 horizontal(水平)的意思;
ax=sns.stripplot(x="day",y="total_bill",hue="time",order=['Sun','Thur','Fri'],data=tips,jitter=0.3,dodge=True,orient="v")
2.1.2 Swarmplot(分佈密度散點圖)
類似stripplot,只是對點位置沿着x軸方向進行了調整,使之更好展示值的分佈,但不能擴展到大量的觀察
sns.swarmplot(x="day",y="total_bill",hue="smoker",data=tips,dodge=True)
2.2 Categorical distribution plots
2.2.1 Boxplot(箱線圖)
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, ax=None, **kwargs)
color:所有元素的顏色,或漸變調色板的種子;
palette:用於``hue''變量不同級別的顏色;
saturation:飽和度,可設置爲1;
width:float,控制箱型圖的寬度大小;
fliersize:float,用於指示離羣值觀察的標記大小;
whis:IQR超出低四分位數和高四分位數的比例,以擴展情節須。超出此範圍的點將被識別為離羣值。
ax=sns.boxplot(x="day",y="total_bill",hue="time",data=tips,saturation=1.2,width=0.8,fliersize=5,palette="Set2")
2.2.2 Violinplot(小提琴圖)
小提琴圖與盒須圖類似。 它顯示了一個或多個分類變量在多個級別上的定量數據分佈,從而可以比較這些分佈。
不同於箱形圖,在箱形圖中所有圖分量都對應於實際數據點,小提琴圖的特徵在於對基礎分佈的核密度估計。
這可能是一次顯示多種數據分佈的有效且有吸引力的方法,但是估計過程受樣本量的影響,相對較小樣本的小提琴可能會誤導人。
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)
bw:‘scott’, ‘silverman’, float,控制擬合程度。在計算內核帶寬時,可以引用規則的名稱(‘scott’, ‘silverman’)或者使用比例(float)。實際內核大小將通過將比例乘以每個bin內數據的標準差來確定;
cut:空值外殼的延伸超過極值點的密度,float;
scale:“area”, “count”, “width”,用來縮放每把小提琴的寬度的方法;用於縮放每個小提琴寬度的方法。 如果是``area'',則每個小提琴將具有相同的 面積。 如果``計數'',則小提琴的寬度將根據該倉中的觀察數量進行縮放。 如果為``width'',則每個小提琴將具有相同的寬度。
scale_hue:當使用hue分類後,設置爲True時,此參數確定是否在主分組變量進行縮放;
gridsize:設置小提琴圖的平滑度,越高越平滑;
inner:“box”, “quartile”, “point”, “stick”, None,小提琴內部數據點的表示。分別表示:箱子,四分位,點,數據線和不表示;
split:是否拆分,當設置爲True時,繪製經hue分類的每個級別畫出一半的小提琴;
ax = sns.violinplot(x=tips["total_bill"])
ax = sns.violinplot(x="day", y="total_bill", hue="sex",data=tips, palette=sns.hls_palette(8, l = .8, s = .5),
split=True,scale="count", inner="quartile")
ax=sns.violinplot(x='tip',y='day',data=tips,palette='Set3',scale='count',inner=None,whis=np.inf)#np.inf只無窮大
ax=sns.stripplot(x='tip',y='day',data=tips,jitter=True,color='c',size=3)
2.3 Categorical estimate plots
2.3.1 Pointplot(點圖)
點圖通過散點圖的位置表示對數值變量的集中趨勢的估計,並使用誤差線提供了一些圍繞該估計的不確定性的指示,也就是點估計和置信區間。
在集中比較一個或多個分類變量的不同級別時,點圖比條形圖更有用。他們特別擅長顯示交互作用:一個分類變量的級別之間的關係如何在第二個分類變量的級別之間變化。從相同的``色相''層次連接每個點的直線允許通過斜率差異來判斷交互作用,這對眼睛而言比比較幾組點或條的高度更容易。
重要的是要記住,點圖僅顯示均值(或其他估計量),但是在許多情況下,顯示分類變量的每個級別上的值分佈可能更有益。在這種情況下,其他方法(例如方盒或小提琴圖)可能更合適。
pointplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, estimator=<function mean at 0x000001AB20B689D8>,
ci=95, n_boot=1000, units=None, seed=None, markers='o', linestyles='-', dodge=False, join=True, scale=1,
orient=None, color=None, palette=None, errwidth=None, capsize=None, ax=None, **kwargs)
order:選擇和空值順序,例如:order=[‘Sat’,‘Sun’]。
join:默認兩個均值點會相連接,若不想顯示,可以通過join=False參數實現。
scale:float,均值點(默認)和連線的大小和粗細。
estimator:可調用的向量->標量映射,可選統計函數,用於在每個分類箱中進行估計。默認均值。
ci:允許的誤差的範圍(控制誤差棒的百分比,在0-100之間),若填寫"sd",則用標準誤差(默認爲95),也可設置ci=None。
n_boot:計算置信區間時要使用的引導程序迭代次數。
seed:可選的Seed或隨機數生成器,用於可重現的引導程序。
errwidth:誤差線(和頂蓋)的粗細。
capsize:誤差條上“上限”的寬度。
ax:將繪圖繪製到的軸對象,否則使用當前軸。
ax=sns.pointplot(x='time',y='total_bill',data=tips)
ax=sns.pointplot(x='time',y='total_bill',hue='smoker',data=tips,dodge=True,estimator=np.median,markers=['o','x'],linestyles=['-','--'],color="#bb3f3f")
ax=sns.pointplot(x='time',y='total_bill',hue='smoker',data=tips,dodge=True,markers=['o','x'],linestyles=['-','--'],
palette="Set2",capsize=0.02)
2.3.2 Barplot(條形圖)
ax = sns.barplot(x="day", y="total_bill",hue='sex', order=['Sun','Sat','Thur','Fri'],data=tips, estimator=np.median,ci=95,
n_boot=1000,units=None,orient=None,color=None,palette='Set3',saturation=0.75,errcolor='c',errwidth=1,
capsize=0.2,dodge=True,ax=None)
plt.legend(loc='best')
plt.title("seaborn.barplot")
plt.show()
2.3.3 Countplot(計數統計圖)
ax=sns.countplot(x="day", hue="smoker", data=tips, palette='Set2')
ax=sns.countplot(y="day", hue="smoker", data=tips, facecolor=(0,0,0,0),linewidth=5,edgecolor=sns.color_palette("dark",4))
2.3.4 Catplot
sns.catplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=<function mean 0x0000026369D089D8>, ci=95, n_boot=1000, units=None, seed=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)
col_wrap:int,以該寬度“包裝”列變量,以使列構面跨越多行。與``行''構面不兼容。
order,hue_order:字符串列表,optiona,用於在其中繪製分類級別的順序,否則從數據對象推斷級別。
row_order,col_order:字符串列表,可選,用於組織網格中的行和/或列的順序,否則從數據對象中推斷順序。
kind:"point", "bar", "strip", "swarm","box", "violin", or "boxen"。
height:每個構面的高度(以英寸爲單位)。
Aspect:每個刻面的長寬比,以便``aspect * height''給出每個刻面的寬度,以英寸爲單位。
legend:在劇情上繪製圖例。
legend_out:將擴展圖形大小,並且將圖例在右上角的情節之外繪製。
share {x,y}:如果爲true,則構面將共享跨列的y軸和/或x軸跨行。
ax=sns.catplot(x='sex',y='total_bill',hue='smoker',col='time',height=5,aspect=1,data=tips,kind="violin")
ax=sns.catplot(x='time',col_wrap=2,col='day',height=3,aspect=1,data=tips,kind="count")
3.Distribution Plot(分佈圖)
3.1 Distplot(直方圖)
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)
a:系列,一維數組或列表。觀察到的數據。如果這是具有``name''屬性的Series對象,則該名稱將用於標記數據軸。
hist:bool,是否繪製(規範的)直方圖。
bins:箱子數量
kde:bool,是否繪製高斯核密度估計。
rug:bool。是否在支撐軸上繪製地毯圖。控制是否生成觀測數值的小細條(邊際毛毯)
fit:控制擬合的參數分佈圖形,能夠直觀地評估它與觀察數據的對應關係(黑色線條爲確定的分佈)
hist_kws:dict,可選。關鍵字參數:meth:`matplotlib.axes.Axes.hist`。
kde_kws:dict,可選。kdeplot的關鍵字參數。
rug_kws:dict,可選。rugflot的關鍵字參數。
color:matplotlib顏色,可選。顏色用於繪製除擬合曲線以外的所有內容。
vertical:bool,可選。如果爲True,則觀察值在y軸上。
norm_list:如果爲True,則直方圖高度顯示的是密度而不是計數。如果繪製了KDE或擬合的密度,則表示這是隱含的。
axlabel:字符串,False或None(可選)。支撐軸標籤的名稱。如果爲None,則嘗試從a.name獲取它;如果爲False,請不要設置標籤。
label:字符串,可選。圖的相關組件的傳奇標籤。
ax:matplotlib軸,可選。如果提供,請在該軸上繪圖。
np.random.seed(0)
x=np.random.randn(100)
ax=sns.distplot(x,hist=False,rug=True)
from scipy.stats import norm
ax = sns.distplot(x, fit=norm, kde=False)
ax=sns.distplot(x,vertical=True,fit=norm,color='m')
ax=sns.distplot(x,rug=True,rug_kws={"color":"g"},
kde_kws={"color":"k","lw":3,"label":"KDE"},
hist_kws={"histtype":"step","lw":3,"alpha":0.5,"color":"g"})
3.2 Kdeplot(核密度圖)
核密度估計(kernel density estimation)是在概率論中用來估計未知的密度函數,屬於非參數檢驗方法之一。
通過核密度估計圖可以比較直觀的看出數據樣本本身的分佈特徵
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)
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:這個參數指的是每個格網裏面,應該包含多少個點,越大,表示格網裏面的點越多。越小表示格網裏面的點越少;
cut:參數表示,繪製的時候,切除帶寬往數軸極限數值的多少,這個參數可以配合bw參數使用;
cumulative:是否繪製累積分佈;
shade_lowest:是否有最低值渲染,這個參數只有在二維密度圖上纔有效;
clip:表示查看部分結果,是一個區間;
cbar:參數若爲True,則會添加一個顏色棒(顏色幫在二元kde圖像中才有)。
mean,cov=[0,2],[(1,0.5),(0.5,1)]
x,y=np.random.multivariate_normal(mean,cov,size=50).T
ax=sns.kdeplot(x,shade=True,color='r')#單變量核密度圖
ax=sns.kdeplot(x,y,shade=True,shade_lowest=False,cbar='True',cmap='Blues')#雙變量核密度圖
3.3 Jointplot(聯合分佈圖)
聯合概率分佈簡稱聯合分佈,是兩個及以上隨機變量組成的隨機向量的概率分佈。
根據隨機變量的不同,聯合概率分佈的表示形式也不同。
對於離散型隨機變量,聯合概率分佈可以以列表的形式表示,也可以以函數的形式表示;對於連續型隨機變量,聯合概率分佈通過一非負函數的積分表示。
sns.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)
x,y:爲DataFrame中的列名或者是兩組數據,data指向dataframe;
kind : { “scatter” | “reg” | “resid” | “kde” | “hex” }。默認散點圖;
stat_func:用於計算統計量關係的函數;
ratio:中心圖與側邊圖的比例,越大、中心圖佔比越大;
dropna:去除缺失值;
height:圖的尺度大小(正方形);
space:中心圖與側邊圖的間隔大小;
xlim,ylim:x,y的範圍
ax=sns.jointplot(x="total_bill",y='tip',data=tips)
ax=sns.jointplot(x="total_bill",y="tip",kind='kde',data=tips,color='r')
iris=pd.read_excel(r'C:\Users\小Q11\OneDrive\Documents\數據集\iris.xlsx')
ax=(sns.jointplot("sepal_length", "sepal_width",data=iris,color="k").plot_joint(sns.kdeplot,zorder=0,n_levels=6))
x,y=np.random.randn(2,300)
axis=sns.jointplot(x,y,kind='hex').set_axis_labels("x","y")
ax=sns.jointplot("petal_length","sepal_length",data=iris,marginal_kws=dict(bins=15,rug=True),annot_kws=dict(stat="r"),
s=50,edgecolor="w",linewidth=2)
3.4 Pairplot(變量關係組圖)
sns.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, corner=False, dropna=True, plot_kws=None, diag_kws=None, grid_kws=None, size=None)
vars:變量名列表,要在data中使用的變量,否則將每列都使用數字數據類型。
{x,y} _vars:變量名列表,“數據”中的變量,分別用於圖中的行和列; 即製作一個非正方形的圖
kind:{‘scatter’, ‘reg’};
diag_kind:{‘auto’, ‘hist’, ‘kde’}。單變量圖(自己與自己比較)的繪圖,對角線子圖的圖樣。默認情況取決於是否使用“hue”
{plot,diag,grid} _kws:dicts。關鍵字參數的字典。 將plot_kws傳遞給雙變量繪圖函數,將diag_kws傳遞給單變量繪圖函數,將grid_kws傳遞給PairGrid構造函數。
axis=sns.pairplot(iris)
axis=sns.pairplot(iris,hue="species",vars=["sepal_width","sepal_length"],palette="husl",markers=["o","s","D"])
ax=sns.pairplot(iris,x_vars=["sepal_width","sepal_length"],y_vars=["petal_width","petal_length"])
4.Regression Plot(迴歸圖)
4.1 Lmplot
sns.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,
seed=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None, y_partial=None,
truncate=True, x_jitter=None, y_jitter=None, scatter_kws=None, line_kws=None, size=None)
x_estimator:可調用的映射向量->標量。將此函數應用於``x''的每個唯一值並繪製得出的估計值。如果給出``x_ci``,該估計將被引導並得出置信區間。
x_bins:整數或向量。將``x''變量綁定到離散的bin中,然後估計中心趨勢和置信區間。 這種裝箱僅影響散點圖的繪製方式; 迴歸仍然適合原始數據。
此參數被解釋爲均勻大小(不必要間隔)的垃圾箱數或垃圾箱中心的位置。 使用此參數時,意味着x_estimator的默認值爲numpy.mean。
order:多項式迴歸,控制進行迴歸的冪次。設定指數,可以用多項式擬合。
logistic:邏輯迴歸;
robust:如果是True,使用statsmodels來估計一個穩健的迴歸(魯棒線性模型)。這將減少異常值。請注意 logistic迴歸和robust迴歸相較於簡單線性迴歸需要更大的計算量,其置信區間的產生也依賴於bootstrap採樣,你可以關掉置信區間估計來提高速度(ci=None);
lowess:如果是True,使用statsmodels來估計一個非參數的模型(局部加權線性迴歸)。這種方法具有最少的假設,儘管它是計算密集型的,但目前無法爲這類模型繪製置信區間;
logx:轉化爲log(x)
truncate:bool,可選。默認情況下,在繪製散點圖之後,繪製迴歸線以填充x軸限制。 如果truncate爲True,它將受到數據限制的限制。
axis=sns.lmplot(x="total_bill",y="tip",hue="smoker",data=tips,markers=["o","x"],palette="Set1")#palette=dict(Yes="g", No="m")
axis=sns.lmplot(x="total_bill",y="tip",col="smoker",data=tips,x_jitter=0.1)
g=((sns.lmplot(x="total_bill",y="tip",row="sex",col="time",data=tips,height=5, aspect=1))
.set_axis_labels("Total bill (US Dollars)", "Tip")
.set(xlim=(0,60),ylim=(0,12),xticks=[10,30,50],yticks=[2,6,12])
.fig.subplots_adjust(wspace=0.02))
sns.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, seed=None, order=1, logistic=False, lowess=False, robust=False, logx=False, x_partial=None,
y_partial=None, truncate=True, dropna=True, x_jitter=None, y_jitter=None, label=None, color=None, marker='o',
scatter_kws=None, line_kws=None, ax=None)
axis=sns.regplot(x="total_bill",y="tip",data=tips,marker="x")
5. Matrix Plots(矩陣圖)
5.1 Heatmap
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)
normal_data=np.random.randn(10,12)
ax=sns.heatmap(normal_data,center=0,annot=True,fmt=".2f",cmap="YlGnBu",linewidths=.5)#annot_kws={'size':9,'weight':'bold', 'color':'w'}
5.2 Clustermap
......
6.FacetGrid
......
7.PairGrid
......
這幾個圖就不說了,感覺重複性挺高的,上面那些圖就可以實現了