matplotlib概述
matplotlib是python的一個繪圖庫.使用它可以很方便的繪製出版質量級別的圖形.
matplotlib的基本功能
- 基本繪圖
- 繪製折線, 設置線型/線寬/顏色等.
- 設置座標軸範圍
- 設置座標刻度
- 設置座標軸位置/顏色
- 圖例
- 特殊點
- 備註
- 高級圖形操作
- 子圖
- 操作刻度定位器/刻度網格線
- 半對數座標
- 散點圖
- 圖像填充
- 條形圖/餅狀圖
- 等高線圖/熱成像圖
- 3D圖形
- 簡單動畫
- 極座標系
matplotlib功能詳解
基本繪圖
繪圖核心API
import matplotlib.pyplot as mp
# 把多個點連起來繪製一條折線
# xarray: 所有點的x座標
# yarray: 所有點的y座標
mp.plot(xarray, yarray)
mp.show()
繪製水平線/垂直線
# 繪製垂直線
mp.vlines(val, ymin, ymax)
# 繪製水平線
mp.hlines(val, xmin, xmax)
案例:繪製一條正弦曲線 [-π, π]
"""
demo02_plot.py 繪製一條正弦曲線
"""
import numpy as np
import matplotlib.pyplot as mp
# [-π,π] 拆1000個點
x = np.linspace(-np.pi, np.pi, 1000)
sin_x = np.sin(x)
# 繪製餘弦曲線 y=1/2 * cos(x)
cos_x = np.cos(x) / 2
# 繪圖
mp.plot(x, sin_x)
mp.plot(x, cos_x)
mp.show()
線型、線寬和顏色
# color:
# 英文顏色單詞 或 常見顏色單詞首字母
# #ABC23E
# (0.5, 0.3, 0.8) 或 (0.5, 0.3, 0.8, 0.4)
mp.plot(
x, y, # 點的座標數組
linestyle='', # 線型: ':' '-' '--'
linewidth=3, # 線寬: 3倍線寬
color='', # 顏色
alpha=0.3 # 透明度
)
設置座標軸範圍
# 設置x軸的可視範圍 [x_min, x_max]
mp.xlim(x_min, x_max)
# 設置y軸的可視範圍 [y_min, y_max]
mp.ylim(y_min, y_max)
設置座標刻度
# 設置x軸的座標刻度
# x_val_list: x軸刻度值序列
# x_text_list: x軸刻度值的文本序列(可選)
mp.xticks(x_val_list, x_text_list)
# 設置y軸的座標刻度
# y_val_list: y軸刻度值序列
# y_text_list: y軸刻度值的文本序列(可選)
mp.yticks(y_val_list, y_text_list)
刻度文本的特殊語法 - latex語法
設置座標軸
# 獲取當前座標軸
ax = mp.gca()
axis = ax.spines['left']
axis = ax.spines['right']
axis = ax.spines['top']
axis = ax.spines['bottom']
# 修改座標軸的顏色
axis.set_color('none')
# 移動座標軸的位置
# data: 基於數據座標系進行定位 0: 把座標軸移動到0的位置
axis.set_position(('data', 0))
案例:
# 設置座標軸
ax = mp.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
圖例
# label: 定義當前曲線的標籤名 該標籤名將會在圖例中顯示
mp.plot(x, y, label='sin(x)')
# 顯示圖例 loc:圖例的位置 (參照legend()文檔字符串)
mp.legend(loc='best')
特殊點
mp.scatter(
xarray, yarray, # 給出點的座標
marker='', # 點型 'D' 's' 'o' ...
s = 60, # 點的大小
edgecolor='', # 邊緣色
facecolor='', # 填充色
zorder=3 # 繪製圖層編號 (編號越大,圖層越靠上)
)
備註
mp.annotate(
r'$[x, y]$', # 備註的文本內容
xycoords='data', # 目標點的座標系
xy=(1, 2), # 目標點的座標
# 定位備註文本位置所使用的座標系
textcoords='offset points',
xytext=(-10, -10), # 備註文本的座標
fontsize=12, # 字體大小
# 箭頭屬性字典
arrowprops=dict(
arrowstyle : '->', # 箭頭樣式
connectionstyle='angle3' # 連接線的樣式
)
)
高級圖形操作
案例:繪製兩個窗口,一起顯示。
# 手動創建一個窗口,窗口的標題titleA
mp.figure('titleA', facecolor='填充色')
# 手動創建第二個窗口,窗口的標題titleB
mp.figure('titleB', facecolor='填充色')
# 由於titleA已經創建過,將會把titleA窗口置爲當前窗口
mp.figure('titleA')
mp.show()
設置當前窗口的常用參數
# 設置圖表的標題
mp.title(' ', fontsize=12)
# 設置水平軸的標籤
mp.xlabel('time', fontsize=12)
# 設置垂直軸的標籤
mp.ylabel('v', fontsize=12)
# 設置刻度參數
mp.tick_params(labelsize=8)
# 設置圖表網格線
mp.grid(linestyle=':')
# 緊湊佈局
mp.tight_layout()
子圖
子圖可以在一個窗口中顯示多張圖表.
矩陣式佈局
矩陣式佈局相關API:
案例:
mp.figure('Subplot A', facecolor='lightgray')
for i in range(9):
mp.subplot(3,3,i+1)
mp.xticks([])
mp.yticks([])
mp.text(0.5, 0.5, i+1, ha='center',
va='center', size=36, alpha=0.5)
mp.tight_layout()
mp.show()
網格式佈局
網格式佈局支持單元格的合併.
import matplotlib.gridspec as mg
mp.figure(...)
# 構建3*3的網格佈局結構
gs = mg.GridSpec(3, 3)
mp.subplot(gs[0, :2])
mp.show()
案例:
"""
demo05_subplot.py 網格式佈局
"""
import matplotlib.pyplot as mp
import matplotlib.gridspec as mg
mp.figure('Grid Layout', facecolor='lightgray')
gs = mg.GridSpec(3, 3)
mp.subplot(gs[0, :2])
mp.text(0.5, 0.5, '1', ha='center',
va='center', size=36)
mp.xticks([])
mp.yticks([])
mp.subplot(gs[:2, 2])
mp.text(0.5, 0.5, '2', ha='center',
va='center', size=36)
mp.xticks([])
mp.yticks([])
mp.subplot(gs[1, 1])
mp.text(0.5, 0.5, '3', ha='center',
va='center', size=36)
mp.xticks([])
mp.yticks([])
mp.subplot(gs[1:, 0])
mp.text(0.5, 0.5, '4', ha='center',
va='center', size=36)
mp.xticks([])
mp.yticks([])
mp.subplot(gs[2, 1:])
mp.text(0.5, 0.5, '5', ha='center',
va='center', size=36)
mp.xticks([])
mp.yticks([])
mp.tight_layout()
mp.show()
自由佈局
mp.figure()
# 0.1, 0.2: 子圖左下角定點座標
# 0.5: 子圖的寬度 0.3:子圖的高度
mp.axes([0.1, 0.2, 0.5, 0.3])
mp.text(...)
mp.show()
刻度定位器
# 獲取當前座標軸
ax = mp.gca()
# 設置x軸的主刻度定位器
locator1 = mp.NullLocator()
ax.xaxis.set_major_locator(locator1)
# 設置x軸的次刻度定位器
locator2 = mp.MultipleLocator(0.1)
ax.xaxis.set_minor_locator(locator2)
案例: 繪製一個數軸.
"""
demo07_locator.py 刻度定位器
"""
import matplotlib.pyplot as mp
locators = ['mp.NullLocator()',
'mp.MultipleLocator(2)',
'mp.MaxNLocator(nbins=6)',
'mp.AutoLocator()',
'mp.FixedLocator(locs=[0, 5, 10])']
mp.figure('Locator', facecolor='lightgray')
for i, locator in enumerate(locators):
mp.subplot(len(locators), 1, i+1)
ax = mp.gca()
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
mp.ylim(-1, 1)
mp.xlim(0, 10)
mp.yticks([])
ax.spines['bottom'].set_position(('data', 0))
# 設置水平軸的刻度定位器
ax.xaxis.set_major_locator(eval(locator))
l2 = mp.MultipleLocator(0.1)
ax.xaxis.set_minor_locator(l2)
mp.show()
刻度網格線
ax = mp.gca()
ax.grid(
which='', # 'major'|'minor'|'both'
axis='', # 'x'|'y'|'both'
linewidth=1,
linestyle=':',
color='',
alpha=0.5
)
案例:
"""
demo08_grid.py 刻度網格線
"""
import matplotlib.pyplot as mp
mp.figure('Grid Line', facecolor='lightgray')
mp.title('Grid Line', fontsize=16)
mp.xlabel('X', fontsize=12)
mp.ylabel('Y', fontsize=12)
mp.tick_params(labelsize=10)
# 繪製刻度網格線
ax = mp.gca()
ax.xaxis.set_major_locator(mp.MultipleLocator())
ax.xaxis.set_minor_locator(
mp.MultipleLocator(0.1))
ax.yaxis.set_major_locator(
mp.MultipleLocator(250))
ax.yaxis.set_minor_locator(
mp.MultipleLocator(50))
ax.grid(which='major', axis='both',
linewidth=0.75, linestyle='-',
color='orange')
ax.grid(which='minor', axis='both',
linewidth=0.25, linestyle='-',
color='orange')
y = [1, 10, 100, 1000, 100, 10, 1]
mp.plot(y, color='dodgerblue')
mp.show()
半對數座標
y軸將會以指數方式遞增. 基於半對數座標系表示上述曲線可以更好的觀察底部數據細節.
# plot改爲semilogy, 座標系將會改爲半對數座標系
mp.semilogy()
散點圖
身高 | 體重 | 性別 | 年齡 | 民族 |
---|---|---|---|---|
180 | 75 | 0 | 18 | 0 |
175 | 60 | 1 | 20 | 1 |
繪製散點圖相關API:
mp.scatter(
xarray, yarray, # 給出點的座標
marker='', # 點型
s = 60, # 點的大小
edgecolor='', # 邊緣色
facecolor='', # 填充色
zorder=3, # 繪製圖層編號
c=d, # 設置過渡性顏色
cmap='jet' # 顏色映射
)
隨機生成符合 正態分佈 的隨機數:
n = 500
# 隨機生成n個數
# 172: 數學期望
# 20: 標準差
x = np.random.normal(172, 20, n)