python數據分析 - matplotlib繪圖

matplotlib概述

matplotlib是python的一個繪圖庫。使用它可以很方便的繪製出版質量級別的圖形。

matplotlib基本功能

  1. 基本繪圖 (在二維平面座標系中繪製連續的線)
    1. 設置線型、線寬和顏色
    2. 設置座標軸範圍
    3. 設置座標刻度
    4. 設置座標軸
    5. 圖例
    6. 特殊點
    7. 備註
  2. 圖形對象(圖形窗口)
    1. 子圖
    2. 刻度定位器
    3. 刻度網格線
    4. 半對數座標
    5. 散點圖
    6. 填充
    7. 條形圖
    8. 餅圖
    9. 等高線圖
    10. 熱成像圖
    11. 三維曲面
    12. 簡單動畫

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}$'

xn+yn=zn,1xdx=lnx+C,π2 x^n+y^n=z^n, \int\frac{1}{x} dx = \ln |x| + C, -\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()



附件

cmap回去
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章