作者:朱小五
來自:凹凸數據(ID:alltodata)
matplotlib是基於Python語言的開源項目,旨在為Python提供一個數據繪圖包。
相信大家都用過它來數據可視化,之前我還分享過25個常用Matplotlib圖的Python代碼。
可是你了解過它繪圖的核心原理嗎?
那不如來看看黃同學的這篇文章吧!
核心原理講解
使用matplotlib繪圖的原理,主要就是理解figure(畫布)、axes(坐標系)、axis(坐標軸)三者之間的關係。
以「美院學生張三寫生畫畫」為例,來說明這三者之間的關係。
張三的畫板
首先,張三想要畫畫,是不是需要在畫板上面準備一張畫布。對比到matplotlib中,就相當於初始化了一張figure(畫布),我們畫的任何圖形,都是在這張figure(畫布)上操作的。
接著,張三需要給figure(畫布)分配不同的區域,指定哪一塊兒究竟該畫什麼。對比到matplotlib中,就是需要指定axes(坐標系),每一個axes(坐標系)相當於一張畫布上的一塊區域。一張畫布上,可以分配不同區域,也就是說,一張畫布,可以指定多個axes(坐標系)。
最後,張三就是在分配好的不同區域上進行圖形繪製了,在一張畫布上,畫的最多的應該就是2D圖,也可以畫3D圖,如圖所示,張三在區域一畫了一個小狗,在區域二畫了一個小貓,在區域三畫了一個光頭強。對比到matplotlib中,我們在axes1中畫了一個條形圖,在axes2中畫了一個餅圖,在axes3中畫了一個折線圖。當是2D圖時,都會有一個X軸和一個Y軸;當是3D圖時,都會有一個X軸、一個Y軸和一個Z軸,這個軸就是我們所說的「坐標軸axis」。
matplotlib繪圖
通過上述分析,總結如下:一個figure(畫布)上,可以有多個區域axes(坐標系),我們在每個坐標系上繪圖,也就是說每個axes(坐標系)中,都有一個axis(坐標軸)。
特別注意:在matplotlib中,figure畫布和axes坐標軸並不能顯示的看見,我們能夠看到的就是一個axis坐標軸的各種圖形。
matplotlib庫的安裝與導入
1)安裝
pip install matplotlib
2)導入相關庫
現在你不需要關注下面代碼具體是什麼意思,有一個主觀印象即可。我將會在以後的文章中,給大家一一介紹你不懂的哪些參數。
import numpy as npimport pandas as pdimport matplotlib as mplimport matplotlib.pyplot as plt# 排除警告信息import warningswarnings.filterwarnings("ignore")# 列印版本信息display(np.__version__)display(pd.__version__)display(mpl.__version__)# matplotlib畫圖常見參數設置mpl.rcParams["font.family"] = "SimHei" # 設置字體mpl.rcParams["axes.unicode_minus"]=False # 用來正常顯示負號plt.rcParams['font.sans-serif']=['SimHei'] # 用來正常顯示中文標籤# 嵌入式顯示圖形%matplotlib inline
結果如下:
創建figure(畫布)的兩種方式
1)繪製一個最簡單的折線圖
import matplotlib as mplimport matplotlib.pyplot as pltx = [1,3,5,7]y = [4,9,6,8]plt.plot(x,y)plt.show()
結果如下:
結果分析:
在前面的敘述中,我們已經說過,想要使用matplotlib繪圖,必須先要創建一個figure(畫布)對象,然後還要有axes(坐標系)。但是觀察上述代碼,我們並沒有創建figure對象,那麼怎麼又可以畫圖呢?
對於上述疑問,接下來我們就要講述創建figure(畫布)的兩種方式。
2)創建figure(畫布)的兩種方式
* 隱式創建* 顯示創建
① 隱式創建figure對象
當第一次執行plt.xxx()畫圖代碼時,系統會去判斷是否已經有了figure對象,如果沒有,系統會自動創建一個figure對象,並且在這個figure之上,自動創建一個axes坐標系(注意:默認創建一個figure對象,一個axes坐標系)。
也就是說,如果我們不設置figure對象,那麼一個figure對象上,只能有一個axes坐標系,即我們只能繪製一個圖形。
② 隱式創建figure對象存在的問題
優勢:如果只是繪製一個小圖形,那麼直接使用plt.xxx()的方式,會自動幫我們創建一個figure對象和一個axes坐標系,這個圖形最終就是繪製在這個axes坐標系之上的。
劣勢:如果我們想要在一個figure對象上,繪製多個圖形,那麼我們就必須拿到每個個axes對象,然後調用每個位置上的axes對象,就可以在每個對應位置的坐標繫上,進行繪圖,如下圖所示。注意:如果figure對象是被默認創建的,那麼我們根本拿不到axes對象。因此,需要我們顯示創建figure對象。
③ 顯示創建figure對象:以後的文章會詳細講述布局設置
# 手動創建一個figure對象figure = plt.figure()# 獲取每個位置的axes對象axes1 = figure.add_subplot(2,1,1)axes2 = figure.add_subplot(2,1,1)
如圖所示:
舉例說明:
figure = plt.figure()axes1 = figure.add_subplot(2,1,1)axes2 = figure.add_subplot(2,1,1)axes1.plot([1,3,5,7],[4,9,6,8])axes2.plot([1,2,4,5],[8,4,6,2])figure.show()
結果如下:
完整的繪圖步驟
① 導庫
import matplotlib as mplimport matplotlib.pyplot as plt
② 創建figure畫布對象
如果繪製一個簡單的小圖形,我們可以不設置figure對象,使用默認創建的figure對象,當然我們也可以顯示創建figure對象。如果一張figure畫布上,需要繪製多個圖形。那麼就必須顯示的創建figure對象,然後得到每個位置上的axes對象,進行對應位置上的圖形繪製。
③ 根據figure對象進行布局設置
1*11*22*12*2...
④ 獲取對應位置的axes坐標系對象
figure = plt.figure()axes1 = figure.add_subplot(2,1,1)axes2 = figure.add_subplot(2,1,1)
⑤ 調用axes對象,進行對應位置的圖形繪製
這一步,是我們傳入數據,進行繪圖的一步。對於圖形的一些細節設置,都可以在這一步進行。
⑥ 顯示圖形
plt.show()或figure.show()如果在pycharm中繪圖的話,必須要加這句代碼,才能顯示。如果在notebook中進行繪圖,可以不用加這句代碼,而是自動顯示。
繪圖技巧(細節設置)
通過對matplotlib繪圖的原理,有所了解之後,我們需要學習的就是常見的matplotlib繪圖技巧。
* figure 畫布* axes 坐標系,一個畫布上可以有多個坐標系* axis 坐標軸,一個坐標系中可以有多個坐標軸,一般都是二維平面坐標系,或者三維立體坐標系* title 標題* legend 圖例* grid 背景網格* tick 刻度* axis label 坐標軸名稱* tick label 刻度名稱* major tick label 主刻度標籤 * minor tick label 副刻度標籤* line 線* style 線條樣式* marker 點標記* font 字體相關
常見的繪圖技巧如上所示,這些繪圖技巧都能夠很好的幫助我們畫出更美觀、更直觀的圖形。