1. 程式人生 > >使用pyplot和seaborn進行可視化

使用pyplot和seaborn進行可視化

nbsp 只需要 高層 例子 port 目標 很多 觀察 pcl

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進行可視化