使用pyplot和seaborn進行可視化
pyplot的一些知識
matplotlab中的對象:
matplotlib是面向對象的,在畫圖的時候我們了解一些對象,對我們畫圖是有幫助的。繪圖的對象大致分為三層:
- backend_bases.FigureCanvas : 圖表的繪制領域
- backend_bases.Renderer : 知道如何在FigureCanvas上繪圖
- artist.Artist : 知道如何使用Renderer在FigureCanvas上繪圖
這些是一層一層封裝起來的,從底層到高層依次為上面的畫布->顏料->畫家(canvas->renderer->artist)。但是我們平時畫圖的時候,基本是使用最上層的封裝Artist。我們在畫圖的時候使用的Figure,Axes,Axis都屬於Artist對象。關於這三者的區分是這樣的,Figure是我們運行程序後生成的圖片,Axes是一個坐標系(最常用的是笛卡爾坐標系,當然還有極坐標系等),我們在這個坐標系上面繪制出我們的圖形,Axis是一個坐標軸,比如笛卡爾坐標系中的X軸或者Y軸。
使用pyplot進行畫圖:
當我們進行畫圖的時候,需要有個figure還有一個axes,假如我們沒有指定的話,pyplot會默認為我們指定一個。用plt.plot()進行繪圖的時候,默認的是使用當前figure的當前axes進行繪圖。
使用subplot的時候,它返回一個axes供我們畫圖,subplot傳入的前三個參數是nrows,ncols,index。它表示的是我們在一個figure當中有 nrow*ncols個axes,我們使用第index個axes來進行畫圖。 當這些值均小於10的時候,可以直接將這三個數寫為一個三位數。比如plt.subplot(1,2,1) 和 plt.subplot(121)是一樣的,都表示創建一行兩列個axes,並且返回第第一個axes讓我們來畫圖。
除了可以指定多個axes以外,還可以指定多個figure, fig1 = plt.figure(1), fig2 = plt.figure(2)等。當number不存在的時候,會創建一個新的figure,當這個number是已經存在的figure.number的時候,它會切換到那個figure。
總之,pyplot是在當前figure上面的當前axes進行畫圖的藝術。
經典的畫圖的例子是這樣的,來自 官網Multiple subplots
import numpy as np import matplotlib.pyplot as plt x1 = np.linspace(0.0, 5.0) x2= np.linspace(0.0, 2.0) y1 = np.cos(2 * np.pi * x1) * np.exp(-x1) y2 = np.cos(2 * np.pi * x2) plt.subplot(2, 1, 1) plt.plot(x1, y1, ‘o-‘) plt.title(‘A tale of 2 subplots‘) plt.ylabel(‘Damped oscillation‘) plt.subplot(2, 1, 2) plt.plot(x2, y2, ‘.-‘) plt.xlabel(‘time (s)‘) plt.ylabel(‘Undamped‘) plt.show()
上面使用了兩個axes,(假如使用fig = plt.figure()會更加的正規)畫出的圖形是這樣的:
其實這裏主要是讓你明白畫圖的時候figure還有axes的概念,當我們畫一個圖的時候,總是畫在一個特定的figure的特定axes上面。
plt還有一個subplots方法,返回一個figure還有一組axes,這在我們繪制過個圖形當中非常的重要,在本文的最後將會看到例子。
Seaborn進行畫圖
seaborn是基於matplotlib進行的更上一層的封裝,如果說matplotlib是將容易的事情變容易,難的事情成為可能,那麽seaborn是將難的事情變的容易。下面我將用一些簡答的例子來說明seaborn的繪圖,更詳細的用法可以參考官網的API。
進行數據的準備:
import seaborn as sns from matplotlib import pyplot as plt #導入數據 titanic = sns.load_dataset(‘titanic‘) #做一些簡單的缺失值處理 titanic = titanic.drop(‘deck‘, axis=1) titanic[‘age‘].fillna(titanic[‘age‘].median(), inplace=True) titanic[‘embark_town‘].fillna(titanic[‘embark_town‘].mode()[0], inplace=True) titanic[‘embarked‘].fillna(titanic[‘embarked‘].mode()[0], inplace=True)
FacetGrid:觀察多變量之間的關系
假如想要觀察多變量之間的關系,我們可以使用FacetGrid。
FacetGrid 可以指定三個和我們想要觀察變量有關的變量,看他們對於目標變量的影響情況。row, col, hue分別是行,列,顏色。FacetGrid使用的一般流程是先創建FacetGrid對象,指定data,row,col,hue等信息,然後使用map來進行畫圖,這期間可以調用pyplot的函數,也可以調用seaborn的函數。
grid = sns.FacetGrid(titanic, row=‘pclass‘, col=‘survived‘) grid.map(plt.hist, ‘age‘, bins=20) plt.show()
從下面的圖片可以看出來,我們要觀察在不同的pclass和survived的情況下我們的age分布情況,這個時候,我們可以把survived指定為列,pclass指定為行, 在map函數裏面,第一個為指定的函數的繪圖方式,後面為該方式所使用的變量,該繪圖方式既可以是plt裏面的方法,也可以是seaborn裏面的方法。
分類變量
seaborn提供了很多繪制分類變量的方法,下面介紹一些
pointplot: 可以進行點圖的繪制
sns.pointplot( x=‘class‘,y=‘age‘, data=titanic) plt.show()
countplot: 可以對變量進行計數
sns.countplot(x=‘class‘, hue=‘sex‘, data=titanic) plt.show()
barplot:柱狀圖,可以看點估計和置信區間
sns.barplot(x=‘class‘, y=‘age‘, data=titanic)
plt.show()
boxplot 線箱圖,可以發現異常值
sns.boxplot( x=‘class‘,y=‘fare‘, data=titanic)
factorplot
factorplot本身是為分類變量準備的,它可以畫上面的所有類型的分類變量的圖,只需要指定kind類型就可以,包含{point
, bar
, count
, box
, violin
, strip
},默認的情況是點圖.
還有一些函數可以觀察多個變量之間的關系
pairplot 繪制兩兩變量之間的關系
sns.pairplot(data=titanic)
plt.show()
heatmap 可以展示出變量的相關情況
sns.heatmap(titanic.corr())
plt.show()
在一個figure上面繪制多個axes
上面的繪圖情況都是默認使用當前figure的當前axes,並且一個figure上面有一個axes,假如你想要在一個figure上面繪制多個axes的話,可以使用subplots和seaborn函數當中的ax參數
fig, (ax1, ax2, ax3) = plt.subplots(1,3, figsize=(15,5))
#我們在這裏生成一個fig和三個axes,在下面繪圖的時候只需要用ax參數來指定特定的axes就可以了 sns.barplot(x=‘class‘, y=‘age‘, data=titanic, ax=ax1) sns.countplot(x=‘sex‘, data=titanic, ax=ax2) sns.distplot(titanic[‘age‘], ax=ax3) plt.show()
參考:
matplotlib核心概念
繪圖: matplotlib核心剖析
Python圖表繪制:matplotlib繪圖庫入門
使用pyplot和seaborn進行可視化