文章目錄
matplotlib概述
matplotlib是python的一個繪圖庫。使用它可以很方便的繪製出版質量級別的圖形。
matplotlib基本功能
- 基本繪圖 (在二維平面座標系中繪製連續的線)
- 設置線型、線寬和顏色
- 設置座標軸範圍
- 設置座標刻度
- 設置座標軸
- 圖例
- 特殊點
- 備註
- 圖形對象(圖形窗口)
- 子圖
- 刻度定位器
- 刻度網格線
- 半對數座標
- 散點圖
- 填充
- 條形圖
- 餅圖
- 等高線圖
- 熱成像圖
- 三維曲面
- 簡單動畫
matplotlib基本功能詳解
基本繪圖
繪圖核心API
案例:繪製一條餘弦曲線
import numpy as np
import matplotlib.pyplot as mp
# xarray: <序列> 水平座標序列
# yarray: <序列> 垂直座標序列
mp.plot(xarray, yarray)
#顯示圖表
mp.show()
繪製水平線與垂直線:
import numpy as np
import matplotlib.pyplot as mp
# vertical 繪製垂直線
mp.vlines(vval, ymin, ymax, ...)
# horizotal 繪製水平線
mp.hlines(xval, xmin, xmax, ...)
#顯示圖表
mp.show()
線型、線寬和顏色
案例:繪製一條正弦曲線
# linestyle: 線型 '-' '--' '-.' ':'
# linewidth: 線寬
# 數字
#color: <關鍵字參數> 顏色
# 英文顏色單詞 或 常見顏色英文單詞首字母 或 #495434 或 (1,1,1) 或 (1,1,1,1)
#alpha: <關鍵字參數> 透明度
# 浮點數值
mp.plot(xarray, yarray, linestyle='', linewidth=1, color='', alpha=0.5)
設置座標軸範圍
案例:把座標軸範圍設置爲 -π ~ π
#x_limt_min: <float> x軸範圍最小值
#x_limit_max: <float> x軸範圍最大值
mp.xlim(x_limt_min, x_limit_max)
#y_limt_min: <float> y軸範圍最小值
#y_limit_max: <float> y軸範圍最大值
mp.ylim(y_limt_min, y_limit_max)
設置座標刻度
案例:把橫座標的刻度顯示爲:0, π/2, π, 3π/2, 2π
#x_val_list: x軸刻度值序列
#x_text_list: x軸刻度標籤文本序列 [可選]
mp.xticks(x_val_list , x_text_list )
#y_val_list: y軸刻度值序列
#y_text_list: y軸刻度標籤文本序列 [可選]
mp.yticks(y_val_list , y_text_list )
刻度文本的特殊語法 – LaTex排版語法字符串
r'$x^n+y^n=z^n$', r'$\int\frac{1}{x} dx = \ln |x| + C$', r'$-\frac{\pi}{2}$'
設置座標軸
座標軸名:left / right / bottom / top
# 獲取當前座標軸字典,{'left':左軸,'right':右軸,'bottom':下軸,'top':上軸 }
ax = mp.gca()
# 獲取其中某個座標軸
axis = ax.spines['座標軸名']
# 設置座標軸的位置。 該方法需要傳入2個元素的元組作爲參數
# type: <str> 移動座標軸的參照類型 一般爲'data' (以數據的值作爲移動參照值)
# val: 參照值
axis.set_position((type, val))
# 設置座標軸的顏色
# color: <str> 顏色值字符串
axis.set_color(color)
案例:設置座標軸至中心。
#設置座標軸
ax = mp.gca()
axis_b = ax.spines['bottom']
axis_b.set_position(('data', 0))
axis_l = ax.spines['left']
axis_l.set_position(('data', 0))
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
圖例
顯示兩條曲線的圖例,並測試loc屬性。
# 再繪製曲線時定義曲線的label
# label: <關鍵字參數 str> 支持LaTex排版語法字符串
mp.plot(xarray, yarray ... label='', ...)
# 設置圖例的位置
# loc: <關鍵字參數> 制定圖例的顯示位置 (若不設置loc,則顯示默認位置)
# =============== =============
# Location String Location Code
# =============== =============
# 'best' 0
# 'upper right' 1
# 'upper left' 2
# 'lower left' 3
# 'lower right' 4
# 'right' 5
# 'center left' 6
# 'center right' 7
# 'lower center' 8
# 'upper center' 9
# 'center' 10
# =============== =============
mp.legend(loc='')
特殊點
案例:繪製當x=3π/4時兩條曲線上的特殊點。
# xarray: <序列> 所有需要標註點的水平座標組成的序列
# yarray: <序列> 所有需要標註點的垂直座標組成的序列
mp.scatter(xarray, yarray,
marker='', #點型 ~ matplotlib.markers
s='', #大小
edgecolor='', #邊緣色
facecolor='', #填充色
zorder=3 #繪製圖層編號 (編號越大,圖層越靠上)
)
marker點型可參照:help(matplotlib.markers)
也可參照附錄: matplotlib point樣式
備註
案例:爲在某條曲線上的點添加備註,指明函數方程與值。
# 在圖表中爲某個點添加備註。包含備註文本,備註箭頭等圖像的設置。
mp.annotate(
r'$\frac{\pi}{2}$', #備註中顯示的文本內容
xycoords='data', #備註目標點所使用的座標系(data表示數據座標系)
xy=(x, y), #備註目標點的座標
textcoords='offset points', #備註文本所使用的座標系(offset points表示參照點的偏移座標系)
xytext=(x, y), #備註文本的座標
fontsize=14, #備註文本的字體大小
arrowprops=dict() #使用字典定義文本指向目標點的箭頭樣式
)
arrowprops參數使用字典定義指向目標點的箭頭樣式
#arrowprops字典參數的常用key
arrowprops=dict(
arrowstyle='', #定義箭頭樣式
connectionstyle='' #定義連接線的樣式
)
```py
箭頭樣式(arrowstyle)字符串如下
============ =============================================
Name Attrs
============ =============================================
'-' None
'->' head_length=0.4,head_width=0.2
'-[' widthB=1.0,lengthB=0.2,angleB=None
'|-|' widthA=1.0,widthB=1.0
'-|>' head_length=0.4,head_width=0.2
'<-' head_length=0.4,head_width=0.2
'<->' head_length=0.4,head_width=0.2
'<|-' head_length=0.4,head_width=0.2
'<|-|>' head_length=0.4,head_width=0.2
'fancy' head_length=0.4,head_width=0.4,tail_width=0.4
'simple' head_length=0.5,head_width=0.5,tail_width=0.2
'wedge' tail_width=0.3,shrink_factor=0.5
============ =============================================
連接線樣式(connectionstyle)字符串如下
============ =============================================
Name Attrs
============ =============================================
'angle' angleA=90,angleB=0,rad=0.0
'angle3' angleA=90,angleB=0`
'arc' angleA=0,angleB=0,armA=None,armB=None,rad=0.0
'arc3' rad=0.0
'bar' armA=0.0,armB=0.0,fraction=0.3,angle=None
============ =============================================
圖形對象(圖形窗口)
案例:繪製兩個窗口,一起顯示。
# 手動構建 matplotlib 窗口
mp.figure(
'', #窗口標題欄文本
figsize=(4, 3), #窗口大小 <元組>
dpi=120, #像素密度
facecolor='' #圖表背景色
)
mp.show()
mp.figure方法不僅可以構建一個新窗口,如果已經構建過title='xxx’的窗口,又使用figure方法構建了title=‘xxx’ 的窗口的話,mp將不會創建新的窗口,而是把title='xxx’的窗口置爲當前操作窗口。
設置當前窗口的參數
案例:測試窗口相關參數
# 設置圖表標題 顯示在圖表上方
mp.title(title, fontsize=12)
# 設置水平軸的文本
mp.xlabel(x_label_str, fontsize=12)
# 設置垂直軸的文本
mp.ylabel(y_label_str, fontsize=12)
# 設置刻度參數 labelsize設置刻度字體大小
mp.tick_params(..., labelsize=8, ...)
# 設置圖表網格線 linestyle設置網格線的樣式
# - or solid 粗線
# -- or dashed 虛線
# -. or dashdot 點虛線
# : or dotted 點線
mp.grid(linestyle='')
# 設置緊湊佈局,把圖表相關參數都顯示在窗口中
mp.tight_layout()
子圖
矩陣式佈局
繪製矩陣式子圖佈局相關API:
mp.figure('Subplot Layout', facecolor='lightgray')
# 拆分矩陣
# rows: 行數
# cols: 列數
# num: 編號
mp.subplot(rows, cols, num)
# 1 2 3
# 4 5 6
# 7 8 9
mp.subplot(3, 3, 5) #操作3*3的矩陣中編號爲5的子圖
mp.subplot(335) #簡寫
案例:繪製9宮格矩陣式子圖,每個子圖中寫一個數字。
mp.figure('Subplot Layout', facecolor='lightgray')
for i in range(9):
mp.subplot(3, 3, i+1)
mp.text(
0.5, 0.5, i+1,
ha='center',
va='center',
size=36,
alpha=0.5,
withdash=False
)
mp.xticks([])
mp.yticks([])
mp.tight_layout()
mp.show()
網格式佈局
網格式佈局支持單元格的合併。
繪製網格式子圖佈局相關API:
import matplotlib.gridspec as mg
mp.figure('Grid Layout', facecolor='lightgray')
# 調用GridSpec方法拆分網格式佈局
# rows: 行數
# cols: 列數
# gs = mg.GridSpec(rows, cols) 拆分成3行3列
gs = mg.GridSpec(3, 3)
# 合併0行與0、1列爲一個子圖表
mp.subplot(gs[0, :2])
mp.text(0.5, 0.5, '1', ha='center', va='center', size=36)
mp.show()
-------------------
from matplotlib import gridspec
from matplotlib import pyplot
pyplot.figure('Grid',facecolor='lightgray')
gs=gridspec.GridSpec(3,3)
li=[gs[0,:2],gs[:2,2],gs[1,1],gs[1:,0],gs[2,1:]]
for i in range(5):
pyplot.subplot(li[i])
pyplot.text(
0.5,0.5,i+1,
size=36,
ha='center',
va='center',
alpha=0.6,
)
pyplot.xticks([])
pyplot.yticks([])
pyplot.tight_layout()
pyplot.show()
案例:繪製一個自定義網格佈局。
import matplotlib.gridspec as mg
mp.figure('GridLayout', facecolor='lightgray')
gridsubs = mp.GridSpec(3, 3)
# 合併0行、0/1列爲一個子圖
mp.subplot(gridsubs[0, :2])
mp.text(0.5, 0.5, 1, ha='center', va='center', size=36)
mp.tight_layout()
mp.xticks([])
mp.yticks([])
自由式佈局
自由式佈局相關API:
mp.figure('Flow Layout', facecolor='lightgray')
# 設置圖標的位置,給出左下角點座標與寬高即可
# left_bottom_x: 左下角點x座標
# left_bottom_x: 左下角點y座標
# width: 寬度
# height: 高度
# mp.axes([left_bottom_x, left_bottom_y, width, height])
mp.axes([0.03, 0.03, 0.94, 0.94])
mp.text(0.5, 0.5, '1', ha='center', va='center', size=36)
mp.show()
案例:測試自由式佈局,定位子圖。
mp.figure('FlowLayout', facecolor='lightgray')
mp.axes([0.1, 0.2, 0.5, 0.3])
mp.text(0.5, 0.5, 1, ha='center', va='center', size=36)
mp.show()
刻度定位器
刻度定位器相關API:
# 獲取當前座標軸
ax = mp.gca()
# 設置水平座標軸的主刻度定位器
ax.xaxis.set_major_locator(mp.NullLocator())
# 設置水平座標軸的次刻度定位器爲多點定位器,間隔0.1
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
案例:繪製一個數軸。
mp.figure('Locators', facecolor='lightgray')
# 獲取當前座標軸
ax = mp.gca()
# 隱藏除底軸以外的所有座標軸
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# 將底座標軸調整到子圖中心位置
ax.spines['bottom'].set_position(('data', 0))
# 設置水平座標軸的主刻度定位器
ax.xaxis.set_major_locator(mp.NullLocator())
# 設置水平座標軸的次刻度定位器爲多點定位器,間隔0.1
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
# 標記所用刻度定位器類名
mp.text(5, 0.3, 'NullLocator()', ha='center', size=12)
案例:使用for循環測試刻度器樣式:
locators = ['mp.NullLocator()', 'mp.MaxNLocator(nbins=4)']
for i, locator in enumerate(locators):
mp.subplot(len(locators), 1, i+1)
mp.xlim(0, 10)
mp.ylim(-1, 1)
mp.yticks([])
# 獲取當前座標軸
ax = mp.gca()
# 隱藏除底軸以外的所有座標軸
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# 將底座標軸調整到子圖中心位置
ax.spines['bottom'].set_position(('data', 0))
# 設置水平座標軸的主刻度定位器
ax.xaxis.set_major_locator(eval( ))
# 設置水平座標軸的次刻度定位器爲多點定位器,間隔0.1
ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1))
mp.plot(np.arange(11), np.zeros(11), c='none')
# 標記所用刻度定位器類名
mp.text(5, 0.3, locator, ha='center', size=12)
常用刻度器如下
# 空定位器:不繪製刻度
mp.NullLocator()
# 最大值定位器:
# 最多繪製nbins+1個刻度
mp.MaxNLocator(nbins=3)
# 定點定位器:根據locs參數中的位置繪製刻度
mp.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])
# 自動定位器:由系統自動選擇刻度的繪製位置
mp.AutoLocator()
# 索引定位器:由offset確定起始刻度,由base確定相鄰刻度的間隔
mp.IndexLocator(offset=0.5, base=1.5)
# 多點定位器:從0開始,按照參數指定的間隔(缺省1)繪製刻度
mp.MultipleLocator()
# 線性定位器:等分numticks-1份,繪製numticks個刻度
mp.LinearLocator(numticks=21)
# 對數定位器:以base爲底,繪製刻度
mp.LogLocator(base=2)
刻度網格線
繪製刻度網格線的相關API:
ax = mp.gca()
#繪製刻度網格線
ax.grid(
which='', # 'major'/'minor' <-> '主刻度'/'次刻度'
axis='', # 'x'/'y'/'both' <-> 繪製x或y軸
linewidth=1, # 線寬
linestyle='', # 線型
color='', # 顏色
alpha=0.5 # 透明度
)
案例:繪製曲線 [1, 10, 100, 1000, 100, 10, 1],然後設置刻度網格線,測試刻度網格線的參數。
y = np.array([1, 10, 100, 1000, 100, 10, 1])
mp.figure('Normal & Log', facecolor='lightgray')
mp.subplot(211)
mp.title('Normal', fontsize=20)
mp.ylabel('y', fontsize=14)
ax = mp.gca()
ax.xaxis.set_major_locator(mp.MultipleLocator(1.0))
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))
mp.tick_params(labelsize=10)
ax.grid(which='major', axis='both', linewidth=0.75,
linestyle='-', color='orange')
ax.grid(which='minor', axis='both', linewidth=0.25,
linestyle='-', color='orange')
mp.plot(y, 'o-', c='dodgerblue', label='plot')
mp.legend()
半對數座標
y軸將以指數方式遞增。 基於半對數座標繪製第二個子圖,表示曲線:[1, 10, 100, 1000, 100, 10, 1]。
mp.figure('Grid', facecolor='lightgray')
y = [1, 10, 100, 1000, 100, 10, 1]
mp.semilogy(y)
mp.show()
散點圖
可以通過每個點的座標、顏色、大小和形狀表示不同的特徵值。
身高 | 體重 | 性別 | 年齡段 | 種族 |
---|---|---|---|---|
180 | 80 | 男 | 中年 | 亞洲 |
160 | 50 | 女 | 青少 | 美洲 |
繪製散點圖的相關API:
mp.scatter(
x, # x軸座標數組
y, # y軸座標數組
marker='', # 點型
s=10, # 大小
color='', # 顏色
edgecolor='', # 邊緣顏色
facecolor='', # 填充色
zorder='' # 圖層序號
)
numpy.random提供了normal函數用於產生符合 正態分佈 的隨機數
n = 100
# 172: 期望值
# 10: 標準差
# n: 數字生成數量
x = np.random.normal(172, 20, n)
y = np.random.normal(60, 10, n)
案例:繪製平面散點圖。
mp.figure('scatter', facecolor='lightgray')
mp.title('scatter')
mp.scatter(x, y)
mp.show()
設置點的顏色
mp.scatter(x, y, c='red') #直接設置顏色
d = (x-172)**2 + (y-60)**2
mp.scatter(x, y, c=d, cmap='jet') #以c作爲參數,取cmap顏色映射表中的顏色值
cmap顏色映射表參照附件:cmap顏色映射表
填充
以某種顏色自動填充兩條曲線的閉合區域。
mp.fill_between(
x, # x軸的水平座標
sin_x, # 下邊界曲線上點的垂直座標
cos_x, # 上邊界曲線上點的垂直座標
sin_x<cos_x, # 填充條件,爲True時填充
color='', # 填充顏色
alpha=0.2 # 透明度
)
案例:繪製兩條曲線: sin_x = sin(x) cos_x = cos(x / 2) / 2 [0-8π]
n = 1000
x = np.linspace(0, 8 * np.pi, n)
sin_y = np.sin(x)
cos_y = np.cos(x / 2) / 2
mp.figure('Fill', facecolor='lightgray')
mp.title('Fill', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.plot(x, sin_y, c='dodgerblue',
label=r'$y=sin(x)$')
mp.plot(x, cos_y, c='orangered',
label=r'$y=\frac{1}{2}cos(\frac{x}{2})$')
mp.fill_between(x, cos_y, sin_y, cos_y < sin_y,
color='dodgerblue', alpha=0.5)
mp.fill_between(x, cos_y, sin_y, cos_y > sin_y,
color='orangered', alpha=0.5)
mp.legend()
mp.show()
條形圖(柱狀圖)
繪製柱狀圖的相關API:
mp.figure('Bar', facecolor='lightgray')
mp.bar(
x, # 水平座標數組
y, # 柱狀圖高度數組
width, # 柱子的寬度
color='', # 填充顏色
label='', #
alpha=0.2 #
)
案例:先以柱狀圖繪製蘋果12個月的銷量,然後再繪製橘子的銷量。
apples = np.array([30, 25, 22, 36, 21, 29, 20, 24, 33, 19, 27, 15])
oranges = np.array([24, 33, 19, 27, 35, 20, 15, 27, 20, 32, 20, 22])
mp.figure('Bar' , facecolor='lightgray')
mp.title('Bar', font size=20)
mp.xlabel('Month', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(axis='y', linestyle=':')
mp.ylim((0, 40))
x = np.arange(len(apples))
mp.bar(x-0.2, apples, 0.4, color='dodgerblue',label='Apple')
mp.bar(x + 0.2, oranges, 0.4, color='orangered',label='Orange', alpha=0.75)
mp.xticks(x, [
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
mp.legend()
mp.show()
餅圖
繪製餅狀圖的基本API:
mp.pie(
values, # 值列表
spaces, # 扇形之間的間距列表
labels, # 標籤列表
colors, # 顏色列表
'%d%%', # 標籤所佔比例格式
shadow=True, # 是否顯示陰影
startangle=90 # 逆時針繪製餅狀圖時的起始角度
radius=1 # 半徑
)
案例:繪製餅狀圖顯示5門語言的流行程度:
mp.figure('pie', facecolor='lightgray')
#整理數據
values = [26, 17, 21, 29, 11]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01]
labels = ['Python', 'JavaScript',
'C++', 'Java', 'PHP']
colors = ['dodgerblue', 'orangered',
'limegreen', 'violet', 'gold']
mp.figure('Pie', facecolor='lightgray')
mp.title('Pie', fontsize=20)
# 等軸比例
mp.axis('equal')
mp.pie(
values, # 值列表
spaces, # 扇形之間的間距列表
labels, # 標籤列表
colors, # 顏色列表
'%d%%', # 標籤所佔比例格式
shadow=True, # 是否顯示陰影
startanle=90 # 逆時針繪製餅狀圖時的起始角度
radius=1 # 半徑
)
等高線圖
組成等高線需要網格點座標矩陣,也需要每個點的高度。所以等高線屬於3D數學模型範疇。
繪製等高線的相關API:
mp.contourf(x, y, z, 8, cmap='jet')
cntr = mp.contour(
x, # 網格座標矩陣的x座標 (2維數組)
y, # 網格座標矩陣的y座標 (2維數組)
z, # 網格座標矩陣的z座標 (2維數組)
8, # 把等高線繪製成8部分
colors='black', # 等高線的顏色
linewidths=0.5 # 線寬
)
案例:生成網格座標矩陣,並且繪製等高線:
n = 1000
# 生成網格化座標矩陣
x, y = np.meshgrid(np.linspace(-3, 3, n),
np.linspace(-3, 3, n))
# 根據每個網格點座標,通過某個公式計算z高度座標
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
mp.figure('Contour', facecolor='lightgray')
mp.title('Contour', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 繪製等高線圖
mp.contourf(x, y, z, 8, cmap='jet')
cntr = mp.contour(x, y, z, 8, colors='black',
linewidths=0.5)
# 爲等高線圖添加高度標籤
mp.clabel(cntr, inline_spacing=1, fmt='%.1f',
fontsize=10)
mp.show()
熱成像圖
用圖形的方式顯示矩陣及矩陣中值的大小
1 2 3
4 5 6
7 8 9
繪製熱成像圖的相關API:
# 把矩陣z圖形化,使用cmap表示矩陣中每個元素值的大小
# origin: 座標軸方向
# upper: 缺省值,原點在左上角
# lower: 原點在左下角
mp.imshow(z, cmap='jet', origin='low')
使用顏色條顯示熱度值:
mp.colorbar()
3D圖像繪製
matplotlib支持繪製三維曲面。若希望繪製三維曲面,需要使用axes3d提供的3d座標系。
from mpl_toolkits.mplot3d import axes3d
ax3d = mp.gca(projection='3d') # class axes3d
matplotlib支持繪製三維點陣、三維曲面、三維線框圖:
ax3d.scatter(..) # 繪製三維點陣
ax3d.plot_surface(..) # 繪製三維曲面
ax3d.plot_wireframe(..) # 繪製三維線框圖
3d散點圖的繪製相關API:
ax3d.scatter(
x, # x軸座標數組
y, # y軸座標數組
marker='', # 點型
s=10, # 大小
zorder='', # 圖層序號
color='', # 顏色
edgecolor='', # 邊緣顏色
facecolor='', # 填充色
c=v, # 顏色值 根據cmap映射應用相應顏色
cmap='' #
)
案例:隨機生成3組座標,程標準正態分佈規則,並且繪製它們。
n = 1000
x = np.random.normal(0, 1, n)
y = np.random.normal(0, 1, n)
z = np.random.normal(0, 1, n)
d = np.sqrt(x ** 2 + y ** 2 + z ** 2)
mp.figure('3D Scatter')
ax = mp.gca(projection='3d') # 創建三維座標系
mp.title('3D Scatter', fontsize=20)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
ax.scatter(x, y, z, s=60, c=d, cmap='jet_r', alpha=0.5)
mp.show()
3d平面圖的繪製相關API:
ax3d.plot_surface(
x, # 網格座標矩陣的x座標 (2維數組)
y, # 網格座標矩陣的y座標 (2維數組)
z, # 網格座標矩陣的z座標 (2維數組)
rstride=30, # 行跨距
cstride=30, # 列跨距
cmap='jet' # 顏色映射
)
案例:繪製3d平面圖
n = 1000
# 生成網格化座標矩陣
x, y = np.meshgrid(np.linspace(-3, 3, n),
np.linspace(-3, 3, n))
# 根據每個網格點座標,通過某個公式計算z高度座標
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
mp.figure('3D', facecolor='lightgray')
ax3d = mp.gca(projection='3d')
mp.title('3D', fontsize=20)
ax3d.set_xlabel('x', fontsize=14)
ax3d.set_ylabel('y', fontsize=14)
ax3d.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
# 繪製3D平面圖
# rstride: 行跨距
# cstride: 列跨距
ax3d.plot_surface(x,y,z,rstride=30,cstride=30, cmap='jet')
案例:3d線框圖的繪製
# 繪製3D平面圖
# rstride: 行跨距
# cstride: 列跨距
ax3d.plot_wireframe(x,y,z,rstride=30,cstride=30,
linewidth=1, color='dodgerblue')
簡單動畫
動畫即是在一段時間內快速連續的重新繪製圖像的過程。
matplotlib提供了方法用於處理簡單動畫的繪製。定義update函數用於即時更新圖像。
import matplotlib.animation as ma
#定義更新函數行爲
def update(number):
pass
# 每隔10毫秒執行一次update更新函數,作用於mp.gcf()當前窗口對象
# mp.gcf(): 獲取當前窗口
# update: 更新函數
# interval: 間隔時間(單位:毫秒)
anim = ma.FuncAnimation(mp.gcf(), update, interval=10)
mp.show()
案例:隨機生成各種顏色的100個氣泡。讓他們不斷的增大。
#自定義一種可以存放在ndarray裏的類型,用於保存一個球
ball_type = np.dtype([
('position', float, 2), # 位置(水平和垂直座標)
('size', float, 1), # 大小
('growth', float, 1), # 生長速度
('color', float, 4)]) # 顏色(紅、綠、藍和透明度)
#隨機生成100個點對象
n = 100
balls = np.zeros(100, dtype=ball_type)
balls['position']=np.random.uniform(0, 1, (n, 2))
balls['size']=np.random.uniform(40, 70, n)
balls['growth']=np.random.uniform(10, 20, n)
balls['color']=np.random.uniform(0, 1, (n, 4))
mp.figure("Animation", facecolor='lightgray')
mp.title("Animation", fontsize=14)
mp.xticks
mp.yticks(())
sc = mp.scatter(
balls['position'][:, 0],
balls['position'][:, 1],
balls['size'],
color=balls['color'], alpha=0.5)
#定義更新函數行爲
def update(number):
balls['size'] += balls['growth']
#每次讓一個氣泡破裂,隨機生成一個新的
boom_ind = number % n
balls[boom_ind]['size']=np.random.uniform(40, 70, 1)
balls[boom_ind]['position']=np.random.uniform(0, 1, (1, 2))
# 重新設置屬性
sc.set_sizes(balls['size'])
sc.set_offsets(balls['position'])
# 每隔30毫秒執行一次update更新函數,作用於mp.gcf()當前窗口對象
# mp.gcf(): 獲取當前窗口
# update: 更新函數
# interval: 間隔時間(單位:毫秒)
anim = ma.FuncAnimation(mp.gcf(), update, interval=30)
mp.show()
使用生成器函數提供數據,實現動畫繪製
在很多情況下,繪製動畫的參數是動態獲取的,matplotlib支持定義generator生成器函數,用於生成數據,把生成的數據交給update函數更新圖像:
import matplotlib.animation as ma
#定義更新函數行爲
def update(data):
t, v = data
...
pass
def generator():
yield t, v
# 每隔10毫秒將會先調用生成器,獲取生成器返回的數據,
# 把生成器返回的數據交給並且調用update函數,執行更新圖像函數
anim = ma.FuncAnimation(mp.gcf(), update, generator,interval=10)
案例:繪製信號曲線:y=sin(2 * π * t) * exp(sin(0.2 * π * t)),數據通過生成器函數生成,在update函數中繪製曲線。
mp.figure("Signal", facecolor='lightgray')
mp.title("Signal", fontsize=14)
mp.xlim(0, 10)
mp.ylim(-3, 3)
mp.grid(linestyle='--', color='lightgray', alpha=0.5)
pl = mp.plot([], [], color='dodgerblue', label='Signal')[0]
pl.set_data([],[])
x = 0
def update(data):
t, v = data
x, y = pl.get_data()
x.append(t)
y.append(v)
#重新設置數據源
pl.set_data(x, y)
#移動座標軸
if(x[-1]>10):
mp.xlim(x[-1]-10, x[-1])
def y_generator():
global x
y = np.sin(2 * np.pi * x) * np.exp(np.sin(0.2 * np.pi * x))
yield (x, y)
x += 0.05
anim = ma.FuncAnimation(mp.gcf(), update, y_generator, interval=20)
mp.tight_layout()
mp.show()