請(qǐng)關(guān)注+私信回復(fù):“學(xué)習(xí)”就可以拿到一份我為大家準(zhǔn)備的Python學(xué)習(xí)資料!image - 為什么用 Seaborn - Seaborn 是基于 Python 且非常受歡迎的圖形可視化庫(kù),在 Matplotlib 的基礎(chǔ)上,進(jìn)行了更高級(jí)的封裝,使得作圖更加方便快捷。即便是沒(méi)有什么基礎(chǔ)的人,也能通過(guò)極簡(jiǎn)的代碼,做出具有分析價(jià)值而又十分美觀的圖形。 Seaborn 可以實(shí)現(xiàn) Python 環(huán)境下的絕大部分探索性分析的任務(wù),圖形化的表達(dá)幫助你對(duì)數(shù)據(jù)進(jìn)行分析,而且對(duì) Python 的其他庫(kù)(比如 Numpy/Pandas/Scipy)有很好的支持。 那么現(xiàn)在開(kāi)始,十分鐘的時(shí)間,你就可以了解 Seaborn 中常用圖形的繪制方法,以及進(jìn)階的可視化分析技巧。 - Seaborn 繪圖上手 - 如果你還沒(méi)有安裝 Python 環(huán)境,那么推薦你安裝 Anaconda,對(duì)于上手 Python 來(lái)說(shuō)更加簡(jiǎn)單,不容易出差錯(cuò)。Anaconda 的安裝教程網(wǎng)上很多,找到對(duì)應(yīng)版本客戶端安裝即可。 安裝好后,即可在終端(cmd)安裝核心庫(kù) Seaborn 和 Matplotlib。 安裝 Matplotlib python -m pip install matplotlib 安裝 Seaborn pip install seaborn 然后打開(kāi) Jupyter Notebook(安裝好 Anaconda 后,Jupyter 也已裝好,在應(yīng)用窗口中可以找到),我們就可以直接上手了。 先來(lái)一段基本的代碼: import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.barplot(x='class',y='survived',data=titanic) image 通過(guò)以上代碼,我們就繪制出了基本的條形圖,是不是超級(jí)簡(jiǎn)單。這也是用 Seaborn 實(shí)現(xiàn)一個(gè)圖形的基本模式,接下來(lái)我們把上面的代碼拆開(kāi)來(lái)看。 1.導(dǎo)入繪圖模塊 import seaborn as sns import matplotlib.pyplot as plt 這里我們導(dǎo)入 Seaborn 和 Matplotlib.pyplot 模塊,分別命名為 sns 和 plt,原則上這個(gè)簡(jiǎn)稱是可以隨意寫(xiě)的,但為了規(guī)范,盡量寫(xiě)成這樣。這里引入 Matplotlib.pyplot ,是為了通過(guò) Matplotlib 的參數(shù)去進(jìn)行更好的控制。 2.提供顯示條件 %matplotlib inline 這里的 “%matplot inline” 是為了在 Jupyter 中正常顯示圖形,若沒(méi)有這行代碼,圖形顯示不出來(lái)的。 3.導(dǎo)入數(shù)據(jù) titanic=sns.load_dataset('titanic') 這里我們用 Seaborn 的 load_dataset() 方法導(dǎo)入數(shù)據(jù) ‘titanic’,這是泰坦尼克號(hào)的相關(guān)數(shù)據(jù),內(nèi)置于 Seaborn(內(nèi)置數(shù)據(jù)都可以用此方法導(dǎo)入)。當(dāng)然 Seaborn 還提供了其他的內(nèi)置數(shù)據(jù),可以直接調(diào)用: image 地址:https://github.com/mwaskom/seaborn-data 4.輸出圖形 sns.barplot(x='class',y='survived',data=titanic) 這是圖形輸出的直接代碼,barplot 表示輸出條形圖,同樣的還有 Seaborn 中還有 countplot、boxplot、violinplot、regplot、lmplot、heatmap 等多種圖形方法可以使用,我們?cè)诮酉聛?lái)會(huì)詳細(xì)說(shuō)明。 barplot() 括號(hào)里的是需要設(shè)置的具體參數(shù),涉及到數(shù)據(jù)、顏色、坐標(biāo)軸、以及具體圖形的一些控制變量,一般比較固定的是 'x'、'y'、'data',分別表示x軸,y軸,以及選擇的數(shù)據(jù)集。 - Seaborn 圖形可視化 - 01 distplot 直方圖 通常我們?cè)诜治鲆唤M數(shù)據(jù)時(shí),首先要看的就是變量的分布規(guī)律,而直方圖則提供了簡(jiǎn)單快速的方式,在 Seaborn 中可以用 distplot() 實(shí)現(xiàn)。 我們首先導(dǎo)入數(shù)據(jù)集 'titanic',并查看隨機(jī)的10行數(shù)據(jù),對(duì)數(shù)據(jù)集有一個(gè)初步的印象: import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline #導(dǎo)數(shù)數(shù)據(jù)集'titanic' titanic=sns.load_dataset('titanic') #查看數(shù)據(jù)集的隨機(jī)10行數(shù)據(jù),用sample方法 titanic.sample(10) image 通過(guò)觀察數(shù)據(jù),我們對(duì)'age'進(jìn)行直方圖展示。但在繪圖之前,我們觀測(cè)到'age'字段中存在缺失值,需要先用 dropna() 方法刪掉存在缺失值的數(shù)據(jù),否則無(wú)法繪制出圖形。 #去除'age'中的缺失值,distplot不能處理缺失數(shù)據(jù) age1=titanic['age'].dropna() sns.distplot(age1) image 在上圖中,矩形表示在不同年齡段的數(shù)量分布,并且 distplot() 默認(rèn)擬合出了密度曲線,可以看出分布的變化規(guī)律。 同時(shí)我們可以調(diào)節(jié)其中的一些參數(shù),來(lái)控制輸出的圖形。 'kde' 是控制密度估計(jì)曲線的參數(shù),默認(rèn)為 True,不設(shè)置會(huì)默認(rèn)顯示,如果我們將其設(shè)為 False,則不顯示密度曲線。 #去掉擬合的密度估計(jì)曲線,kde參數(shù)設(shè)為False sns.distplot(age1,kde=False) image 'bins'是控制分布矩形數(shù)量的參數(shù),通常我們可以增加其數(shù)量,來(lái)看到更為豐富的信息。 # 通過(guò)'bins'參數(shù)設(shè)定數(shù)據(jù)片段的數(shù)量 sns.distplot(age1,bins=30,kde=False) image 'reg' 參數(shù)用于控制直方圖中的邊際毛毯,通過(guò)控制'reg'是實(shí)現(xiàn)毛毯是否顯示。 #創(chuàng)建一個(gè)一行2列的畫(huà)布,主要方便對(duì)比 fig,axes=plt.subplots(1,2) #設(shè)置'reg'參數(shù),加上觀測(cè)數(shù)值的邊際毛毯 #需要用axes[]表示是第幾張圖,從0開(kāi)始 sns.distplot(age1,ax=axes[0]) #左圖 sns.distplot(age1,rug=True,ax=axes[1]) #右圖 image 當(dāng)然,除了控制矩形分布、密度曲線及邊際毛毯是否顯示,還可以通過(guò)更豐富的參數(shù)控制他們展示的細(xì)節(jié),這些通過(guò)參數(shù) 'hist_kws' 、'kde_kws' 、'reg_kws' 來(lái)進(jìn)行設(shè)置,因?yàn)槠渲猩婕暗蕉鄠€(gè)參數(shù),參數(shù)間用逗號(hào)隔開(kāi),參數(shù)外面用大括號(hào)括住。 #可以分別控制直方圖、密度圖的關(guān)鍵參數(shù) fig,axes=plt.subplots(1,2) sns.distplot(age1,rug=True,ax=axes[0]) sns.distplot(age1,rug=True, hist_kws={'color':'green','label':'hist'}, kde_kws={'color':'red','label':'KDE'}, ax=axes[1]) image 02 barplot 條形圖 barplot() 利用矩陣條的高度反映數(shù)值變量的集中趨勢(shì),以及使用errorbar功能(差棒圖)來(lái)估計(jì)變量之間的差值統(tǒng)計(jì)(置信區(qū)間)。需要提醒的是 barplot() 默認(rèn)展示的是某種變量分布的平均值(可通過(guò)參數(shù)修改為 max、median 等)。 這里我們?nèi)匀灰?#39;titanic'數(shù)據(jù)集作為展示,將'class'設(shè)為x軸,'survived'設(shè)為y軸。 import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline #導(dǎo)入數(shù)據(jù)集'titanic',命名為'titanic' titanic=sns.load_dataset('titanic') #將'class'設(shè)為x軸,'survived'為y軸,傳入'titanic'數(shù)據(jù) sns.barplot(x='class',y='survived',data=titanic) image 我們可以通過(guò)設(shè)置'hue'參數(shù),對(duì)x軸的數(shù)據(jù)進(jìn)行細(xì)分,細(xì)分的條件就是'hue'的參數(shù)值,比如這里我們的x軸是'class'(倉(cāng)位等級(jí)),我們將其按'sex'(性別)再進(jìn)行細(xì)分。 sns.barplot(x='class',y='survived',hue='sex',data=titanic) image 換一組數(shù)據(jù)試試,將x軸設(shè)為'embarked',y軸設(shè)為'survived',并用'class'進(jìn)行細(xì)分。 sns.barplot(x='embarked',y='survived', hue='class',data=titanic) image 03 countplot 計(jì)數(shù)圖 countplot 故名思意,計(jì)數(shù)圖,可將它認(rèn)為一種應(yīng)用到分類變量的直方圖,也可認(rèn)為它是用以比較類別間計(jì)數(shù)差。當(dāng)你想要顯示每個(gè)類別中的具體觀察數(shù)量時(shí),countplot 很容易實(shí)現(xiàn),比較類似我們?cè)?Excel 等軟件中應(yīng)用的條形圖。 同樣,我們以數(shù)據(jù)集'titanic'為例子,首先探索'deck'字段下的類別計(jì)數(shù)。 image import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.countplot(x='deck',data=titanic) image 由此可見(jiàn),我們選定某個(gè)字段,countplot() 會(huì)自動(dòng)幫我們統(tǒng)計(jì)該字段下各類別的數(shù)目。當(dāng)然,我們也可以再傳入'hue'參數(shù),進(jìn)行細(xì)分,這里我們加入'sex'分類。 sns.countplot(x='deck',hue='sex',data=titanic) image 如果我們希望調(diào)換橫縱坐標(biāo),也就是類別放于縱坐標(biāo),計(jì)數(shù)值橫坐標(biāo)顯示,將x軸換為y軸即可。 sns.countplot(y='deck',hue='who',data=titanic) image 04 stripplot/swarmplot 散點(diǎn)圖 在seaborn中有兩種不同的分類散點(diǎn)圖。stripplot() 使用的方法是用少量的隨機(jī)“抖動(dòng)”調(diào)整分類軸上的點(diǎn)的位置,swarmplot() 表示的是帶分布屬性的散點(diǎn)圖。 import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.stripplot(x='embarked',y='fare',data=titanic) image 這里我們可以通過(guò)設(shè)置'jitter'參數(shù)控制抖動(dòng)的大小。 sns.stripplot(x='embarked',y='fare', data=titanic,jitter=1) image swarmplot() 方法使用防止它們重疊的算法沿著分類軸調(diào)整點(diǎn)。它可以更好地表示觀測(cè)的分布,它適用于相對(duì)較小的數(shù)據(jù)集。 sns.swarmplot(x='embarked',y='fare',data=titanic) image 可以通過(guò)'hue'參數(shù),對(duì)散點(diǎn)圖添加更多細(xì)分的維度,Seaborn 中會(huì)以顏色來(lái)進(jìn)行區(qū)分。 sns.stripplot(x='embarked',y='age',hue='who',jitter=1,data=titanic) image sns.swarmplot(x='embarked',y='age',hue='who',data=titanic) image 05 boxplot 箱線圖 boxplot(箱線圖)是一種用作顯示一組數(shù)據(jù)分散情況的統(tǒng)計(jì)圖。它能顯示出一組數(shù)據(jù)的最大值、最小值、中位數(shù)及上下四分位數(shù)。因形狀如箱子而得名。這意味著箱線圖中的每個(gè)值對(duì)應(yīng)于數(shù)據(jù)中的實(shí)際觀察值。 image 以'titanic'數(shù)據(jù)集為例,我們首先來(lái)探索不同的'class'(船艙)下的乘客的'age'(年齡)情況。 import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.boxplot(x='class',y='age',data=titanic) image 同樣的,可以通過(guò)傳入'hue'的參數(shù),來(lái)對(duì)x軸的字段進(jìn)行細(xì)分,這里我們通過(guò)'who'來(lái)進(jìn)行分類觀察。 sns.boxplot(x='class',y='age',hue='who',data=titanic) image 與上述類似,我們也可以通過(guò)調(diào)換x/y軸,實(shí)現(xiàn)箱線圖的橫向顯示。 sns.boxplot(x='age',y='class',hue='who',data=titanic) image 調(diào)節(jié)'order' 和 'hue_order' 參數(shù),我們可以控制x軸展示的順序。 fig,axes=plt.subplots(1,2) sns.boxplot(x='class',y='age',hue='who', data=titanic,ax=axes[0]) sns.boxplot(x='class',y='age',hue='who',data=titanic, order=['Third','Second','First'], hue_order=['child','woman','man'],ax=axes[1]) image 可以通過(guò)'linewidth'參數(shù),控制線條的粗細(xì)。我們把'linewidth'參數(shù)設(shè)為1,就可以看到整體圖形的線條變細(xì),你可以根據(jù)自己的需要調(diào)節(jié)。 sns.boxplot(x='class',y='age',hue='who', linewidth=1,data=titanic) image 06 violinplot 小提琴圖 小提琴圖其實(shí)是箱線圖與核密度圖的結(jié)合,箱線圖展示了分位數(shù)的位置,小提琴圖則展示了任意位置的密度,通過(guò)小提琴圖可以知道哪些位置的密度較高。 在圖中,白點(diǎn)是中位數(shù),黑色盒型的范圍是下四分位點(diǎn)到上四分位點(diǎn),細(xì)黑線表示須。外部形狀即為核密度估計(jì)。 與箱線圖進(jìn)行對(duì)比,同樣以'titanic'數(shù)據(jù)集為例,我們來(lái)探索不同的'class'(船艙)下乘客的'age'(年齡)情況。 import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.violinplot(x='class',y='age',data=titanic) image 同樣,可以設(shè)置'hue'參數(shù),對(duì)字段進(jìn)行細(xì)分。 sns.violinplot(x='class',y='age',hue='who',data=titanic) image 當(dāng)hue參數(shù)只有兩個(gè)級(jí)別時(shí),也可以通過(guò)設(shè)置'split'參數(shù)為T(mén)rue,“拆分”小提琴,提琴兩邊分別表示兩個(gè)分類的情況,這樣可以更有效地利用空間。 sns.violinplot(x='class',y='age',hue='alive', data=titanic,split=True) image 我們可以在小提琴內(nèi)部添加圖形來(lái)幫助我們進(jìn)行分析,這里就需要控制'inner'參數(shù)。 sns.violinplot(x='class',y='age',hue='alive', data=titanic,split=True,inner='stick') image 我們甚至可以把上面提到的散點(diǎn)圖加入小提琴圖中。 sns.violinplot(x='class',y='age',data=titanic,inner=None) sns.swarmplot(x='class',y='age',data=titanic,color='white') image 07 regplot/lmplot 回歸圖 Seaborn 中利用 regplot() 和 lmplot() 來(lái)進(jìn)行回歸,確定線性關(guān)系,它們密切相關(guān),共享核心功能,但也有明顯的不同。 這里我們使用 Seaborn 自帶的數(shù)據(jù)集'iris'來(lái)繪制回歸相關(guān)的圖形。首先我們導(dǎo)入收據(jù)來(lái)看看數(shù)據(jù)集的大概情況: import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline #導(dǎo)入數(shù)據(jù)集'iris' iris=sns.load_dataset('iris') #隨機(jī)查看數(shù)據(jù)集的10行數(shù)據(jù) iris.sample(10) image 數(shù)據(jù)集非常簡(jiǎn)單,總共是5個(gè)字段,我們首先來(lái)看 'sepal_length' 和 'petal_length' 之間的線性關(guān)系。 sns.regplot(x='sepal_length',y='petal_length',data=iris) image 圖中的點(diǎn)表示實(shí)際的數(shù)據(jù)點(diǎn),Seaborn 根據(jù)這些數(shù)據(jù)擬合出直線,表示x軸和y軸對(duì)應(yīng)字段之間的線性關(guān)系,直線周圍的陰影表示置信區(qū)間。 關(guān)于置信區(qū)間,可以通過(guò)設(shè)置'ci'參數(shù)控制是否顯示。 sns.regplot(x='sepal_length',y='petal_length',data=iris,ci=None) image 可以通過(guò)'color'和'marker'參數(shù)來(lái)控制圖形的顏色以及數(shù)據(jù)點(diǎn)的形狀。 fig,axes=plt.subplots(1,2) sns.regplot(x='sepal_length',y='petal_length',data=iris, color='r',marker='+',ax=axes[0]) sns.regplot(x='sepal_length',y='petal_length',data=iris, color='g',marker='*',ax=axes[1]) image lmplot() 可以設(shè)置hue,進(jìn)行多個(gè)類別的顯示,而 regplot() 是不支持的。這里我們通過(guò)設(shè)置hue='species',來(lái)進(jìn)行分類別地展示。 sns.lmplot(x='sepal_length',y='petal_length', hue='species',data=iris) image 同樣的,我們也可以更改數(shù)據(jù)點(diǎn)的形狀,來(lái)進(jìn)行區(qū)分。 sns.lmplot(x='sepal_length',y='petal_length',hue='species', data=iris,markers=['*','o','+']) image 設(shè)置'fit_reg'參數(shù),可以控制是否顯示擬合的直線。 sns.lmplot(x='sepal_length',y='petal_length',hue='species', data=iris,markers=['*','o','+'],fit_reg=False) image 如果要對(duì)不同的類別分開(kāi)繪制,用'col'參數(shù)代替'hue'。 sns.lmplot(x='sepal_length',y='petal_length', col='species',data=iris) image 08 heatmap 熱力圖 熱力圖通常用來(lái)表示特征之間的相關(guān)性,一般通過(guò)顏色的深淺來(lái)表示數(shù)值的大小或者相關(guān)性的高低。 這里我們導(dǎo)入 Seaborn 自帶的另一個(gè)數(shù)據(jù)集'flights',來(lái)繪制熱力圖。先查看數(shù)據(jù)前10行的情況: import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline flights = sns.load_dataset('flights') flights.head(10) image 我們以'year'為縱軸,'month'為橫軸,'passengers'的值為標(biāo)準(zhǔn)繪制熱力圖。 f=flights.pivot('year','month','passengers') sns.heatmap(f) image 如果要顯示具體的數(shù)值,可以通過(guò)'annot'參數(shù)來(lái)控制。 sns.heatmap(f, annot=True,fmt='d') image 通過(guò) Seaborn 的調(diào)色板控制熱力圖顯示的顏色,調(diào)色板在后續(xù)會(huì)有詳細(xì)的說(shuō)明,這里只做演示,示例熱力圖的顏色調(diào)節(jié)機(jī)制。 cmap = sns.diverging_palette(200,20,sep=20,as_cmap=True) sns.heatmap(f,cmap=cmap) image - 圖形控制的藝術(shù) - 前面我們利用 Seaborn 繪制了各種類型的圖形,對(duì)于基本的快速分析,其實(shí)已經(jīng)足夠,但是在細(xì)節(jié)的調(diào)節(jié)、顏色、美觀度等方面我們還可以進(jìn)行精細(xì)化的控制。 首先我們利用 Numpy 創(chuàng)建一組數(shù)據(jù)(20行6列的隨機(jī)數(shù)),然后利用 Seaborn 創(chuàng)建一個(gè)箱線圖來(lái)進(jìn)行展示。 import numpy as np import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline #創(chuàng)建一個(gè)20行6列的數(shù)據(jù) data = np.random.normal(size=(20, 6)) + np.arange(6) / 2 sns.boxplot(data=data) image 圖形背景 Seaborn 中有 white / whitegrid / dark / darkgrid / ticks 幾種樣式,用 set_style() 函數(shù)控制,分別如下: whitegrid 白色網(wǎng)格背景 white 白色背景(默認(rèn)) darkgrid 黑色網(wǎng)格背景 dark 黑色背景 ticks 四周帶有刻度的白色背景 # 設(shè)為白色網(wǎng)格背景 sns.set_style('whitegrid') sns.boxplot(data=data) image # 設(shè)為黑色網(wǎng)格背景 sns.set_style('darkgrid') sns.boxplot(data=data) image 調(diào)色板 seaborn 中的分類色板,主要用 color_palette() 函數(shù)控制,color_palette() 不寫(xiě)參數(shù)則顯示為 Seaborn 默認(rèn)顏色。如果需要設(shè)置所有圖形的顏色,則用 set_palette() 函數(shù)定義。 Seaborn 中6個(gè)默認(rèn)的顏色循環(huán)主題分別為: deep, muted, pastel, bright, dark, colorblind,下面我們列舉演示。 # 設(shè)置顏色模式為'deep' sns.boxplot(data=data,palette=sns.color_palette('deep')) image # 設(shè)置顏色模式為'pastel' sns.boxplot(data=data,palette=sns.color_palette('pastel')) image 需要注意的是,除了默認(rèn)的顏色模式有10中顏色外,其他的顏色模式只有6種顏色,如果需要更多顏色,那么則需要采用hls色彩空間。 #創(chuàng)建一個(gè)20行10列的數(shù)據(jù)'data2' data2 = np.random.normal(size=(20, 10)) + np.arange(10) / 2 #利用hls色彩空間進(jìn)行調(diào)色 sns.boxplot(data=data2, palette=sns.color_palette('hls', 10)) image 我們也可以通過(guò)簡(jiǎn)單的設(shè)置,得到單色漸變的效果,默認(rèn)顏色由淺到深。 #可以嘗試 Reds/Greens,默認(rèn)顏色由淺到深 sns.boxplot(data=data,palette=sns.color_palette('Blues')) image 顯示中文 Seaborn 對(duì)中文的顯示不太友好,如果在遇到亂碼問(wèn)題時(shí),可以加入下面的代碼。 # 指定默認(rèn)字體 mpl.rcParams['font.sans-serif'] = ['SimHei'] # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問(wèn)題 mpl.rcParams['axes.unicode_minus'] = False 保存圖片 畫(huà)出的圖形我們需要保存,可以先建立一個(gè)畫(huà)布,設(shè)置我們圖像的大小,然后將這個(gè)畫(huà)布保存下來(lái)。 #設(shè)置一個(gè)(12,6)的畫(huà)布 plt.figure(figsize=(12, 6)) #圖形繪制代碼 sns.boxplot(data=data,palette=sns.color_palette('Blues')) #將畫(huà)布保存為'xiang.png',還可以保存為jpg、svg格式圖片 plt.savefig('xiang.png') image 關(guān)于 Seaborn,基本的圖形繪制到這里就差不多了,雖然只是最常規(guī)的圖形,但是足夠讓你開(kāi)始嘗試探索數(shù)據(jù),快速繪圖并獲得分析結(jié)果。 當(dāng)然,這絕對(duì)不是 Seaborn 的全部,如果進(jìn)行更精細(xì)化的參數(shù)設(shè)置,如何做出信息更多、更加美觀的圖形,還有很多需要去了解的細(xì)節(jié)。 探索性數(shù)據(jù)分析的路很長(zhǎng),但開(kāi)始足夠簡(jiǎn)單,去創(chuàng)造屬于你的圖形吧。 下面是為初學(xué)者們準(zhǔn)備的python電子書(shū)籍資料和python入門(mén)教程! |
|
來(lái)自: flyk0tcfb46p9f > 《AI》