Matplotlib 繪圖教程(seaborn使用)


一、實驗介紹

1.1 實驗內容

Matplotlib 是支持 Python 語言的開源繪圖庫,因爲其支持豐富的繪圖類型、簡單的繪圖方式以及完善的接口文檔,深受 Python 工程師、科研學者、數據工程師等各類人士的喜歡。這是 Matplotlib 繪圖課程的第 4 章節,將帶你瞭解以 Matplotlib 爲核心庫的高級繪圖庫 Seaborn,無需經過複雜的自定義即可繪製出更加漂亮的圖形。

1.2 實驗知識點

  • Seaborn 高級繪圖庫使用

1.3 實驗環境

  • python2.7
  • Xfce 終端
  • ipython 終端

1.4 適合人羣

本課程難度爲一般,屬於初級級別課程,適合具有 Python 基礎,並對使用 Matplotlib 繪圖感興趣的用戶。

二、使用 Seaborn 繪圖

2.1 Seaborn 簡介

Matplotlib 應該是基於 python 語言最優秀的繪圖庫了,但是它也有一個十分令人頭疼的問題,那就是太過於複雜了。3000 多頁的官方文檔,上千個方法以及數萬個參數,屬於典型的你可以用它做任何事,但又無從下手。

尤其是,當你像通過 Matplotlib 調出非常漂亮的效果時,往往會傷透腦筋,非常麻煩。

Seaborn 基於 Matplotlib 核心庫進行了更高級的 API 封裝,可以讓你輕鬆地畫出更漂亮的圖形。而 Seaborn 的漂亮主要體現在配色更加舒服、以及圖形元素的樣式更加細膩。

下圖是 Seaborn 官方給出的兩個示例。

此處輸入圖片的描述

我們列舉一下 Seaborn 的幾個特點:

  1. 內置數個經過優化的樣式效果。
  2. 增加調色板工具,可以很方便地爲數據搭配顏色。
  3. 單變量和雙變量分佈繪圖更爲簡單,可用於對數據子集相互比較。
  4. 對獨立變量和相關變量進行迴歸擬合和可視化更加便捷。
  5. 對數據矩陣進行可視化,並使用聚類算法進行分析。
  6. 基於時間序列的繪製和統計功能,更加靈活的不確定度估計。
  7. 基於網格繪製出更加複雜的圖像集合。

除此之外, Seaborn 對 Matplotlib 和 Pandas 的數據結構高度兼容 ,非常適合作爲數據挖掘過程中的可視化工具。

2.2 Seaborn 安裝

實驗樓的在線環境未預置 Seaborn 模塊,需要自行安裝。打開終端,並輸入安裝命令。一般情況下,會在幾秒鐘內安裝完畢。

sudo pip install seaborn

如果上述命令無法正常安裝,可以嘗試備用方案:

sudo pip install git+https://github.com/mwaskom/seaborn.git

三、Seaborn 繪圖實戰

3.1 如何對原圖樣式進行快速優化?

本課程前面的幾個章節,都是在介紹使用 Matplotlib 繪圖,並列舉了一些小例子。那麼,如何使用 Seaborn 對前面的示例進行快速的樣式優化?

答案:只需要增加兩行代碼。

我們用第 2 節裏繪製過的混合圖舉例,增加的兩行代碼如下:

import seaborn as sns # 導入 seaborn 模塊

sns.set() # 使用 set() 方法 1 步設置默認樣式

那麼,完整的代碼如下。注意,sns.set() 樣式設置語句需要放置在 Matplotlib 原本的繪圖語句前面。

import matplotlib.pyplot as plt
import seaborn as sns

x = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
y_bar = [3, 4, 6, 8, 9, 10, 9, 11, 7, 8]
y_line = [2, 3, 5, 7, 8, 9, 8, 10, 6, 7]

sns.set()

plt.bar(x, y_bar)
plt.plot(x, y_line, '-o', color='y')

plt.show()

你可以通過在線環境左下角的應用程序菜單 > 附件,打開 ipython 交互式終端執行代碼。

