開此博客用於記錄學習和方便複習查看。數組
在matplotlib面向對象的繪圖庫中,pyplot是一個方便的接口。dom
mp.plot(水平座標數組, 垂直座標數組)ide
1 from __future__ import unicode_literals 2 import numpy as np 3 import matplotlib.pyplot as mp 4 x = np.linspace(-np.pi, np.pi, 1000) 5 cos_y = np.cos(x) / 2 6 sin_y = np.sin(x) 7 mp.plot(x, cos_y) 8 mp.plot(x, sin_y) 9 mp.show()
np.linspace(...)
的意思是從-π到+π均勻的取1000個點。函數
實現曲線個性化。佈局
mp.plot(..., linestyle=線型, linewidth=線寬,color=顏色)學習
import numpy as np import matplotlib.pyplot as mp x = np.linspace(-np.pi, np.pi, 1000) cos_y = np.cos(x) / 2 sin_y = np.sin(x) # 添加屬性 mp.plot(x, cos_y, linestyle='--', linewidth=6, color='dodgerblue') mp.plot(x, sin_y, linestyle=':', linewidth=0.5, color='orangered') mp.show()
mp.xlim(左邊界, 右邊界)
mp.ylim(底邊界, 頂邊界)字體
import numpy as np import matplotlib.pyplot as mp x = np.linspace(-np.pi, np.pi, 1000) cos_y = np.cos(x) / 2 sin_y = np.sin(x) # 限制x的取值範圍 mp.xlim(x.min(), x.max()) # 限制y的取值範圍 mp.ylim(sin_y.min(), sin_y.max()) mp.plot(x, cos_y, linestyle='-', linewidth=2, color='dodgerblue') mp.plot(x, sin_y, linestyle=':', linewidth=2, color='orangered') mp.show()
mp.xticks(刻度位置數組, 刻度文本數組)spa
mp.yticks(刻度位置數組, 刻度文本數組)3d
import numpy as np import matplotlib.pyplot as mp x = np.linspace(-np.pi, np.pi, 1000) cos_y = np.cos(x) / 2 sin_y = np.sin(x) mp.xlim(x.min() * 1.1, x.max() * 1.1) mp.ylim(sin_y.min(), sin_y.max()) # 設置x軸和y周的刻度文本 mp.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4, np.pi], [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$', r'$\pi$']) mp.yticks([-1, -0.5, -0.5, 1]) mp.plot(x, cos_y, linestyle='-', linewidth=2, color='dodgerblue') mp.plot(x, sin_y, linestyle=':', linewidth=2, color='orangered') mp.show()
ax = mp.gca() # 獲取當前座標軸
ax.spines['left'].set_position(('data', 0))
ax.spines['left'].set_color(顏色)code
import numpy as np import matplotlib.pyplot as mp x = np.linspace(-np.pi, np.pi, 1000) cos_y = np.cos(x) / 2 sin_y = np.sin(x) mp.xlim(x.min() * 1.1, x.max() * 1.1) mp.ylim(sin_y.min(), sin_y.max()) mp.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4, np.pi], [r'$-\pi$',r'$-\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$', r'$\pi$']) mp.yticks([-1, -0.5, -0.5, 1]) # 獲取當前座標軸 ax = mp.gca() # 移動座標軸 ax.spines['left'].set_position(('data', 0)) ax.spines['bottom'].set_position(('data', 0)) # 將右邊和上面的線條影藏 ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') mp.plot(x, cos_y, linestyle='-', linewidth=2, color='dodgerblue') mp.plot(x, sin_y, linestyle=':', linewidth=2, color='orangered') mp.show()
mp.plot(..., label=圖例文本)
mp.legend(loc='upper left')
1 import numpy as np 2 import matplotlib.pyplot as mp 3 x=np.linspace(-np.pi,np.pi,1000) 4 cos_y=np.cos(x)/2 5 sin_y=np.sin(x) 6 mp.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi*3/4,np.pi],[r'$-\pi$',r'$-\frac{\pi}{2}$',r'$0$',r'$\frac{\pi}{2}$',r'$\frac{3\pi}{4}$',r'$\pi$']) 7 mp.yticks([-1,-0.5,0.5,1]) 8 ax = mp.gca() 9 ax.spines['left'].set_position(('data',0)) 10 ax.spines['bottom'].set_position(('data',0)) 11 ax.spines['right'].set_color('none') 12 ax.spines['top'].set_color('none') 13 mp.xlim(x.min()*1.1,x.max()*1.1) 14 mp.ylim(sin_y.min()*1.1, sin_y.max()*1.1) 15 #添加圖例文本屬性 16 mp.plot(x,cos_y,linestyle='-',linewidth=2,color='dodgerblue', label=r'$y=\frac{1}{2}cos(x)$') 17 mp.plot(x,sin_y,linestyle='-',linewidth=2,color='orangered', label=r'$y=sin(x)$') 18 #設置圖例文本位置 19 mp.legend(loc='upper left') 20 mp.show()
mp.scatter(水平座標數組, 垂直座標數組,marker=點型, s=大小, edgecolor=勾邊色,facecolor=填充色, zorder=Z序)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 x = np.linspace(-np.pi, np.pi, 1000) 4 cos_y = np.cos(x) / 2 5 sin_y = np.sin(x) 6 7 # 取點 8 xo = np.pi * 3 / 4 9 yo_cos = np.cos(xo) / 2 10 yo_sin = np.sin(xo) 11 12 mp.xlim(x.min() * 1.1, x.max() * 1.1) 13 mp.ylim(sin_y.min() * 1.1, sin_y.max() * 1.1) 14 mp.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4, 15 np.pi], 16 [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$', 17 r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$', 18 r'$\pi$']) 19 mp.yticks([-1, -0.5, 0.5, 1]) 20 ax = mp.gca() 21 ax.spines['left'].set_position(('data', 0)) 22 ax.spines['bottom'].set_position(('data', 0)) 23 ax.spines['right'].set_color('none') 24 ax.spines['top'].set_color('none') 25 mp.plot(x, cos_y, linestyle='-', linewidth=2, 26 color='dodgerblue', label=r'$y=\frac{1}{2}cos(x)$') 27 mp.plot(x, sin_y, linestyle='-', linewidth=2, 28 color='orangered', label=r'$y=sin(x)$') 29 # 繪製兩點連線 30 mp.plot([xo, xo], [yo_cos, yo_sin], linestyle='--', 31 linewidth=1, color='limegreen') 32 # 繪製點 33 mp.scatter([xo, xo], [yo_cos, yo_sin], s=60, 34 edgecolor='limegreen', facecolor='white', 35 zorder=3) 36 mp.legend(loc='upper left') 37 mp.show()
mp.annotate(
備註文本,
xy=目標位置,
xycoords=目標座標系,
xytext=文本位置,
textcoords=文本座標系,
fontsize=字體大小,
arrowprops=箭頭屬性)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 x = np.linspace(-np.pi, np.pi, 1000) 4 cos_y = np.cos(x) / 2 5 sin_y = np.sin(x) 6 xo = np.pi * 3 / 4 7 yo_cos = np.cos(xo) / 2 8 yo_sin = np.sin(xo) 9 mp.xlim(x.min() * 1.1, x.max() * 1.1) 10 mp.ylim(sin_y.min() * 1.1, sin_y.max() * 1.1) 11 mp.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi * 3 / 4, 12 np.pi], 13 [r'$-\pi$', r'$-\frac{\pi}{2}$', r'$0$', 14 r'$\frac{\pi}{2}$', r'$\frac{3\pi}{4}$', 15 r'$\pi$']) 16 mp.yticks([-1, -0.5, 0.5, 1]) 17 ax = mp.gca() 18 ax.spines['left'].set_position(('data', 0)) 19 ax.spines['bottom'].set_position(('data', 0)) 20 ax.spines['right'].set_color('none') 21 ax.spines['top'].set_color('none') 22 mp.plot(x, cos_y, linestyle='-', linewidth=2, 23 color='dodgerblue', label=r'$y=\frac{1}{2}cos(x)$') 24 mp.plot(x, sin_y, linestyle='-', linewidth=2, 25 color='orangered', label=r'$y=sin(x)$') 26 mp.plot([xo, xo], [yo_cos, yo_sin], linestyle='--', 27 linewidth=1, color='limegreen') 28 mp.scatter([xo, xo], [yo_cos, yo_sin], s=60, 29 edgecolor='limegreen', facecolor='white', 30 zorder=3) 31 # 添加備註1 32 mp.annotate( 33 r'$\frac{1}{2}cos(\frac{3\pi}{4})=-\frac{\sqrt{2}}{4}$', 34 xy=(xo, yo_cos), xycoords='data', 35 xytext=(-90, -40), textcoords='offset points', 36 fontsize=14, 37 arrowprops=dict(arrowstyle='->', 38 connectionstyle='arc3, rad=.2')) 39 # 添加備註2 40 mp.annotate( 41 r'$sin(\frac{3\pi}{4})=\frac{\sqrt{2}}{2}$', 42 xy=(xo, yo_sin), xycoords='data', 43 xytext=(20, 20), textcoords='offset points', 44 fontsize=14, 45 arrowprops=dict(arrowstyle='->', 46 connectionstyle='arc3, rad=.2')) 47 mp.legend(loc='upper left') 48 mp.show()
mp.figure(圖形對象名, figsize=窗口大小,dpi=分辨率,facecolor=顏色)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 x = np.linspace(-np.pi, np.pi, 1000) 4 cos_y = np.cos(x) / 2 5 sin_y = np.sin(x) 6 # 建立了第一個圖形對象 7 mp.figure('Figure Object 1', figsize=(6, 4), dpi=120, facecolor='lightgray') 8 # 定義標題名字 9 mp.title('Figure Object title 1', fontsize=16) 10 # 設置x,y軸的名字及字體大小 11 mp.xlabel('x', fontsize=12) 12 mp.ylabel('y', fontsize=12) 13 # 設置刻度字體大小 14 mp.tick_params(labelsize=10) 15 # 設置網格 16 mp.grid(linestyle=':') 17 18 # 建立了第二個圖形對象 19 mp.figure('Figure Object 2', figsize=(6, 4), dpi=120, facecolor='lightgray') 20 mp.title('Figure Object title 2', fontsize=16) 21 mp.xlabel('x', fontsize=12) 22 mp.ylabel('y', fontsize=12) 23 mp.tick_params(labelsize=10) 24 mp.grid(linestyle=':') 25 # 將圖形切換到圖形1,進行操做 26 mp.figure('Figure Object 1') 27 mp.plot(x, cos_y, label=r'$y=\frac{1}{2}cos(x)$') 28 mp.legend() 29 30 # 將圖形切換到圖形2,進行操做 31 mp.figure('Figure Object 2') 32 mp.plot(x, sin_y, label=r'$y=sin(x)$') 33 mp.legend() 34 35 mp.show()
注意:對圖形進行操做的時候,要將須要操做的圖形切換到當前
缺省佈局
mp.subplot(行數, 列數, 圖號)
mp.subplot(2, 3, 1)
mp.subplot(231)
1 import matplotlib.pyplot as mp 2 # 建立圖形對象 3 mp.figure(facecolor='lightgray') 4 # 循環插入圖形 5 for i in range(2): 6 for j in range(3): 7 k = i * 3 + j + 1 8 # 在2行3列大畫布上繪出每個圖形,用k區別 9 mp.subplot(2, 3, k) 10 mp.xticks(()) 11 mp.yticks(()) 12 # 在圖形裏添加文字 13 mp.text(0.5, 0.5, str(k), ha='center', va='center', size=36, alpha=0.5) 14 # 使圖形緊湊 15 mp.tight_layout() 16 mp.show()
柵格佈局
import matplotlib.gridspec as mg
gs = mg.GridSpec(行數, 列數) # 柵格佈局器
mp.subplot(gs[行, 列])
1 import matplotlib.pyplot as mp 2 import matplotlib.gridspec as mg 3 mp.figure(facecolor='lightgray') 4 # 刪格佈局器,三行三列 5 gs = mg.GridSpec(3, 3) 6 # 建立第一行佔1,2兩列位置的圖形 7 mp.subplot(gs[0, :2]) 8 mp.xticks(()) 9 mp.yticks(()) 10 mp.text(0.5, 0.5, '1', ha='center', va='center', size=36, alpha=0.5) 11 12 # 建立第一列佔2,3兩行位置的圖形 13 mp.subplot(gs[1:, 0]) 14 mp.xticks(()) 15 mp.yticks(()) 16 mp.text(0.5, 0.5, '2', ha='center', va='center', size=36, alpha=0.5) 17 18 mp.subplot(gs[2, 1:]) 19 mp.xticks(()) 20 mp.yticks(()) 21 mp.text(0.5, 0.5, '3', ha='center', va='center', 22 size=36, alpha=0.5) 23 mp.subplot(gs[:2, 2]) 24 mp.xticks(()) 25 mp.yticks(()) 26 mp.text(0.5, 0.5, '4', ha='center', va='center', 27 size=36, alpha=0.5) 28 mp.subplot(gs[1, 1]) 29 mp.xticks(()) 30 mp.yticks(()) 31 mp.text(0.5, 0.5, '5', ha='center', va='center', 32 size=36, alpha=0.5) 33 34 mp.tight_layout() 35 mp.show()
自由佈局
mp.axes([左下角水平座標, 左下角垂直座標, 寬度, 高度])
其中全部的尺寸參數都是相對比例。
1 import matplotlib.pyplot as mp 2 mp.figure(facecolor='lightgray') 3 # 自由佈局,定義位置和大小 4 mp.axes([0.03, 0.038, 0.94, 0.924]) 5 mp.xticks(()) 6 mp.yticks(()) 7 mp.text(0.5, 0.5, '1', ha='center', va='center', size=36, alpha=0.5) 8 # 自由佈局,定義位置和大小 9 mp.axes([0.63, 0.076, 0.31, 0.308]) 10 mp.xticks(()) 11 mp.yticks(()) 12 mp.text(0.5, 0.5, '2', ha='center', va='center', 13 size=36, alpha=0.5) 14 mp.show()
定位器對象 = mp.xxxLocator(...)
ax = mp.gca()
ax.xaxis.set_major_locator(定位器對象) # 主刻度
ax.xaxis.set_minor_locator(定位器對象) # 次刻度
1 import matplotlib.pyplot as mp 2 import numpy as np 3 mp.figure() 4 5 # 設置各類座標刻度定位器 6 locators = [ 7 'mp.NullLocator()', 8 'mp.MaxNLocator(nbins=3,step=[1,3,5,7,9])', 9 'mp.FixedLocator(locs=[0, 2.5, 5, 7.5, 10])', 10 11 'mp.AutoLocator()', 12 'mp.IndexLocator(offset=0.5, base=1.5)', 13 'mp.MultipleLocator()', 14 'mp.LinearLocator(numticks=21)', 15 'mp.LogLocator(base=2, subs=[1.0])' 16 ] 17 n_locators = len(locators) 18 19 for i, locator in enumerate(locators): 20 mp.subplot(n_locators, 1, i + 1) 21 mp.xlim(0, 10) 22 mp.ylim(-1, 1) 23 mp.yticks(()) 24 ax = mp.gca() 25 ax.spines['left'].set_color('none') 26 ax.spines['top'].set_color('none') 27 ax.spines['right'].set_color('none') 28 ax.spines['bottom'].set_position(('data', 0)) 29 ax.xaxis.set_major_locator(eval(locator)) 30 ax.xaxis.set_minor_locator(mp.MultipleLocator(0.1)) 31 mp.plot(np.arange(11), np.zeros(11), c='none') 32 mp.text(5, 0.3, locator[3:], ha='center', size=12) 33 34 mp.tight_layout() 35 mp.show()
mp.scatter(水平座標數組, 垂直座標數組,s=大小, c=顏色, cmap=顏色映射, alpha=透明度)
1 import matplotlib.pyplot as mp 2 import numpy as np 3 n = 1000 4 # 高斯分佈隨機數 5 # API: normal(loc=0.0, scale=1.0, size=None) 6 # loc:均值,scale:標準差,size:抽取樣本的size 7 x = np.random.normal(0, 1, n) 8 y = np.random.normal(0, 1, n) 9 d = np.sqrt(x**2 + y**2) 10 11 mp.figure('Scatter', facecolor='lightgray') 12 mp.title('Scatter', fontsize=20) 13 mp.xlabel('x', fontsize=14) 14 mp.ylabel('x', fontsize=14) 15 mp.tick_params(labelsize=10) 16 mp.grid(linestyle=':') 17 # 畫點散圖 18 mp.scatter(x, y, s=60, c=d, cmap='jet_r', alpha=0.5, marker='o') 19 mp.show()
mp.fill_between(水平座標數組, 垂直座標起點數組, 垂直座標終點數組, 條件, color=顏色,alpha=透明度)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 n = 1000 4 x = np.linspace(0, 8 * np.pi, n) 5 sin_y = np.sin(x) 6 cos_y = np.cos(x / 2) / 2 7 mp.figure('Fill', facecolor='lightgray') 8 mp.title('Fill', fontsize=20) 9 mp.xlabel('x', fontsize=14) 10 mp.ylabel('y', fontsize=14) 11 mp.tick_params(labelsize=10) 12 mp.grid(linestyle=':') 13 mp.plot(x, sin_y, c='dodgerblue', 14 label=r'$y=sin(x)$') 15 mp.plot(x, cos_y, c='orangered', 16 label=r'$y=\frac{1}{2}cos(\frac{x}{2})$') 17 # 區域填充函數,由cos_y到sin_y之間的區域,塗成藍色 18 mp.fill_between(x, cos_y, sin_y, cos_y < sin_y, 19 color='dodgerblue', alpha=0.5) 20 # 區域填充函數,由cos_y到sin_y之間的區域,塗成橘紅色 21 mp.fill_between(x, cos_y, sin_y, cos_y > sin_y, 22 color='orangered', alpha=0.5) 23 mp.legend() 24 mp.show()
mp.bar(水平座標數組, 高度數組, ec=邊緣顏色,fc=填充顏色, label=標籤文本,alpha=透明度)
1 import numpy as np 2 import matplotlib.pyplot as mp 3 n = 12 4 x = np.arange(n) 5 # numpy.random.uniform(low,high,size) 6 # 從一個均勻分佈[low,high)中隨機採樣,注意定義域是左閉右開,即包含low,不包含high. 7 y1 = (1 - x / n) * np.random.uniform(0.5, 1.0, n) 8 y2 = (1 - x / n) * np.random.uniform(0.5, 1.0, n) 9 10 mp.figure('Bar', facecolor='lightgray') 11 mp.title('Bar', fontsize=20) 12 mp.ylim(-1.25, 1.25) 13 mp.xlabel('x', fontsize=14) 14 mp.ylabel('y', fontsize=14) 15 mp.xticks(x, x + 1) 16 mp.tick_params(labelsize=10) 17 mp.grid(axis='y', linestyle=':') 18 # 柱狀圖 19 mp.bar(x, y1, ec='white', fc='dodgerblue', 20 label='Sample 1') 21 for _x, _y in zip(x, y1): 22 mp.text(_x, _y, '%.2f' % _y, ha='center', 23 va='bottom', size=8) 24 mp.bar(x, -y2, ec='white', fc='dodgerblue', 25 alpha=0.5, label='Sample 2') 26 for _x, _y in zip(x, y2): 27 mp.text(_x, -_y - 0.015, '%.2f' % _y, ha='center', 28 va='top', size=8) 29 mp.legend() 30 mp.show()
mp.contour(x, y, z, 線數, colors=顏色,linewidths=線寬) mp.contourf(x, y, z, 線數, cmap=顏色映射)