資料視覺化——Matpoltlib庫的使用

郝hai發表於2024-03-23

Matplotlib 是一個 Python 的 2D 繪相簿,提供了一種繪製視覺化圖形的簡單而有效的方式。它可以建立各種型別的圖表,包括線圖、散點圖、直方圖、餅圖等,使使用者能夠以視覺化的方式呈現資料。Matplotlib 的主要作用是提供一個靈活、可定製的工具集,用於建立高質量的圖形。它使得資料分析、資料視覺化、科學研究等領域的使用者能夠以直觀的方式探索資料、觀察資料之間的關係,並向他人有效傳達資料和分析結果。

一、Matplotlib庫概述

Matplotlib-Examples教程大全

1.1 Matplotlib庫的應用

科學研究:在科學研究中,Matplotlib 可用於繪製實驗資料、模擬結果、統計分析等,幫助研究人員更好地理解資料和發現規律。
資料分析:資料分析師和資料科學家可以使用 Matplotlib 將複雜的資料轉化為易於理解的視覺化圖形,從而更好地探索資料並提取資訊。
工程技術:在工程領域,Matplotlib 可用於繪製工程圖、曲線圖、三維圖等,幫助工程師分析資料、設計系統並進行視覺化展示。
教育:Matplotlib 可作為教學工具,用於向學生展示各種數學概念、科學原理和統計方法,使學習過程更加生動有趣。
金融:金融領域常用 Matplotlib 來繪製股票走勢圖、收益曲線等,幫助分析市場走勢和制定投資策略。

1.2 Matplotlib庫的優缺點

優點:
功能強大:Matplotlib 提供了豐富的繪圖功能,使用者可以建立各種型別的圖表,並對其進行高度定製。
靈活性:Matplotlib 允許使用者透過簡單的命令和引數調整來控制圖形的外觀和佈局,滿足不同需求。
跨平臺性:Matplotlib 支援在各種作業系統上執行,包括 Windows、Linux 和 macOS。
社群支援:Matplotlib 擁有龐大的使用者社群,使用者可以輕鬆獲取支援和解決問題。
缺點:
繪圖程式碼複雜:有時候,繪製複雜圖形所需的程式碼可能相對較長,不夠簡潔。
預設樣式較簡單:Matplotlib 的預設樣式可能不夠吸引人,需要使用者進行樣式調整以獲得更美觀的圖形。

二、Matplotlib庫的作圖示例

2.1 餅圖Pie

import numpy as np
import matplotlib.pyplot as plt
data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
# 繪製圓環圖 : 外圓半徑為 1.5, 楔形寬度為 0.7
plt.pie(data, radius=1.5, wedgeprops={'width': 0.8}, labels=pie_labels,
autopct='%3.1f%%', pctdistance=0.75)
plt.show()

2.2 直方圖Hist

import matplotlib.pyplot as plt
import numpy as np
# 10000 個隨機數
random_x = np.random.randn(10000)
# 繪製包含 25 個矩形條的直方圖  
plt.hist(random_x, bins=25)
plt.show()

2.3 箱線圖box

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
data_2018 = np.array([5200, 5254.5, 5283.4, 5107.8, 5443.3, 5550.6,
6400.2, 6404.9, 5483.1, 5330.2, 5543, 6199.9])
data_2017 = np.array([4605.2, 4710.3, 5168.9, 4767.2, 4947, 5203,
 6047.4, 5945.5, 5219.6, 5038.1, 5196.3, 5698.6])
# 繪製箱形圖
plt.boxplot([data_2018, data_2017], labels=('2018 年 ', '2017 年 '),
meanline=True, widths=0.5, vert=True, patch_artist=True)
plt.show()