此處輸入圖片的描述

我們可以發現,相比於 Matplotlib 默認的純白色背景,Seaborn 默認的淺灰色網格背景看起來的確要細膩舒適一些。而柱狀圖的色調、座標軸的字體大小也都有一些變化。

這裏,sns.set() 採用了默認參數,分別爲:

sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=False, rc=None)

其中:

  • context='' 參數控制着默認的畫幅大小,分別有 {paper, notebook, talk, poster} 四個值。其中,poster > talk > notebook > paper
  • style='' 參數控制默認樣式,分別有 {darkgrid, whitegrid, dark, white, ticks},你可以自行更改查看它們之間的不同。
  • palette='' 參數爲預設的調色板。分別有 {deep, muted, bright, pastel, dark, colorblind} 等,你可以自行更改查看它們之間的不同。

剩下的 font='' 用於設置字體,font_scale= 設置字體大小,color_codes= 不使用調色板而採用先前的 'r' 等色彩縮寫。

Seaborn 一共擁有 50 多個 API 類,相比於 Matplotlib 數千個的規模,可以算作是短小精悍了。

接下來,對 Seaborn 常用的 API 逐一介紹,並通過幾個小例子,學會使用 Seaborn 繪圖。

3.2 seaborn.lmplot()

seaborn.lmplot() 是一個非常有用的方法,它會在繪製二維散點圖時,自動完成迴歸擬合。我們拿 UCI 提供的 iris 鳶尾花數據集舉例。

在繪圖之前,我們先熟悉一下 iris 鳶尾花數據集。數據集總共 150 行,由 5 列組成。分別代表:萼片長度、萼片寬度、花瓣長度、花瓣寬度、花的類別。其中,前四列均爲數值型數據,最後一列花的分類爲三種,分別是:Iris Setosa、Iris Versicolour、Iris Virginica。

導入這個數據集很簡單,這裏我們通過 Seaborn 內置的數據集類之間導入。下面,打開 ipython 終端。

import seaborn as sns  #載入 seaborn 模塊

iris_data = sns.load_dataset('iris')  # 導入 iris 數據集
print iris_data  #輸出預覽該數據集

此處輸入圖片的描述

好了,熟悉完數據集,接下來開始繪圖了。我們嘗試通過 seaborn.lmplot() 將第一列和第二列繪製爲散點圖。

# 載入繪圖模塊
import matplotlib.pyplot as plt
import seaborn as sns

# 加載數據
iris_data = sns.load_dataset('iris')

# 繪圖
sns.lmplot(x='sepal_length', y='sepal_width', hue='species', data=iris_data)
plt.show()

此處輸入圖片的描述

sns.lmplot() 裏的 xy 分別代表橫縱座標的列名。hue= 代表按照 species,即花的類別分類顯示,而 data= 自然就是關聯到數據集了。

由於 Seaborn 對 Pandas 的 DataFrame 數據格式高度兼容,所以一切變得異常簡單。繪製出來的圖也自動帶有圖例,並進行了線型迴歸擬合,還給出了置信區間。

3.3 seaborn.PairGrid

seaborn.PairGrid() 可以用來查看兩個維度數據之間的關係,用處當然也非常多了。比如,方便我們在數據分析過程中找出強關聯特徵。

# 載入繪圖模塊
import matplotlib.pyplot as plt
import seaborn as sns

# 加載數據
iris_data = sns.load_dataset('iris')

# 繪圖
sns.PairGrid(data=iris_data).map(plt.scatter)
plt.show()

seaborn.PairGrid() 用法非常簡單,只需要將整個數據集放進去,然後使用 seaborn.PairGrid().map() 設置繪圖的樣式,比如這裏選擇了 scatter 散點圖。

此處輸入圖片的描述

Seaborn 自動將 4 個維度的數值型數據進行兩兩配對,繪製除了 16 張散點圖。

如果你認爲一種顏色不好看,那麼只需要像上面一樣,添加 hue= 參數即可。比如,這裏按照花的類別顯示。

# 載入繪圖模塊
import matplotlib.pyplot as plt
import seaborn as sns

# 加載數據
iris_data = sns.load_dataset('iris')

# 繪圖
sns.PairGrid(data=iris_data, hue='species').map(plt.scatter)
plt.show()

此處輸入圖片的描述

3.4 seaborn.PairGrid

seaborn.PairGrid() 可以繪製出單變量和雙變量的組合圖,就如同本節一開始給出的第一張官方示例圖的效果,我們一起來看一下。

# 載入繪圖模塊
import matplotlib.pyplot as plt
import seaborn as sns

# 加載數據
iris_data = sns.load_dataset('iris')

# 繪圖
sns.JointGrid(data=iris_data, x='sepal_length', y='sepal_width')
plt.show()

你會發現,這樣繪製出來是一張空白圖。原因是我們沒有選擇圖的樣式。

此處輸入圖片的描述

sns.JointGrid().plot() 用於設置圖形的樣式。我們將中間的圖選爲雙變量的散點圖,而上面和右面選爲單變量的直方圖。更改一行代碼,其餘不變,再試一次。

sns.JointGrid(data=iris_data, x='sepal_length', y='sepal_width').plot(sns.regplot, sns.distplot)
plt.show()

這裏,我們選擇了 seaborn 帶有的迴歸擬合散點圖以及單變量分佈圖。

此處輸入圖片的描述

3.5 seaborn.kdeplot

seaborn.kdeplot() 主要是用於繪製單變量或二元變量的核密度估計圖。先看看單變量的效果。

# 載入繪圖模塊
import matplotlib.pyplot as plt
import seaborn as sns

# 加載數據
iris_data = sns.load_dataset('iris')

# 繪圖
sns.kdeplot(data=iris_data["sepal_length"])

plt.show()

繪製單變量時,直接將一維數組輸入即可。

此處輸入圖片的描述

你可以通過 kernel= 參數設置核函數,有 {'gau' | 'cos' | 'biw' | 'epa' | 'tri' | 'triw' }等,默認爲 kernel='gau'。還可以通過其他參數更改繪製的效果,例如。

sns.kdeplot(data=iris_data["sepal_length"], shade=True, color='y')

plt.show()

此處輸入圖片的描述

對於二元變量來講,就是再再輸入一個一維數組即可。

sns.kdeplot(data=iris_data["sepal_length"], data2=iris_data["sepal_width"], shade=True)

plt.show()

此處輸入圖片的描述

3.6 seaborn.heatmap

seaborn.heatmap() 主要是用於繪製熱力圖,也就類似於色彩矩陣。

# 載入繪圖模塊
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# 生成 10x10 的隨機矩陣
matrix_data = np.random.rand(10, 10)

# 繪圖
sns.heatmap(data=matrix_data)

plt.show()

此處輸入圖片的描述

3.7 seaborn.clustermap

seaborn.clustermap() 可以將矩陣數據集繪製爲層次聚類熱圖。我們依舊以 iris 數據集爲例,看一看效果。

# 載入繪圖模塊
import matplotlib.pyplot as plt
import seaborn as sns

# 加載數據
iris_data = sns.load_dataset('iris')
iris_data.pop("species")  #去掉了花的類別列

# 繪圖
sns.clustermap(iris_data)
plt.show()

此處輸入圖片的描述

3.8 其他

除了上面提到的這些類方法,還有一些可以用 seaborn 進行快速繪製的圖形樣式。這裏就不再一一介紹,示例圖和對應的方法如下所示。

此處輸入圖片的描述

四、實驗總結

本章節對 Seaborn 的用法進行了簡單的介紹。這裏需要說明一下 Seaborn 和 Matplotlib 之間的關係,Seaborn 並不是爲了替代 Matplotlib,而應當被看作是 Matplotlib 的補充。

對於 Matplotlib 而言,它高度可自定義,可以實現任何你想要的效果。而 Seaborn 非常簡單快捷,幾行代碼就可以畫出還不賴的圖形。

五、課後習題

自己動手實現 3.8 小節裏列舉的其他 6 種圖形樣式的繪製。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章