使用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_1

其實這里主要是讓你明白畫圖的時候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里面的方法。

 

facetgrid

分類變量

seaborn提供了很多繪制分類變量的方法,下面介紹一些

pointplot: 可以進行點圖的繪制

sns.pointplot( x='class',y='age',  data=titanic)
plt.show()

 

pointplot

countplot:  可以對變量進行計數

sns.countplot(x='class', hue='sex',  data=titanic)
plt.show()

 

count_plot

barplot:柱狀圖,可以看點估計和置信區間

sns.barplot(x='class', y='age',  data=titanic)
plt.show()

 

barplot

boxplot 線箱圖,可以發現異常值

sns.boxplot( x='class',y='fare',  data=titanic)

boxplot

 

factorplot 

factorplot本身是為分類變量准備的,它可以畫上面的所有類型的分類變量的圖,只需要指定kind類型就可以,包含{point, bar, count, box, violin, strip},默認的情況是點圖.

還有一些函數可以觀察多個變量之間的關系

pairplot 繪制兩兩變量之間的關系

sns.pairplot(data=titanic)
plt.show()

pairplot

heatmap 可以展示出變量的相關情況

sns.heatmap(titanic.corr())
plt.show()

 這里的一些參數要說明一些:

  cmap:控制數字和色彩對應的參數。使用不同的參數,彩色條是不一樣的。

  cbar: 布爾類型,是否設置右邊的彩條。

  annot:bool類型或者矩形數據集。是否在顯示每個方格的注釋(annotate),即里面是不是顯示內容。

  annot_kws:配合annot使用,為ax.text的參數。

  square:bool類型,如果為True,那么設置每個方格的大小相等。

  

heatmap

 

在一個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()

multiaxes

 

參考:

matplotlib核心概念

繪圖: matplotlib核心剖析

Python圖表繪制:matplotlib繪圖庫入門

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM