Python 語言的2D繪相簿之 Matplotlib 入門教程
來源:強波的技術部落格
qiangbo.space/2018-04-06/matplotlib_l1/
Matplotlib是一個Python語言的2D繪相簿,它支援各種平臺,並且功能強大,能夠輕易繪製出各種專業的影象。本文是對它的一個入門教程。
執行環境
由於這是一個Python語言的軟體包,因此需要你的機器上首先安裝好Python語言的環境。關於這一點,請自行在網路上搜尋獲取方法。
關於如何安裝Matplotlib請參見這裡:Matplotlib Installing。
筆者推薦大家通過pip的方式進行安裝,具體方法如下:
sudo pip3 install matplotlib
本文的程式碼在如下環境中測試:
Apple OS X 10.13
Python 3.6.3
matplotlib 2.1.1
numpy 1.13.3
介紹
Matplotlib適用於各種環境,包括:
Python指令碼
IPython shell
Jupyter notebook
Web應用伺服器
使用者圖形介面工具包
使用Matplotlib,能夠的輕易生成各種型別的影象,例如:直方圖,波譜圖,條形圖,散點圖等。並且,可以非常輕鬆的實現定製。
入門程式碼示例
下面我們先看一個最簡單的程式碼示例,讓我們感受一下Matplotlib是什麼樣的:
# test.py
import matplotlib.pyplot as plt
import numpy as np
data = np.arange(100, 201)
plt.plot(data)
plt.show()
這段程式碼的主體邏輯只有三行,但是它卻繪製出了一個非常直觀的線性圖,如下所示:
對照著這個線形圖,我們來講解一下三行程式碼的邏輯:
通過np.arange(100, 201)生成一個[100, 200]之間的整數陣列,它的值是:[100, 101, 102, … , 200]
通過matplotlib.pyplot將其繪製出來。很顯然,繪製出來的值對應了圖中的縱座標(y軸)。而matplotlib本身為我們設定了圖形的橫座標(x軸):[0, 100],因為我們剛好有100個數值
通過plt.show()將這個圖形顯示出來
這段程式碼非常的簡單,執行起來也是一樣。如果你已經有了本文的執行環境,將上面的程式碼儲存到一個文字檔案中(或者通過Github獲取本文的原始碼),然後通過下面的命令就可以在你自己的電腦上看到上面的圖形了:
python3 test.py
注1:後面的教程中,我們會逐步講解如何定製圖中的每一個細節。例如:座標軸,圖形,著色,線條樣式,等等。
注2:如果沒有必要,下文的截圖會去掉圖形外側的邊框,只保留圖形主體。
一次繪製多個圖形
有些時候,我們可能希望一次繪製多個圖形,例如:兩組資料的對比,或者一組資料的不同展示方式等。
可以通過下面的方法建立多個圖形:
多個figure
可以簡單的理解為一個figure就是一個圖形視窗。matplotlib.pyplot會有一個預設的figure,我們也可以通過plt.figure()建立更多個。如下面的程式碼所示:
# 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()
這段程式碼繪製了兩個視窗的圖形,它們各自是一個不同區間的線形圖,如下所示:
注:初始狀態這兩個視窗是完全重合的。
多個subplot
有些情況下,我們是希望在同一個視窗顯示多個圖形。此時就這可以用多個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函式之外都是我們熟悉的內容。subplot函式的前兩個引數指定了subplot數量,即:它們是以矩陣的形式來分割當前圖形,兩個整數分別指定了矩陣的行數和列數。而第三個引數是指矩陣中的索引。
因此,下面這行程式碼指的是:2行1列subplot中的第1個subplot。
plt.subplot(2, 1, 1)
下面這行程式碼指的是:2行1列subplot中的第2個subplot。
plt.subplot(2, 1, 2)
所以這段程式碼的結果是這個樣子:
subplot函式的引數不僅僅支援上面這種形式,還可以將三個整數(10之內的)合併一個整數。例如:2, 1, 1可以寫成211,2, 1, 2可以寫成212。
因此,下面這段程式碼的結果是一樣的:
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函式的詳細說明參見這裡:matplotlib.pyplot.subplot
常用圖形示例
Matplotlib可以生成非常多的圖形式樣,多到令人驚歎的地步。大家可以在這裡:Matplotlib Gallery 感受一下。
本文作為第一次的入門教程,我們先來看看最常用的一些圖形的繪製。
線性圖
前面的例子中,線性圖的橫軸的點都是自動生成的,而我們很可能希望主動設定它。另外,線條我們可能也希望對其進行定製。看一下下面這個例子:
# 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()
這段程式碼可以讓我們得到這樣的圖形:
這段程式碼說明如下:
plot函式的第一個陣列是橫軸的值,第二個陣列是縱軸的值,所以它們一個是直線,一個是折線;
最後一個引數是由兩個字元構成的,分別是線條的樣式和顏色。前者是紅色的直線,後者是綠色的點線。關於樣式和顏色的說明請參見plot函式的API Doc:matplotlib.pyplot.plot
散點圖
scatter函式用來繪製散點圖。同樣,這個函式也需要兩組配對的資料指定x和y軸的座標。下面是一段程式碼示例:
# 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()
這段程式碼說明如下:
這幅圖包含了三組資料,每組資料都包含了20個隨機座標的位置
引數c表示點的顏色,s是點的大小,alpha是透明度
這段程式碼繪製的圖形如下所示:
scatter函式的詳細說明參見這裡:matplotlib.pyplot.scatter
餅狀圖
pie函式用來繪製餅狀圖。餅狀圖通常用來表達集合中各個部分的百分比。
# 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()
這段程式碼說明如下:
data是一組包含7個資料的隨機數值
圖中的標籤通過labels來指定
autopct指定了數值的精度格式
plt.axis('equal')設定了座標軸大小一致
plt.legend()指明要繪製圖例(見下圖的右上角)
這段程式碼輸出的圖形如下所示:
pie函式的詳細說明參見這裡:matplotlib.pyplot.pie
條形圖
bar函式用來繪製條形圖。條形圖常常用來描述一組資料的對比情況,例如:一週七天,每天的城市車流量。
下面是一個程式碼示例:
# 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()
這段程式碼說明如下:
這幅圖展示了一組包含7個隨機數值的結果,每個數值是[0, 100]的隨機數
它們的顏色也是通過隨機數生成的。np.random.rand(N * 3).reshape(N, -1)表示先生成21(N x 3)個隨機數,然後將它們組裝成7行,那麼每行就是三個數,這對應了顏色的三個組成部分。如果不理解這行程式碼,請先學習一下Python 機器學習庫 NumPy 教程
title指定了圖形的標題,labels指定了標籤,alpha是透明度
這段程式碼輸出的圖形如下所示:
bar函式的詳細說明參見這裡:matplotlib.pyplot.bar
直方圖
hist函式用來繪製直方圖。直方圖看起來是條形圖有些類似。但它們的含義是不一樣的,直方圖描述了資料中某個範圍內資料出現的頻度。這麼說有些抽象,我們通過一個程式碼示例來描述就好理解了:
# 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]]生成了包含了三個陣列的陣列,這其中:
第一個陣列包含了3000個隨機數,這些隨機數的範圍是 [0, 3000)
第二個陣列包含了4000個隨機數,這些隨機數的範圍是 [0, 4000)
第三個陣列包含了5000個隨機數,這些隨機數的範圍是 [0, 5000)
bins陣列用來指定我們顯示的直方圖的邊界,即:[0, 100) 會有一個資料點,[100, 500)會有一個資料點,以此類推。所以最終結果一共會顯示7個資料點。同樣的,我們指定了標籤和圖例。
這段程式碼的輸出如下圖所示:
在這幅圖中,我們看到,三組資料在3000以下都有資料,並且頻度是差不多的。但藍色條只有3000以下的資料,橙色條只有4000以下的資料。這與我們的隨機陣列資料剛好吻合。
hist函式的詳細說明參見這裡:matplotlib.pyplot.hist
結束語
通過本文,我們已經知道了Matplotlib的大致使用方法和幾種最基本的圖形的繪製方式。
需要說明的是,由於是入門教程,因此本文中我們只給出了這些函式和圖形最基本的使用方法。但實際上,它們的功能遠不止這麼簡單。因此本文中我們貼出了這些函式的API地址以便讀者進一步的研究。
《機器學習集訓營 第五期》開始報名,BAT級工業專案實戰輔導 + 一對一面試求職輔導,並提供一年GPU雲實驗平臺免費使用;北京、上海、深圳、廣州、杭州、瀋陽、濟南、鄭州、成都、武漢、西安十一城同步開營,點選“閱讀原文”試聽。
相關文章
- Python 繪相簿 Matplotlib 入門教程Python
- Python-matplotlib-入門教程(一)-基礎圖表繪製Python
- R語言的入門教程R語言
- windows下python繪相簿matplotlib安裝方法(親測)WindowsPython
- python繪圖之matplotlibPython繪圖
- python程式設計基礎:深度學習基礎:繪相簿之matplotlib(1)Python程式設計深度學習
- go語言快速入門教程Go
- Prolog 語言入門教程
- 組合語言入門教程組合語言
- Swift 程式語言入門教程Swift
- Python語言如何入門?新手入門教程限時免費領Python
- Python函數語言程式設計入門教程Python函數程式設計
- matplotlib入門之Pyplot
- Python基礎入門之Python語言介紹Python
- Go 語言入門教程:變數Go變數
- 《C 語言入門教程》釋出了
- Apple Swift程式語言入門教程APPSwift
- 幾十種程式語言的快速入門教程
- R語言入門之Hello worldR語言
- Ruby語言入門之Hello world
- Python語言應該如何入門Python
- 函數語言程式設計入門教程函數程式設計
- Rust入門系列之語言特性 - 1Rust
- 給深度學習入門者的Python快速教程 - Numpy和Matplotlib篇深度學習Python
- 資料分析用python語言有什麼好處?Python入門教程Python
- Go語言入門系列(四)之map的使用Go
- Matplotlib庫的入門
- Flutter小白教程系列(三) --- Dart語言快速入門FlutterDart
- 蘋果Swift程式語言入門教程【中文版】蘋果Swift
- Go 語言基礎教程:10分鐘入門Go
- 如何學習python程式語言?python入門Python
- 如何入門GO語言?這份GO語言超詳細入門教程你值得擁有-千鋒Go
- perl語言入門
- c語言入門C語言
- go語言入門之-函式和方法Go函式
- 繪圖: Python matplotlib簡介繪圖Python
- Python程式語言有哪些特徵?入門分享!Python特徵
- 程式語言入門經典案例【Python版】Python