引言:讓數據開口說話
在數據分析與機器學習領域,可視化是理解數據的重要橋梁。Matplotlib 作為 Python 最流行的繪圖庫,提供了從簡單折線圖到復雜 3D 圖表的完整解決方案。本文將通過實際案例,帶您從基礎繪圖到高級定制全面掌握 Matplotlib 的核心能力。
Pyplot 是 Matplotlib 的子庫,提供了和 MATLAB 類似的繪圖 API。Pyplot 是常用的繪圖模塊,能很方便讓用戶繪制 2D 圖表。
Pyplot 包含一系列繪圖函數的相關函數,每個函數會對當前的圖像進行一些修改,例如:給圖像加上標記,生新的圖像,在圖像中產生新的繪圖區域等等。使用的時候,我們可以使用 import 導入 pyplot 庫,并設置一個別名?plt:
import matplotlib.pyplot as plt
這樣我們就可以使用?plt?來引用 pyplot 包的方法。
以下是一些常用的 pyplot 函數:
plot()
:用于繪制線圖和散點圖scatter()
:用于繪制散點圖bar()
:用于繪制垂直條形圖和水平條形圖hist()
:用于繪制直方圖pie()
:用于繪制餅圖imshow()
:用于繪制圖像subplots()
:用于創建子圖
常見統計圖繪制與代碼實踐
曲線圖?
曲線圖的繪制
我們將首先繪制一條簡單的曲線,同時還將簡單介紹matplotlib的工作原理。
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]范圍內,如下所示:
可以看到窗口上方還包含多個圖標,其中:?
項目 | value |
![]() | 此按鈕用于將所繪制的圖形另存為所需格式的圖片,包括png,jpg,pdf,svg等常見格式 |
![]() | 此按鈕用于調整圖片的尺寸,邊距等圖片屬性 |
![]() | 此按鈕用于縮放圖片,用于觀察圖形細節,單擊此按鈕后,在圖形上使用鼠標左鍵拖拽進行放大,使用鼠標右鍵拖拽進行縮小 |
![]() | 此按鈕用于移動圖形,可以與“縮放”按鈕結合觀察放大后圖片的具體細節,同時,單擊此按鈕后,在圖形上使用鼠標右鍵拖拽可以縮放坐標軸的比例 |
![]() | 此按鈕用于將圖形恢復到其初始狀態,取消縮放、移動等操作 |
結合Numpy庫,繪制曲線圖
繪制曲線cos(x),x在[0, 2*pi]區間內:
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庫,則可以使用以下等效代碼:
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()
所繪制圖形如下所示:
Tips:雖然Numpy對于可視化而言并非必要,但可以看出使用Numpy庫可以更加高效。
Numpy可以一次對整個數組執行操作,可以使代碼更高效,以繪制[-10,10]區間內的曲線為例:
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()
繪制圖形如下
繪制多曲線圖
很多時候我們需要對比多組數據,以發現數據間的異同,此時就需要在一張圖片上繪制多條曲線——多曲線圖,下圖展示了在同一圖片中繪制函數、
、
以及
:
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()
上述腳本繪制圖形如下:
Tips:一條曲線的繪制需要調用一次plt.plot(),而plt.show()只需調用一次。這種延遲呈現機制是matplotlib的核心,我們可以聲明在任何時間繪制圖形,但只有在調用plt.show()時才會渲染顯示圖形。
讀取數據文件繪制曲線圖
很多情況下數據都是存儲于文件中,因此,需要首先讀取文件中的數據,再進行繪制,說明起見,以.txt
文件為例,其他諸如Excel、CSV文件
可以使用pandas、numpy
等庫進行讀取。
假設存在data.txt
文件如下:
0 1
1 2
2 5
4 17
5 26
6 37
讀取數據和繪制的代碼如下:
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()
散點圖
當繪制曲線圖時,我們假設點與點之間存在序列關系。而散點圖是簡單地繪制點,它們之間并不存在連接。
import numpy as np
import matplotlib.pyplot as plt
data = np.random.rand(1000, 2)
plt.scatter(data[:,0], data[:,1])
plt.show()
?Tips:函數plt.scatter()的調用方式與plt.plot()完全相同,分別將點的x和y坐標作為輸入參數。
條形圖
條形圖具有豐富的表現形式,常見的類型包括單組條形圖,多組條形圖,堆積條形圖和對稱條形圖等。
單組條形圖
條形圖的每種表現形式都可以繪制成垂直條形圖或水平條形圖,以單組條形圖的兩種繪制方式為例。
垂直條形圖
import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
plt.bar(range(len(data)), data)
plt.show()
Tips:plt.plot()函數的作用是:接收兩個參數,包括每個條形的x坐標和每個條行的高度。
通過可選參數width
,pyplot.bar()提供了一種控制條形圖中條狀寬度的方法:
import matplotlib.pyplot as plt
data = [10., 20., 5., 15.]
plt.bar(range(len(data)), data, width=0.5)
plt.show()
水平條形圖
如果更喜歡水平條形外觀,就可以使用plt.barh()
函數,在用法方面與plt.bar()
基本相同,但是修改條形寬度(或者在水平條形圖中應該稱為高度)的參數需要使用height
:
多組條形圖
當需要比較不同年份相應季度的銷量等此類需求時,我們可能需要多組條形圖。
import numpy as np
import matplotlib.pyplot as plt
data = [[10., 20., 30., 20.],[40., 25., 53., 18.],[6., 22., 52., 19.]]
x = np.arange(4)
plt.bar(x + 0.00, data[0], color = 'b', width = 0.25)
plt.bar(x + 0.25, data[1], color = 'g', width = 0.25)
plt.bar(x + 0.50, data[2], color = 'r', width = 0.25)
plt.show()
堆積條形圖
通過使用plt.bar()
函數中的可選參數,可以繪制堆積條形圖。
import matplotlib.pyplot as plt
y_1 = [3., 25., 45., 22.]
y_2 = [6., 25., 50., 25.]
x = range(4)
plt.bar(x, y_1, color = 'b')
plt.bar(x, y_2, color = 'r', bottom = y_1)
plt.show()
Tips:plt.bar()函數的可選參數bottom允許指定條形圖的起始值。
可以結合for循環,利用延遲呈現機制堆疊更多的條形:
import numpy as np
import matplotlib.pyplot as plt
data = np.array([[5., 30., 45., 22.], [5., 25., 50., 20.], [1., 2., 1., 1.]])
x = np.arange(data.shape[1])
for i in range(data.shape[0]):plt.bar(x, data[i], bottom = np.sum(data[:i], axis = 0))
plt.show()
對稱條形圖
一個簡單且有用的技巧是對稱繪制兩個條形圖。例如想要繪制不同年齡段的男性與女性數量的對比:
import numpy as np
import matplotlib.pyplot as plt
w_pop = np.array([5., 30., 45., 22.])
m_pop = np.array( [5., 25., 50., 20.])
x = np.arange(4)
plt.barh(x, w_pop)
plt.barh(x, -m_pop)
plt.show()
圖中女性人口的條形圖照常繪制。然而,男性人口的條形圖的條形圖的條形圖向左延伸,而不是向右延伸。可以使用數據的負值來快速實現對稱條形圖的繪制。
餅圖
餅圖可以用于對比數量間的相對關系:
import matplotlib.pyplot as plt
data = [10, 15, 30, 20]
plt.pie(data)
plt.show()
Tips:plt.pie()函數將一系列值作為輸入,將值傳遞給matplolib,它就會自動計算各個值在餅圖中的相對面積,并進行繪制。
直方圖
直方圖是概率分布的圖形表示。事實上,直方圖只是一種特殊的條形圖。我們可以很容易地使用matplotlib的條形圖函數,并進行一些統計運算來生成直方圖。但是,直方圖非常有用,因此matplotlib提供了一個更加方便的函數:
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1024)
plt.hist(x, bins = 200)
plt.show()
Tips:plt.hist()函數的作用是:獲取一系列值作為輸入。值的范圍將被劃分為大小相等的范圍(默認情況下數量為10),然后生成條形圖,一個范圍對應一個條柱,一個條柱的高度是相應范圍內中的值的數量,條柱的數量由可選參數bins確定。
三角網格圖
處理空間位置時會出現網格圖。除了顯示點之間的距離和鄰域關系外,三角網格圖也是表示地圖的一種方便方法。
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()
Tips:代碼中導入了matplotlib.tri模塊,該模塊提供了從點計算三角網格的輔助函數。