2.4 雷達圖radar

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
dim_num = 6
data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
[0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
[0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
[0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
[0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
[0.34, 0.31, 0.38, 0.40, 0.92, 0.28]])
angles = np.linspace(0, 2 * np.pi, dim_num, endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
data = np.concatenate((data, [data[0]]))
# 維度標籤
radar_labels = [' 研究型 (I)', ' 藝術型 (A)', ' 社會型 (S)', 
'企業型 (E)', ' 傳統型 (C)', ' 現實型 (R)']
radar_labels = np.concatenate((radar_labels, [radar_labels[0]]))
# 繪製雷達圖
plt.polar(angles, data)
# 設定極座標的標籤
plt.thetagrids(angles * 180/np.pi, labels=radar_labels)
# 填充多邊形
plt.fill(angles, data, alpha=0.25)
plt.show()

三、Matplotkib庫的進階

3.1 多重直方圖

import matplotlib.pyplot as plt
import numpy as np

# 生成隨機資料
data1 = np.random.normal(0, 1, 10000)
data2 = np.random.normal(3, 1.5, 10000)

# 建立畫布,並設定大小和背景顏色
fig, ax = plt.subplots(figsize=(8, 6), facecolor='white')

# 繪製兩個直方圖
n1, bins1, patches1 = ax.hist(data1, bins=50, density=True, alpha=0.5, color='blue')
n2, bins2, patches2 = ax.hist(data2, bins=50, density=True, alpha=0.5, color='green')

# 設定座標軸範圍和標籤
ax.set_xlim([-8, 12])
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')

# 新增標題和圖例
ax.set_title('Normal Distribution Histogram Comparison')
ax.legend(['Data 1', 'Data 2'])

# 顯示圖形
plt.show()

3.2 加正態分佈的直方圖

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm

# 生成隨機資料
np.random.seed(42)
data = np.random.randn(1000)

# 建立畫布並繪製直方圖
fig, ax = plt.subplots(figsize=(8, 5))
n, bins, patches = ax.hist(data, bins=30, density=True, alpha=0.7)

# 計算均值和標準差
mu, std = np.mean(data), np.std(data)

# 新增均值線和註釋
ax.vlines(mu, 0, 1.0, colors='r', linestyles='--', label=r'$\mu$')
ax.annotate(r'$\mu={:.2f}$'.format(mu), xy=(mu, 0.25), xytext=(mu + 1, 0.35), fontsize=12, color='r')

# 繪製正態分佈曲線
x = np.linspace(min(bins), max(bins), 100)
p = norm.pdf(x, mu, std)
ax.plot(x, p, 'k', linewidth=2, label='Normal distribution')

# 新增圖例、標題和標籤
ax.legend(loc='best', frameon=False)
ax.set_title('Histogram of a Random Dataset')
ax.set_xlabel('Value')
ax.set_ylabel('Frequency')

plt.show()

3.3 折線圖

import matplotlib.pyplot as plt

# 設定中文字型
plt.rcParams['font.sans-serif'] = ['SimHei']  # 設定中文顯示
plt.rcParams['axes.unicode_minus'] = False  # 解決儲存影像是負號'-'顯示為方塊的問題

# 賽程和得分資料
game = ['1-G1', '1-G2', '1-G3', '1-G4', '1-G5', '2-G1', '2-G2', '2-G3', '2-G4', '2-G5', '3-G1', '3-G2', '3-G3',
        '3-G4', '3-G5', '總決賽-G1', '總決賽-G2', '總決賽-G3', '總決賽-G4', '總決賽-G5', '總決賽-G6']
scores = [23, 10, 38, 30, 36, 20, 28, 36, 16, 29, 15, 26, 30, 26, 38, 34, 33, 25, 28, 40, 28]

# 繪圖
plt.figure(figsize=(20, 10), dpi=100)
plt.plot(game, scores, c='red', marker='o', linestyle='-')
plt.scatter(game, scores, c='red', marker='o')
y_ticks = range(50)
plt.yticks(y_ticks[::5])
plt.grid(True, linestyle='--', alpha=0.5)
plt.xlabel("賽程", fontdict={'size': 16})
plt.ylabel("得分", fontdict={'size': 16})
plt.title("NBA2020季後賽詹姆斯得分", fontdict={'size': 20})
plt.xticks(rotation=45)  # 旋轉x軸刻度文字,以避免文字重疊
plt.tight_layout()  # 自動調整子圖引數,使之填充整個影像區域
plt.show()

3.4 多幅圖

import numpy as np
import matplotlib.pyplot as plt

# 生成隨機資料
np.random.seed(19680801)
x = np.random.rand(10)
y = np.random.rand(10)
z = np.sqrt(x**2 + y**2)

# 繪製散點圖
plt.figure(figsize=(10, 12))

plt.subplot(321)
plt.scatter(x, y, s=80, c=z, marker=">")
plt.title("Marker: '>'")

plt.subplot(322)
plt.scatter(x, y, s=80, c=z, marker=(5, 0))
plt.title("Marker: 'pentagon'")

verts = np.array([[-1, -1], [1, -1], [1, 1], [-1, -1]])
plt.subplot(323)
plt.scatter(x, y, s=80, c=z, marker=verts)
plt.title("Marker: 'verts'")

plt.subplot(324)
plt.scatter(x, y, s=80, c=z, marker=(5, 1))
plt.title("Marker: 'pentagon' rotated")

plt.subplot(325)
plt.scatter(x, y, s=80, c=z, marker='+')
plt.title("Marker: '+'")

plt.subplot(326)
plt.scatter(x, y, s=80, c=z, marker=(5, 2))
plt.title("Marker: 'star'")

plt.tight_layout()
plt.show()

總結

Matplotlib 作為 Python 中最受歡迎的繪相簿之一,其發展趨勢主要體現在以下幾個方面:效能最佳化:隨著資料量的增加和計算需求的提高,Matplotlib 不斷進行效能最佳化,使得繪圖過程更加高效。互動性增強:近年來,Matplotlib 不斷增強互動性,支援使用者與圖形進行互動操作,如縮放、平移、選擇等,提升使用者體驗。美化樣式:Matplotlib 社群不斷開發新的樣式庫和美化工具,使使用者能夠輕鬆地建立出具有吸引力的圖形。擴充套件功能:除了基本的繪圖功能外,Matplotlib 還在不斷擴充套件新的功能模組,如三維繪圖、地理資料視覺化等,以滿足不同領域的需求。整合其他庫:Matplotlib 與其他 Python 庫的整合也在不斷加強,如與 Pandas、NumPy、SciPy 等科學計算庫的結合,使得資料處理和視覺化更加便捷。綜上Matplotlib 作為 Python 中功能強大、靈活易用的繪相簿,將會繼續保持其在資料視覺化領域的重要地位,並隨著技術的發展不斷完善和擴充套件其功能。

參考文獻

  1. matplotlib繪製直方圖,餅圖,散點圖,氣泡圖,箱型圖,雷達圖
  2. Matplotlib資料視覺化基礎pandas統計分析基礎
  3. python+matplotlib繪製具有多個子圖的圖表

相關文章