以前粗略的學(xué)習(xí)過Matplotlib繪圖、Pandas繪圖(這里是pandas的常見繪圖總結(jié)),但是都未深入的去學(xué)習(xí)過,一遇到問題就翻文檔,效率低下。聽“他們”說matplotlib中的seaborn繪圖很好看而且實用,所以,這里系統(tǒng)的總結(jié)一下seaborn常見的圖形繪制。其目的也是很簡單,方便自己和給大家提供一些幫助(由于英文很菜,每次都查單詞,有些詞匯就翻譯的很生硬,還請諒解……)。
差點忘了,這里使用的數(shù)據(jù)還是seaborn的默認數(shù)據(jù),很多人再看seaborn的時候?qū)?shù)據(jù)一頭霧水,這里我將存放數(shù)據(jù)的GitHub放在這兒,理解數(shù)據(jù)的含義,對分析問題往往起著事半功倍的效果。
https://github.com/mwaskom/seaborn-data
根據(jù)Seaborn的API,具體如下:
Seaborn中介紹的第一種類型的圖就是Relational plots(關(guān)系圖),這里翻譯一下官網(wǎng)對他的解釋:“統(tǒng)計分析是理解數(shù)據(jù)集中變量如何相互關(guān)聯(lián)以及這些關(guān)系如何依賴于其他變量的過程??梢暬赡苁沁@個過程的核心部分,因為當(dāng)數(shù)據(jù)被正確地可視化時,人類視覺系統(tǒng)可以看到指示某種關(guān)系的趨勢和模式?!?br> Relational plots(關(guān)系圖)中主要討論的是三個seaborn函數(shù)。我們最常用的是relplot()。這是一個圖形級函數(shù)使用兩種常用方法可視化統(tǒng)計關(guān)系:散點圖(scatter plots)和線圖(line plots)。
1. scatterplot() (與kind='scatter';默認值) 2. lineplot() (與kind='line')
還是第一步,導(dǎo)入我們需要的各種模塊:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snssns.set(style='darkgrid') #這是seaborn默認的風(fēng)格
散點圖是統(tǒng)計可視化的重要組成部分。它使用點云來描述兩個變量的聯(lián)合分布,其中每個點代表數(shù)據(jù)集中的一個觀察。這種描繪可以推斷出大量關(guān)于它們之間是否有任何有意義的關(guān)系的信息。
在seaborn中有幾種(后面介紹)繪制散點圖的方法,當(dāng)兩個變量都是數(shù)字時,應(yīng)該使用的最基本的是scatterplot()功能。在Categorical plots(分類圖)中,我們將看到使用散點圖可視化分類數(shù)據(jù)的專門工具。
#scatterplot參數(shù)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)
在所有的seaborn繪圖時,里面的參數(shù)是眾多的,但是不用擔(dān)心,大部分參數(shù)是相同的,只有少部分存在差異,有些通過對單詞的理解就可知道其含義,這里我只根據(jù)每個具體的圖形重要的參數(shù)做一些解釋,并簡單的介紹這些常用參數(shù)的含義。
先來個簡單的散點圖,繪制看看效果
#數(shù)據(jù)來源可在seaborn的GitHub上查找tips = sns.load_dataset('tips')ax = sns.scatterplot(x='total_bill', y='tip', data=tips)
ax = sns.scatterplot(x='total_bill', y='tip',hue='day', style='time',size='size',data=tips)
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)
可以看出,參數(shù)并沒有較散點圖有較大的改變,所以話不多說,直接上圖:
還是下來個簡單的:
fmri = sns.load_dataset('fmri')ax = sns.lineplot(x='timepoint', y='signal', data=fmri)#陰影是默認的置信區(qū)間,可設(shè)置ci=0,將其去除
#使用標(biāo)記而不是破折號來識別組ax = sns.lineplot(x='timepoint', y='signal',hue='event', style='event',markers=True, dashes=False, data=fmri)
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)
relplot(關(guān)系圖)可以看做是lineplot和scatterplot的歸約,可以通過kind參數(shù)來指定畫什么圖形,重要參數(shù)解釋如下:
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)
g = sns.relplot(x='total_bill', y='tip', hue='time', size='size',palette=['b', 'r'], sizes=(10, 100),col='time',row='sex', data=tips)
Categorical plots(分類圖)可以具體分為下面三種類型,8個小圖:
stripplot(分布散點圖)的意思就是按照不同類別對樣本數(shù)據(jù)進行分布散點圖繪制。stripplot(分布散點圖)一般并不單獨繪制,它常常與boxplot和violinplot聯(lián)合起來繪制,作為這兩種圖的補充。
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)
基本的圖
tips = sns.load_dataset('tips')ax = sns.stripplot(x='day', y='total_bill', data=tips)
ax = sns.stripplot(x='day', y='total_bill', hue='smoker',data=tips, jitter=True,palette='Set2', dodge=True)
這個函數(shù)類似于stripplot(),但是對點進行了調(diào)整(只沿著分類軸),這樣它們就不會重疊。這更好地表示了值的分布,但它不能很好地擴展到大量的觀測。
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)
可以看出,swarmplot和stripplot參數(shù)上基本一致,少了jitter,因為它顯示的是分布密度,不需要添加抖動項。
ax = sns.swarmplot(x='day', y='total_bill', data=tips)
ax = sns.swarmplot(x='day', y='total_bill', hue='smoker',data=tips,palette='Set2', dodge=True)
boxplot(箱線圖,又稱為盒須圖、盒式圖)便于在變量之間或跨類別變量級別比較的方式,顯示定量數(shù)據(jù)的分布情況。框顯示數(shù)據(jù)集的四分位數(shù),線顯示分布的其余部分,它能顯示出一組數(shù)據(jù)的最大值、最小值、中位數(shù)及上下四分位數(shù),使用四分位數(shù)范圍函數(shù)的方法可以確定“離群值”的點。具體用法如下:
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)
ax = sns.boxplot(x='day', y='total_bill', data=tips)
#這些參數(shù)不一定要加,簡單最好,這里只是為了展示參數(shù)的含義ax = sns.boxplot(x='day', y='total_bill', hue='time',data=tips, linewidth=0.5,saturation=1,width=1,fliersize=3)
violinplot與boxplot扮演類似的角色,箱線圖展示了分位數(shù)的位置,它顯示了定量數(shù)據(jù)在一個(或多個)分類變量的多個層次上的分布,這些分布可以進行比較。不像箱形圖中所有繪圖組件都對應(yīng)于實際數(shù)據(jù)點,小提琴繪圖以基礎(chǔ)分布的核密度估計為特征,通過小提琴圖可以知道哪些位置的密度較高。在圖中,白點是中位數(shù),黑色盒型的范圍是下四分位點到上四分位點,細黑線表示須。外部形狀即為核密度估計。
這是一種可以同時顯示多個數(shù)據(jù)分布的有效和有吸引力的方法,但請記住,估計過程受樣本大小的影響,相對較小的樣本的小提琴手看起來可能會顯得非常平滑。具體用法如下:
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)
ax = sns.violinplot(x='day', y='total_bill', data=tips)
ax = sns.violinplot(x='day', y='total_bill', hue='sex',data=tips, palette='Set2', split=True,scale='count', inner=None)
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')
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')
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')
ax = sns.boxplot(x='tip', y='day', data=tips, whis=np.inf)ax = sns.swarmplot(x='tip', y='day', data=tips, color='c')
條形圖表示數(shù)值變量與每個矩形高度的中心趨勢的估計值,用矩形條表示點估計和置信區(qū)間,并使用誤差線提供關(guān)于該估計值附近的不確定性的一些指示。具體用法如下:
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)
根據(jù)性別分組:
ax = sns.barplot(x='day', y='total_bill', hue='sex', data=tips)
ax = sns.barplot(x='day', y='total_bill',hue='sex', data=tips, estimator=np.median,capsize=0.2,errcolor='c')
一個計數(shù)圖可以被認為是一個分類直方圖,而不是定量的變量?;镜腶pi和選項與barplot()相同,因此您可以比較嵌套變量中的計數(shù)。(工作原理就是對輸入的數(shù)據(jù)分類,條形圖顯示各個分類的數(shù)量)。具體參數(shù)如下:
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)
這里參數(shù)并沒有太多改變,orient就是改變方向。但是,值得注意的是缺少了一些參數(shù),而且countplot中不能同時輸入x和y,卻可以使用hue(這我就很納悶了???還望大佬解釋解釋)。
titanic = sns.load_dataset('titanic')ax = sns.countplot(x='class', hue='who', data=titanic)
用散點圖符號表示點估計和置信區(qū)間,點圖代表散點圖位置的數(shù)值變量的中心趨勢估計,并使用誤差線提供關(guān)于該估計的不確定性的一些指示。點圖可能比條形圖(barplot)更有用于聚焦一個或多個分類變量的不同級別之間的比較。他們尤其善于表現(xiàn)交互作用:一個分類變量的層次之間的關(guān)系如何在第二個分類變量的層次之間變化。連接來自相同色調(diào)等級的每個點的線允許交互作用通過斜率的差異進行判斷,這比對幾組點或條的高度比較容易。具體用法如下:
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)
tips = sns.load_dataset('tips')ax = sns.pointplot(x='time', y='total_bill', data=tips)
ax = sns.pointplot(x='time', y='total_bill', hue='smoker',data=tips,estimator=np.median,dodge=True, palette='Set2',markers=['o', 'x'],linestyles=['-', '--'])
該函數(shù)提供了對幾個軸級函數(shù)的訪問,這些函數(shù)使用幾種可視化表示形式之一顯示一個數(shù)字變量和一個或多個分類變量之間的關(guān)系。其實說白了就是利用kind參數(shù)來畫前面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)
有沒有發(fā)現(xiàn),它和regplot(關(guān)系圖)的使用方法差不多?
注:單個圖形里面的參數(shù)也是可以傳入里面的
繪制一個小提琴圖,按數(shù)據(jù)中的kind類別分組(數(shù)據(jù)中的),不要中心框線。
exercise = sns.load_dataset('exercise')g = sns.catplot(x='time', y='pulse', hue='kind',data=exercise, kind='violin',inner=None)
g = sns.catplot(x='time', y='pulse', hue='kind',kind='bar',col='diet', data=exercise,height=4, aspect=0.8)
直方圖又稱質(zhì)量分布圖,它是表示資料變化情況的一種主要工具。用直方圖可以解析出資料的規(guī)則性,比較直觀地看出產(chǎn)品質(zhì)量特性的分布狀態(tài),對于資料分布狀況一目了然,便于判斷其總體質(zhì)量分布情況。直方圖表示通過沿數(shù)據(jù)范圍形成分箱(好像是等距分箱?),然后繪制條以顯示落入每個分箱的觀測次數(shù)的數(shù)據(jù)分布。具體參數(shù)如下:
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)
設(shè)置隨機種子(666),隨機生成1000個符合正態(tài)分布的數(shù):
np.random.seed(666)x = np.random.randn(1000)ax = sns.distplot(x)
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')
核密度估計(kernel density estimation)是在概率論中用來估計未知的密度函數(shù),屬于非參數(shù)檢驗方法之一。通過核密度估計圖可以比較直觀的看出數(shù)據(jù)樣本本身的分布特征。具體用法如下:
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)
有木有覺得參數(shù)超多,所以說核密度圖還是比較難的(雖然容易畫,但原理很復(fù)雜)。下面看幾個簡單的例子:簡單生成一個多元正態(tài)分布(對numpy隨機分布不了解的朋友,可以看我總結(jié)的numpy函數(shù))。
mean, cov = [0, 2], [(1, .5), (.5, 1)]#這是一個多元正態(tài)分布x, y = np.random.multivariate_normal(mean, cov, size=50).Tax = sns.kdeplot(x)
ax=sns.kdeplot(x,y,shade=True,shade_lowest=False,cbar=True,color='r')
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)
聯(lián)合概率分布簡稱聯(lián)合分布,是兩個及以上隨機變量組成的隨機向量的概率分布。根據(jù)隨機變量的不同,聯(lián)合概率分布的表示形式也不同。對于離散型隨機變量,聯(lián)合概率分布可以以列表的形式表示,也可以以函數(shù)的形式表示;對于連續(xù)型隨機變量,聯(lián)合概率分布通過一非負函數(shù)的積分表示。具體參數(shù)如下:
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)
用邊緣直方圖繪制散點圖:
tips = sns.load_dataset('tips')g = sns.jointplot(x='total_bill', y='tip', data=tips,height=5)
iris = sns.load_dataset('iris')g = sns.jointplot('sepal_width', 'petal_length', data=iris,kind='kde', space=0,ratio=6 ,color='r')
在數(shù)據(jù)集中繪制成對關(guān)系的圖。默認情況下,該函數(shù)將創(chuàng)建一個軸網(wǎng)格,這樣數(shù)據(jù)中的每個變量都將通過跨一行的y軸和跨單個列的x軸共享。對對角線軸的處理方式不同,繪制的圖顯示該列中變量的數(shù)據(jù)的單變量分布。此外,還可以在行和列上顯示變量子集或繪制不同的變量。具體如下:
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)
采用默認格式繪制鳶尾花數(shù)據(jù)集,這樣對于分類問題來說并不能有效的觀察數(shù)據(jù)情況。
iris = sns.load_dataset('iris')g = sns.pairplot(iris)
g = sns.pairplot(iris, hue='species', markers=['o', 's', 'D'])
許多數(shù)據(jù)集都有著眾多連續(xù)變量。數(shù)據(jù)分析的目的經(jīng)常就是衡量變量之間的關(guān)系,lmplot() 是一個非常有用的方法,它會在繪制二維散點圖時,自動完成回歸擬合。具體參數(shù)如下:
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)
g = sns.lmplot(x='total_bill', y='tip', hue='smoker', data=tips)
將變量分為多行,并改變大?。?/p>
g = sns.lmplot(x='total_bill', y='tip', col='day', hue='day',data=tips, col_wrap=2, height=4)
regplot()和lmplot()都可以繪制線性回歸曲線。這兩個函數(shù)非常相似,甚至共有一些核心功能。具體參數(shù)如下:
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)
至于兩者有什么具體的區(qū)別,我也不清楚,但是感覺lmplot()要比regplot()強大一點……以后再總結(jié)吧,還是繼續(xù)繪圖。
g = sns.regplot(x='total_bill', y='tip',data=tips)
tips['big_tip'] = (tips.tip / tips.total_bill) > .175ax = sns.regplot(x='total_bill', y='big_tip', data=tips,logistic=True, n_boot=500, y_jitter=.03)
利用熱力圖可以看數(shù)據(jù)表里多個特征兩兩的相似度,類似于色彩矩陣。具體參數(shù)如下:
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)
繪制一個簡單的numpy數(shù)組的熱力圖:
x = np.random.rand(10, 12)ax = sns.heatmap(x)
x= np.random.rand(10, 10)ax = sns.heatmap(x,annot=True,annot_kws={'size':9,'weight':'bold', 'color':'w'},fmt='.2f')
clustermap() 可以將矩陣數(shù)據(jù)集繪制為層次聚類熱圖。具體參數(shù)如下:
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)
說實在的這個我也不太懂,就拋磚引玉的畫一下圖。
iris = sns.load_dataset('iris')species = iris.pop('species')g = sns.clustermap(iris)
在探索中多維數(shù)據(jù)時,一種有用的方法是在數(shù)據(jù)集的不同子集上繪制同一類型圖的多個子圖。該類將數(shù)據(jù)集映射到與數(shù)據(jù)集中變量級別相對應(yīng)的行和列網(wǎng)格中排列的多個軸上。它生成的圖形通常被稱為“格子”或“格子”繪圖,它可以使查看者快速觀察到有關(guān)復(fù)雜數(shù)據(jù)的大量信息。
FacetGrid當(dāng)您想要在數(shù)據(jù)集的子集中分別可視化變量的分布或多個變量之間的關(guān)系時,該類非常有用。一個FacetGrid可以與多達三個維度可以得出:row,col,和hue。前兩個與得到的軸陣列有明顯的對應(yīng)關(guān)系; 將hue變量視為沿深度軸的第三個維度,其中不同的級別用不同的顏色繪制。通過使用FacetGrid數(shù)據(jù)框初始化對象以及將形成網(wǎng)格的行,列或hue維度的變量名稱來使用該類。這些變量(hue)應(yīng)該是分類的或離散的,然后變量的每個級別的數(shù)據(jù)將用于沿該軸的小平面。此外,每個的relplot(),catplot()以及l(fā)mplot()在內(nèi)部使用這些對象。
在大多數(shù)情況下,與直接使用FacetGrid相比,使用圖形級函數(shù)(例如relplot()或catart()要好得多。具體參數(shù)如下:
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)
其實細心的您可能已經(jīng)發(fā)現(xiàn)某些具有相同的規(guī)律,不妨看看前面relplot()、catplot()、lmplot()的參數(shù),是不是基本上差不多呢?沒錯,其實上面三個繪圖函數(shù),都用到了FacetGrid()的思想。此外,pairplot()走某種意義上來說,也與他們很像。
FacetGrid并不能直接繪制我們想要的圖像,它的基本工作流程是FacetGrid使用數(shù)據(jù)集和用于構(gòu)造網(wǎng)格的變量初始化對象。然后,可以通過調(diào)用FacetGrid.map()或?qū)⒁粋€或多個繪圖函數(shù)應(yīng)用于每個子集 FacetGrid.map_dataframe(),最后,可以使用其他修改參數(shù)的方法調(diào)整繪圖。
下面展示具體實例:使用TIPS數(shù)據(jù)集初始化2x2個面網(wǎng)格:
tips = sns.load_dataset('tips')g = sns.FacetGrid(tips, col='time', row='smoker')#2*2
tips = sns.load_dataset('tips')g = sns.FacetGrid(tips, col='time', row='smoker')g = g.map(plt.scatter, 'total_bill', 'tip', color='c')
接下來比較一下FacetGrid.map()繪圖與relplot()、catplot()、lmplot()繪圖的區(qū)別(這里只比較relplot()來繪制散點圖):
sns.relplot(x='total_bill', y='tip', color='c',col='time', hue='smoker',data=tips)
用于繪制數(shù)據(jù)集中成對關(guān)系的子圖網(wǎng)格。該類將數(shù)據(jù)集中的每個變量映射到多軸網(wǎng)格中的列和行。不同的軸級繪圖函數(shù)可用于繪制上、下三角形的二元圖解,并可在對角線上顯示每個變量的邊緣分布。讀到這里你就會發(fā)現(xiàn),它和pairplot()有什么區(qū)別呢?
其實PairGrid和pairplot從原理來說是一樣的,但是前面我們可以發(fā)現(xiàn)pairplot繪制的圖像上、下三角形是關(guān)于主對角線對稱的,而PairGrid則可修改上、下三角形和主對角線的圖像形狀。具體事例如下:
iris = sns.load_dataset('iris')g = sns.PairGrid(iris,hue='species')g = g.map_upper(sns.scatterplot)#在上對角線子圖上用二元函數(shù)繪制的圖g = g.map_lower(sns.kdeplot,color='r')#在下對角線子圖上用二元函數(shù)繪制的圖g = g.map_diag(sns.kdeplot)#對角線單變量子圖
seaborn設(shè)置風(fēng)格的方法主要有三種:
set
,通用設(shè)置接口set_style
,風(fēng)格專用設(shè)置接口,設(shè)置后全局風(fēng)格隨之改變axes_style
,設(shè)置當(dāng)前圖(axes級)的風(fēng)格,同時返回設(shè)置后的風(fēng)格系列參數(shù),支持with關(guān)鍵字用法seaborn中主要有以下幾個主題:
sns.set_style('whitegrid') # 白色網(wǎng)格背景sns.set_style('darkgrid') # 灰色網(wǎng)格背景sns.set_style('dark') # 灰色背景sns.set_style('white') # 白色背景sns.set_style('ticks') # 四周加邊框和刻度
設(shè)置環(huán)境的方法也有3種:
set
,通用設(shè)置接口set_context
,環(huán)境設(shè)置專用接口,設(shè)置后全局繪圖環(huán)境隨之改變plotting_context
,設(shè)置當(dāng)前圖(axes級)的繪圖環(huán)境,同時返回設(shè)置后的環(huán)境系列參數(shù),支持with關(guān)鍵字用法sns.plotting_context('notebook') # 默認sns.plotting_context('paper')sns.plotting_context('talk')sns.plotting_context('poster')
seaborn風(fēng)格多變的另一大特色就是支持個性化的顏色配置。顏色配置的方法有多種,常用方法包括以下兩個:
color_palette
,基于RGB原理設(shè)置顏色的接口,可接收一個調(diào)色板對象作為參數(shù),同時可以設(shè)置顏色數(shù)量hls_palette
,基于Hue(色相)、Luminance(亮度)、Saturation(飽和度)原理設(shè)置顏色的接口,除了顏色數(shù)量參數(shù)外,另外3個重要參數(shù)即是hls同時,為了便于查看調(diào)色板樣式,seaborn還提供了一個專門繪制顏色結(jié)果的方法palplot。