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