天天看點

Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

Matplotlib庫

Matplotlib 是 Python 的繪圖庫,它提供了一整套和 matlab 相似的指令 API,可以生成出版品質級别的精美圖形,Matplotlib 使繪圖變得非常簡單,在易用性和性能間取得了優異的平衡。

曲線圖

曲線圖的繪制

作為繪圖程式的 Hello World,我們将首先繪制一條簡單的曲線。同時還将簡單介紹

# plot_1.py
import matplotlib.pyplot as plt
x = range(50)
y = [value * 2 for value in x]
plt.plot(x, y)
plt.show()      

上述代碼将會繪制曲線 y=2*x,其中 x 在 [0,50] 範圍内,如下所示:

Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

可以看到視窗上方還包含多個圖示,其中:

圖示 解釋
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖
此按鈕用于将所繪制的圖形另存為所需格式的圖檔,包括png,jpg,pdf,svg等常見格式
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖
此按鈕用于調整圖檔的尺寸,邊距等圖檔屬性
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖
此按鈕用于縮放圖檔,用于觀察圖形細節,單擊此按鈕後,在圖形上使用滑鼠左鍵拖拽進行放大,使用滑鼠右鍵拖拽進行縮小
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖
此按鈕用于移動圖形,可以與“縮放”按鈕結合觀察放大後圖檔的具體細節,同時,單擊此按鈕後,在圖形上使用滑鼠右鍵拖拽可以縮放坐标軸的比例
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖
此按鈕用于将圖形恢複到其初始狀态,取消縮放、移動等操作

Tips:plt.plot(x, y) 用于繪制一條曲線,其中,曲線點的 x 坐标在清單 x 中給出,曲線點的 y 坐标在清單y中給出。

由于 matplotlib 它隻專注于繪圖,是以如果想從檔案中讀取輸入或進行一些中間計算,那麼必須使用 Python 子產品,但不用擔心,matplotlib 與其他子產品具有良好的相容性,并不涉及過多的技巧。例如,要生成大量統計圖形,可能需要使用科學計算包,如 Numpy 和 Python 的檔案讀取 I/O 子產品。在接下來的講解中會給出相應的示例。

結合Numpy庫,繪制曲線圖

繪制曲線 cos(x),x 在 [0, 2*pi] 區間内:

# cos_1.py
import math
import matplotlib.pyplot as plt
scale = range(100)
x = [(2 * math.pi * i) / len(scale) for i in scale]
y = [math.cos(i) for i in x]
plt.plot(x, y)
plt.show()      

若采用 Numpy 庫,則可以使用以下等效代碼:

# cos_2.py
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)
plt.plot(x, y)
plt.show()      

所繪制圖形如下所示:

Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

Tips:雖然 Numpy 對于可視化而言并非必要,但可以看出使用 Numpy 庫可以更加高效。

Numpy 可以一次對整個數組執行操作,可以使代碼更高效,以繪制 [-10,10] 區間内的曲線 y=x3+5x-10 為例:

# plot_np.py
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 800)
y = x ** 3 + 5 * x - 10
plt.plot(x, y)
plt.show()      

繪制圖形如下:

Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

繪制多曲線圖  

很多時候我們需要對比多組資料,以發現資料間的異同,此時就需要在一張圖檔上繪制多條曲線——多曲線圖,下圖展示了在同一圖檔中繪制函數 y=x、y=x2,y=logex 以及 y=sin(x):

# plot_multi_curve.py
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0.1, 2 * np.pi, 100)
y_1 = x
y_2 = np.square(x)
y_3 = np.log(x)
y_4 = np.sin(x)
plt.plot(x,y_1)
plt.plot(x,y_2)
plt.plot(x,y_3)
plt.plot(x,y_4)
plt.show()      

上述腳本繪制圖形如下:

Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

Tips:一條曲線的繪制需要調用一次 plt.plot(),而 plt.show() 隻需調用一次。這種延遲呈現機制是 matplotlib 的核心,我們可以聲明在任何時間繪制圖形,但隻有在調用 plt.show() 時才會渲染顯示圖形。

為了更好的說明這種延遲呈現機制,編寫以下代碼:

# deferred_rendering.py
import numpy as np
import matplotlib.pyplot as plt
def plot_func(x, y):
    x_s = x[1:] - y[:-1]
    y_s = y[1:] - x[:-1]
    plt.plot(x[1:], x_s / y_s)
x = np.linspace(-5, 5, 200)
y = np.exp(-x ** 2)
plt.plot(x, y)
plot_func(x, y)
plt.show()      
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

