Python 繪圖庫(kù) Matplotlib 入門(mén)教程
運(yùn)行環(huán)境
由于這是一個(gè)Python語(yǔ)言的軟件包,因此需要你的機(jī)器上首先安裝好Python語(yǔ)言的環(huán)境。關(guān)于這一點(diǎn),請(qǐng)自行在網(wǎng)絡(luò)上搜索獲取方法。
關(guān)于如何安裝Matplotlib請(qǐng)參見(jiàn)這里:Matplotlib Installing。
筆者推薦大家通過(guò)pip的方式進(jìn)行安裝,具體方法如下:
sudo pip3 install matplotlib
本文中的源碼和測(cè)試數(shù)據(jù)可以在這里獲?。?a rel="external nofollow" >matplotlib_tutorial
本文的代碼示例會(huì)用到另外一個(gè)Python庫(kù):NumPy。建議讀者先對(duì)NumPy有一定的熟悉,我之前也寫(xiě)過(guò)一個(gè)NumPy的基礎(chǔ)教程,參見(jiàn)這里:Python 機(jī)器學(xué)習(xí)庫(kù) NumPy 教程。
本文的代碼在如下環(huán)境中測(cè)試:
- Apple OS X 10.13
- Python 3.6.3 matplotlib 2.1.1
- numpy 1.13.3
介紹
Matplotlib適用于各種環(huán)境,包括:
- Python腳本
- IPython shell Jupyter notebook
- Web應(yīng)用服務(wù)器
- 用戶(hù)圖形界面工具包
使用Matplotlib,能夠的輕易生成各種類(lèi)型的圖像,例如:直方圖,波譜圖,條形圖,散點(diǎn)圖等。并且,可以非常輕松的實(shí)現(xiàn)定制。
入門(mén)代碼示例
下面我們先看一個(gè)最簡(jiǎn)單的代碼示例,讓我們感受一下Matplotlib是什么樣的:
# test.py import matplotlib.pyplot as plt import numpy as np data = np.arange(100, 201) plt.plot(data) plt.show()
這段代碼的主體邏輯只有三行,但是它卻繪制出了一個(gè)非常直觀的線(xiàn)性圖,如下所示:
對(duì)照著這個(gè)線(xiàn)形圖,我們來(lái)講解一下三行代碼的邏輯:
- 通過(guò)
np.arange(100, 201)
生成一個(gè)[100, 200]之間的整數(shù)數(shù)組,它的值是:[100, 101, 102, … , 200] - 通過(guò)
matplotlib.pyplot
將其繪制出來(lái)。很顯然,繪制出來(lái)的值對(duì)應(yīng)了圖中的縱坐標(biāo)(y軸)。而matplotlib本身為我們?cè)O(shè)置了圖形的橫坐標(biāo)(x軸):[0, 100],因?yàn)槲覀儎偤糜?00個(gè)數(shù)值 - 通過(guò)
plt.show()
將這個(gè)圖形顯示出來(lái)
這段代碼非常的簡(jiǎn)單,運(yùn)行起來(lái)也是一樣。如果你已經(jīng)有了本文的運(yùn)行環(huán)境,將上面的代碼保存到一個(gè)文本文件中(或者通過(guò)Github獲取本文的源碼),然后通過(guò)下面的命令就可以在你自己的電腦上看到上面的圖形了:
python3 test.py
注1:后面的教程中,我們會(huì)逐步講解如何定制圖中的每一個(gè)細(xì)節(jié)。例如:坐標(biāo)軸,圖形,著色,線(xiàn)條樣式,等等。
注2:如果沒(méi)有必要,下文的截圖會(huì)去掉圖形外側(cè)的邊框,只保留圖形主體。
一次繪制多個(gè)圖形
有些時(shí)候,我們可能希望一次繪制多個(gè)圖形,例如:兩組數(shù)據(jù)的對(duì)比,或者一組數(shù)據(jù)的不同展示方式等。
可以通過(guò)下面的方法創(chuàng)建多個(gè)圖形:
多個(gè)figure
可以簡(jiǎn)單的理解為一個(gè)figure
就是一個(gè)圖形窗口。matplotlib.pyplot
會(huì)有一個(gè)默認(rèn)的figure
,我們也可以通過(guò)plt.figure()
創(chuàng)建更多個(gè)。如下面的代碼所示:
# figure.py import matplotlib.pyplot as plt import numpy as np data = np.arange(100, 201) plt.plot(data) data2 = np.arange(200, 301) plt.figure() plt.plot(data2) plt.show()
這段代碼繪制了兩個(gè)窗口的圖形,它們各自是一個(gè)不同區(qū)間的線(xiàn)形圖,如下所示:
注:初始狀態(tài)這兩個(gè)窗口是完全重合的。
多個(gè)subplot
有些情況下,我們是希望在同一個(gè)窗口顯示多個(gè)圖形。此時(shí)就這可以用多個(gè)subplot。下面是一段代碼示例:
# subplot.py import matplotlib.pyplot as plt import numpy as np data = np.arange(100, 201) plt.subplot(2, 1, 1) plt.plot(data) data2 = np.arange(200, 301) plt.subplot(2, 1, 2) plt.plot(data2) plt.show()
這段代碼中,除了subplot
函數(shù)之外都是我們熟悉的內(nèi)容。subplot
函數(shù)的前兩個(gè)參數(shù)指定了subplot數(shù)量,即:它們是以矩陣的形式來(lái)分割當(dāng)前圖形,兩個(gè)整數(shù)分別指定了矩陣的行數(shù)和列數(shù)。而第三個(gè)參數(shù)是指矩陣中的索引。
因此,下面這行代碼指的是:2行1列subplot中的第1個(gè)subplot。
plt.subplot(2, 1, 1)
下面這行代碼指的是:2行1列subplot中的第2個(gè)subplot。
plt.subplot(2, 1, 2)
所以這段代碼的結(jié)果是這個(gè)樣子:
subplot
函數(shù)的參數(shù)不僅僅支持上面這種形式,還可以將三個(gè)整數(shù)(10之內(nèi)的)合并一個(gè)整數(shù)。例如:2, 1, 1
可以寫(xiě)成211
,2, 1, 2
可以寫(xiě)成212
。
因此,下面這段代碼的結(jié)果是一樣的:
import matplotlib.pyplot as plt import numpy as np data = np.arange(100, 201) plt.subplot(211) plt.plot(data) data2 = np.arange(200, 301) plt.subplot(212) plt.plot(data2) plt.show()
subplot
函數(shù)的詳細(xì)說(shuō)明參見(jiàn)這里:matplotlib.pyplot.subplot
常用圖形示例
Matplotlib可以生成非常多的圖形式樣,多到令人驚嘆的地步。大家可以在這里:Matplotlib Gallery 感受一下。
本文作為第一次的入門(mén)教程,我們先來(lái)看看最常用的一些圖形的繪制。
線(xiàn)性圖
前面的例子中,線(xiàn)性圖的橫軸的點(diǎn)都是自動(dòng)生成的,而我們很可能希望主動(dòng)設(shè)置它。另外,線(xiàn)條我們可能也希望對(duì)其進(jìn)行定制??匆幌孪旅孢@個(gè)例子:
# plot.py import matplotlib.pyplot as plt plt.plot([1, 2, 3], [3, 6, 9], '-r') plt.plot([1, 2, 3], [2, 4, 9], ':g') plt.show()
這段代碼可以讓我們得到這樣的圖形:
這段代碼說(shuō)明如下:
plot
函數(shù)的第一個(gè)數(shù)組是橫軸的值,第二個(gè)數(shù)組是縱軸的值,所以它們一個(gè)是直線(xiàn),一個(gè)是折線(xiàn); 最后一個(gè)參數(shù)是由兩個(gè)字符構(gòu)成的,分別是線(xiàn)條的樣式和顏色。前者是紅色的直線(xiàn),后者是綠色的點(diǎn)線(xiàn)。關(guān)于樣式和顏色的說(shuō)明請(qǐng)參見(jiàn)plot
函數(shù)的API Doc:matplotlib.pyplot.plot
散點(diǎn)圖
scatter
函數(shù)用來(lái)繪制散點(diǎn)圖。同樣,這個(gè)函數(shù)也需要兩組配對(duì)的數(shù)據(jù)指定x和y軸的坐標(biāo)。下面是一段代碼示例:
# scatter.py import matplotlib.pyplot as plt import numpy as np N = 20 plt.scatter(np.random.rand(N) * 100, np.random.rand(N) * 100, c='r', s=100, alpha=0.5) plt.scatter(np.random.rand(N) * 100, np.random.rand(N) * 100, c='g', s=200, alpha=0.5) plt.scatter(np.random.rand(N) * 100, np.random.rand(N) * 100, c='b', s=300, alpha=0.5) plt.show()
這段代碼說(shuō)明如下:
這幅圖包含了三組數(shù)據(jù),每組數(shù)據(jù)都包含了20個(gè)隨機(jī)坐標(biāo)的位置 參數(shù)c
表示點(diǎn)的顏色,s
是點(diǎn)的大小,alpha
是透明度
這段代碼繪制的圖形如下所示:
scatter
函數(shù)的詳細(xì)說(shuō)明參見(jiàn)這里:matplotlib.pyplot.scatter
餅狀圖
pie
函數(shù)用來(lái)繪制餅狀圖。餅狀圖通常用來(lái)表達(dá)集合中各個(gè)部分的百分比。
# pie.py import matplotlib.pyplot as plt import numpy as np labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] data = np.random.rand(7) * 100 plt.pie(data, labels=labels, autopct='%1.1f%%') plt.axis('equal') plt.legend() plt.show()
這段代碼說(shuō)明如下:
data
是一組包含7個(gè)數(shù)據(jù)的隨機(jī)數(shù)值 圖中的標(biāo)簽通過(guò)labels
來(lái)指定 autopct
指定了數(shù)值的精度格式 plt.axis('equal')
設(shè)置了坐標(biāo)軸大小一致 plt.legend()
指明要繪制圖例(見(jiàn)下圖的右上角)
這段代碼輸出的圖形如下所示:
pie
函數(shù)的詳細(xì)說(shuō)明參見(jiàn)這里:matplotlib.pyplot.pie
條形圖
bar
函數(shù)用來(lái)繪制條形圖。條形圖常常用來(lái)描述一組數(shù)據(jù)的對(duì)比情況,例如:一周七天,每天的城市車(chē)流量。
下面是一個(gè)代碼示例:
# bar.py import matplotlib.pyplot as plt import numpy as np N = 7 x = np.arange(N) data = np.random.randint(low=0, high=100, size=N) colors = np.random.rand(N * 3).reshape(N, -1) labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] plt.title("Weekday Data") plt.bar(x, data, alpha=0.8, color=colors, tick_label=labels) plt.show()
這段代碼說(shuō)明如下:
這幅圖展示了一組包含7個(gè)隨機(jī)數(shù)值的結(jié)果,每個(gè)數(shù)值是[0, 100]的隨機(jī)數(shù) 它們的顏色也是通過(guò)隨機(jī)數(shù)生成的。np.random.rand(N * 3).reshape(N, -1)
表示先生成21(N x 3)個(gè)隨機(jī)數(shù),然后將它們組裝成7行,那么每行就是三個(gè)數(shù),這對(duì)應(yīng)了顏色的三個(gè)組成部分。如果不理解這行代碼,請(qǐng)先學(xué)習(xí)一下Python 機(jī)器學(xué)習(xí)庫(kù) NumPy 教程 title
指定了圖形的標(biāo)題,labels
指定了標(biāo)簽,alpha
是透明度
這段代碼輸出的圖形如下所示:
bar
函數(shù)的詳細(xì)說(shuō)明參見(jiàn)這里:matplotlib.pyplot.bar
直方圖
hist
函數(shù)用來(lái)繪制直方圖。直方圖看起來(lái)是條形圖有些類(lèi)似。但它們的含義是不一樣的,直方圖描述了數(shù)據(jù)中某個(gè)范圍內(nèi)數(shù)據(jù)出現(xiàn)的頻度。這么說(shuō)有些抽象,我們通過(guò)一個(gè)代碼示例來(lái)描述就好理解了:
# hist.py import matplotlib.pyplot as plt import numpy as np data = [np.random.randint(0, n, n) for n in [3000, 4000, 5000]] labels = ['3K', '4K', '5K'] bins = [0, 100, 500, 1000, 2000, 3000, 4000, 5000] plt.hist(data, bins=bins, label=labels) plt.legend() plt.show()
上面這段代碼中,[np.random.randint(0, n, n) for n in [3000, 4000, 5000]]
生成了包含了三個(gè)數(shù)組的數(shù)組,這其中:
第一個(gè)數(shù)組包含了3000個(gè)隨機(jī)數(shù),這些隨機(jī)數(shù)的范圍是 [0, 3000) 第二個(gè)數(shù)組包含了4000個(gè)隨機(jī)數(shù),這些隨機(jī)數(shù)的范圍是 [0, 4000) 第三個(gè)數(shù)組包含了5000個(gè)隨機(jī)數(shù),這些隨機(jī)數(shù)的范圍是 [0, 5000)
bins數(shù)組用來(lái)指定我們顯示的直方圖的邊界,即:[0, 100) 會(huì)有一個(gè)數(shù)據(jù)點(diǎn),[100, 500)會(huì)有一個(gè)數(shù)據(jù)點(diǎn),以此類(lèi)推。所以最終結(jié)果一共會(huì)顯示7個(gè)數(shù)據(jù)點(diǎn)。同樣的,我們指定了標(biāo)簽和圖例。
這段代碼的輸出如下圖所示:
在這幅圖中,我們看到,三組數(shù)據(jù)在3000以下都有數(shù)據(jù),并且頻度是差不多的。但藍(lán)色條只有3000以下的數(shù)據(jù),橙色條只有4000以下的數(shù)據(jù)。這與我們的隨機(jī)數(shù)組數(shù)據(jù)剛好吻合。
hist
函數(shù)的詳細(xì)說(shuō)明參見(jiàn)這里:matplotlib.pyplot.hist
結(jié)束語(yǔ)
通過(guò)本文,我們已經(jīng)知道了Matplotlib的大致使用方法和幾種最基本的圖形的繪制方式。
需要說(shuō)明的是,由于是入門(mén)教程,因此本文中我們只給出了這些函數(shù)和圖形最基本的使用方法。但實(shí)際上,它們的功能遠(yuǎn)不止這么簡(jiǎn)單。因此本文中我們貼出了這些函數(shù)的API地址以便讀者進(jìn)一步的研究。
- python繪圖庫(kù)Matplotlib的安裝
- Python Matplotlib庫(kù)入門(mén)指南
- Python Matplotlib庫(kù)安裝與基本作圖示例
- python matplotlib畫(huà)圖庫(kù)學(xué)習(xí)繪制常用的圖
- python matplotlib庫(kù)直方圖繪制詳解
- python庫(kù)matplotlib繪制坐標(biāo)圖
- 詳解python安裝matplotlib庫(kù)三種失敗情況
- Python三維繪圖之Matplotlib庫(kù)的使用方法
- Python的Matplotlib庫(kù)應(yīng)用實(shí)例超詳細(xì)教程
相關(guān)文章
Python使用pydub庫(kù)對(duì)mp3與wav格式進(jìn)行互轉(zhuǎn)的方法
今天小編就為大家分享一篇Python使用pydub庫(kù)對(duì)mp3與wav格式進(jìn)行互轉(zhuǎn)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python對(duì)圖片進(jìn)行resize、裁剪、旋轉(zhuǎn)、翻轉(zhuǎn)問(wèn)題
這篇文章主要介紹了Python對(duì)圖片進(jìn)行resize、裁剪、旋轉(zhuǎn)、翻轉(zhuǎn)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05利用Python實(shí)現(xiàn)在同一網(wǎng)絡(luò)中的本地文件共享方法
今天小編就為大家分享一篇利用Python實(shí)現(xiàn)在同一網(wǎng)絡(luò)中的本地文件共享方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06python中元組創(chuàng)建、索引訪(fǎng)問(wèn)和元組作用詳解
在Python中,元組是一種內(nèi)置的不可變序列,使用圓括號(hào)定義,元組的創(chuàng)建可以通過(guò)直接使用圓括號(hào)或者逗號(hào)分隔的方式進(jìn)行,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11python 快速把超大txt文件轉(zhuǎn)存為csv的實(shí)例
今天小編就為大家分享一篇python 快速把超大txt文件轉(zhuǎn)存為csv的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10讀取json格式為DataFrame(可轉(zhuǎn)為.csv)的實(shí)例講解
今天小編就為大家分享一篇讀取json格式為DataFrame(可轉(zhuǎn)為.csv)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06