可以看到,盡管其中一個 plt.plot() 是在 plot_func 函數中調用的,它對圖形的呈現沒有任何影響,因為 plt.plot() 隻是聲明了我們要呈現的内容,但還沒有執行渲染。是以可以使用此特性結合 for 循環、條件判斷等文法完成複雜圖形的繪制,同時也可以在同一張圖中組合不同類型的統計圖。

讀取資料檔案繪制曲線圖

很多情況下資料都是存儲于檔案中,是以,需要首先讀取檔案中的資料,再進行繪制,說明起見,以 .txt 檔案為例,其他諸如 Excel、CSV 檔案可以使用 pandas、numpy 等庫進行讀取。

假設存在 data.txt 檔案如下:

0 1
1 2
2 5
4 17
5 26
6 37      

讀取資料和繪制的代碼如下:

# read_txt.py
import matplotlib.pyplot as plt
x, y = [], []
for line in open('data.txt', 'r'):
    values = [float(s) for s in line.split()]
    x.append(values[0])
    y.append(values[1])
plt.plot(x, y)
plt.show()      

如果使用 Numpy 庫,其等效代碼可以寫為:

import matplotlib.pyplot as plt
import numpy as np
data = np.loadtxt('data.txt')
plt.plot(data[:,0], data[:,1])
plt.show()      
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

散點圖

當繪制曲線圖時,我們假設點與點之間存在序列關系。而散點圖是簡單地繪制點,它們之間并不存在連接配接。

import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(1000, 2)
plt.scatter(data[:,0], data[:,1])
plt.show()      
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

Tips:函數 plt.scatter() 的調用方式與 plt.plot() 完全相同,分别将點的x和y坐标作為輸入參數。

條形圖

條形圖具有豐富的表現形式,常見的類型包括單組條形圖,多組條形圖,堆積條形圖和對稱條形圖等。是以在

《Python-Matplotlib繪制條形圖》

中進行詳細介紹。

餅圖

餅圖可以用于對比數量間的相對關系:

import matplotlib.pyplot as plt
data = [10, 15, 30, 20]
plt.pie(data)
plt.show()      
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

Tips:plt.pie() 函數将一系列值作為輸入,将值傳遞給matplolib,它就會自動計算各個值在餅圖中的相對面積,并進行繪制。

直方圖

直方圖是機率分布的圖形表示。事實上,直方圖隻是一種特殊的條形圖。我們可以很容易地使用 matplotlib 的條形圖函數,并進行一些統計運算來生成直方圖。但是,直方圖非常有用,是以 matplotlib 提供了一個更加友善的函數:

import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1024)
plt.hist(x, bins = 20)
plt.show()      
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

Tips:plt.hist() 函數的作用是:擷取一系列值作為輸入。值的範圍将被劃分為大小相等的範圍(預設情況下數量為10),然後生成條形圖,一個範圍對應一個條柱,一個條柱的高度是相應範圍内中的值的數量,條柱的數量由可選參數 bins 确定。

箱形圖

箱形圖可以通過友善地顯示一組值的中位數、四分位數、最大值和最小值來比較值的分布。

import numpy as np
import matplotlib.pyplot as plt
data = np.random.randn(200)
plt.boxplot(data)
plt.show()      
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

Tips:plt.boxplot() 函數的作用是:擷取一組值,并自動計算平均值、中位數和其他統計量。

箱形圖描述:

1. 圖中黃線是分布的中位數。

2. 方形箱框包括從下四分位數 Q1 到上四分位數 Q3 的 50% 的資料。

3. 下盒須的下四分位延伸到 1.5(Q3-Q1)。

4. 上盒須從上四分位延伸至 1.5(Q3-Q1)。

5. 離盒須較遠的數值用圓圈标記。

要在單個圖形中繪制多個箱形圖,對每個箱形圖調用一次 plt.boxplot() 是不可行。它會将所有箱形圖畫在一起,形成一個混亂的、不可讀的圖形。如果想要到達符合要求的效果,隻需在一次調用 plt.boxplot() 中,同時繪制多個箱形圖即可,如下所示:

import numpy as np
import matplotlib.pyplot as plt
data = np.random.randn(200, 6)
plt.boxplot(data)
plt.show()      
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖

三角網格圖

處理空間位置時會出現網格圖。除了顯示點之間的距離和鄰域關系外,三角網格圖也是表示地圖的一種友善方法。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.tri as tri
data = np.random.rand(200, 2)
triangles = tri.Triangulation(data[:,0], data[:,1])
plt.triplot(triangles)
plt.show()      
Python-Matplotlib常見統計圖的繪制Matplotlib庫曲線圖散點圖條形圖餅圖直方圖箱形圖三角網格圖