簡(jiǎn)介
? ? ? ?matplotlib是一個(gè)在python中廣泛使用的2-D繪圖包窃页。其為python數(shù)據(jù)的可視化提供了一種非常便捷的方法渊抄。
pyplot
? ? ? ?pylot為matplotlib面向?qū)ο罄L圖庫(kù)提供了一個(gè)便利的接口,它的語(yǔ)法和命令和matlab十分類似格郁。
簡(jiǎn)單繪圖
? ? ? ?這一節(jié),我們將會(huì)在同一個(gè)圖像上繪制余弦和正弦曲線,所有的設(shè)置比如:figure size漏麦,dpi,線寬况褪,顏色撕贞,線型,axes测垛,axis以及文字樣式等都采用默認(rèn)參數(shù)捏膨,在后續(xù)的章節(jié)我們會(huì)讓其變得越來(lái)越漂亮。
import matplotlib.pyplot as plt
import numpy as np
# X是一個(gè)numpy.ndarray,從-π 到+π 包含256
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
#C,S分別是X中256個(gè)值得余弦和正弦值
C,S = np.cos(X), np.sin(X)
plt.plot(X,C)
plt.plot(X,S)
plt.show()
修改參數(shù)值
? ? ? ?嘗試著去修改可能影響圖像外觀的參數(shù)食侮,來(lái)體會(huì)下其對(duì)最終展現(xiàn)的影響号涯。
# 創(chuàng)建一個(gè)8x6大小的圖像, 分辨率每英尺80的點(diǎn)
plt.figure(figsize=(8,6), dpi=80)
# 創(chuàng)建一個(gè)1*1的子圖
plt.subplot(111)
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
# 繪制一個(gè)藍(lán)色的,線寬為1個(gè)像素的連續(xù)余弦曲線
plt.plot(X, C, color="blue", linewidth=1.0, linestyle="-")
# 繪制一個(gè)綠色的锯七,線寬為1個(gè)像素的連續(xù)正弦曲線
plt.plot(X, S, color="green", linewidth=1.0, linestyle="-")
# 設(shè)置x軸范圍
plt.xlim(-4.0,4.0)
# 設(shè)置x軸刻度
plt.xticks(np.linspace(-4,4,9,endpoint=True))
# 設(shè)置y軸范圍
plt.ylim(-1.0,1.0)
# 設(shè)置y軸刻度
plt.yticks(np.linspace(-1,1,5,endpoint=True))
# 保存圖像诚隙,分辨率為72
# plt.savefig("exercice.png",dpi=72)
# 在屏幕上顯示結(jié)果
plt.show()
改變顏色和線寬
plt.figure(figsize=(10,6), dpi=80)
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")
設(shè)置坐標(biāo)軸范圍
當(dāng)前圖像的坐標(biāo)軸和圖像之間太過(guò)緊湊,可以在坐標(biāo)軸和圖像之間增加一些空間起胰。
plt.xlim(X.min()*1.1, X.max()*1.1)
plt.ylim(C.min()*1.1, C.max()*1.1)
設(shè)置刻度
對(duì)于繪制正弦余弦圖像而言久又,上述圖像的坐標(biāo)表示并不理想,沒有標(biāo)出特殊點(diǎn)的位置比如-π效五,π 地消,-π/2 ,π/2等
plt.xticks( [-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
plt.yticks([-1, 0, +1])
設(shè)置刻度標(biāo)簽
在設(shè)置刻度是,我們還可以指定對(duì)應(yīng)的標(biāo)簽畏妖,如果有數(shù)學(xué)公式還可以使用latex語(yǔ)法脉执。
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1, 0, +1],[r'$-1$', r'$0$', r'$+1$'])
移動(dòng)脊線
脊線其實(shí)就是圖中邊框的四個(gè)邊(top/bottom/left/right),它可以連接數(shù)據(jù)刻度戒劫,確定數(shù)據(jù)范圍半夷,同樣也是可以隨意移動(dòng)的婆廊。
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
添加圖例
在左上角添加圖例,在添加圖例前需要在plt.plot中增加label參數(shù)
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label=r'$cos(x)$')
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label=r'$sin(x)$')
plt.legend(loc='upper left', frameon=False)
添加注釋
給你感興趣的點(diǎn)添加注釋巫橄,這里給x=2π/3位置的sin和cos曲線添加注釋淘邻。
t = 2*np.pi/3
plt.plot([t,t],[0,np.cos(t)],linestyle="--",color='blue',linewidth=1.5)
plt.scatter([t,],[np.cos(t),],50,color='blue')
plt.annotate(r'$\cos(\frac{2\pi}{3}) = -\frac{\sqrt{3}}{2}$',xy=(t,np.cos(t)),xycoords='data',xytext=(-90, -50))
plt.plot([t,t],[0,np.sin(t)],linestyle="--",color="red",linewidth=1.5)
plt.scatter([t,],[np.sin(t),],50,color='red')
Figures,Subplot,Axes 和Ticks
到目前為止,我們都在使用默認(rèn)的Figure和Axes湘换,這對(duì)于快速繪圖來(lái)確實(shí)很方便宾舅。我們也可以使用figure,subplot,axes顯示的控制圖像的顯示。在matplotlib中一個(gè)figure意味著用戶界面的整個(gè)窗體彩倚。在figure中可以是subplot筹我,也可以是axes,subplot只能以規(guī)則格網(wǎng)的形式展現(xiàn)帆离,axes用戶可以任意的指定放置的位置蔬蕊,你可以根據(jù)你的使用目的來(lái)選擇。當(dāng)我們繪制圖形的時(shí)候matplotlib會(huì)調(diào)用gca()獲取當(dāng)前的Axe哥谷,gca會(huì)調(diào)用gcf獲取當(dāng)前的figure岸夯。
Figures
Figures就是GUI中的一個(gè)窗體,它有很多參數(shù)可以控制Figure的樣式
參數(shù) | 默認(rèn)值 | 描述 |
---|---|---|
num | 1 | figure的索引 |
figsize | figure.figsize | 圖像大小(寬呼巷,高)囱修,單位英尺 |
dpi | figure.dpi | 每英尺圖像的分辨率 |
facecolor | figure.facecolor | 背景顏色 |
edgecolor | figure.edgecolor | 圍繞繪圖區(qū)域邊緣的顏色 |
frameon | True | 是否繪制圖像框架 |
subplots
通過(guò)子圖赎瑰,你可以合理的布局自己的圖像王悍,只需要指定行列書以及當(dāng)前繪制的圖像索引。 gridspec 是一個(gè)更為強(qiáng)大的設(shè)定字圖的工具
plt.subplot(2,1,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,1,1)',ha='center',va='center',size=24,alpha=.5)
plt.subplot(2,1,2)
plt.xticks([]), yticks([])
plt.text(0.5,0.5, 'subplot(2,1,2)',ha='center',va='center',size=24,alpha=.5)
# plt.savefig('.subplot-horizontal.png', dpi=64)
plt.show()
plt.subplot(1,2,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(1,2,1)',ha='center',va='center',size=24,alpha=.5)
plt.subplot(1,2,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(1,2,2)',ha='center',va='center',size=24,alpha=.5)
# plt.savefig('subplot-vertical.png', dpi=64)
plt.show()
plt.subplot(2,2,1)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,1)',ha='center',va='center',size=20,alpha=.5)
plt.subplot(2,2,2)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,2)',ha='center',va='center',size=20,alpha=.5)
plt.subplot(2,2,3)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,3)',ha='center',va='center',size=20,alpha=.5)
plt.subplot(2,2,4)
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'subplot(2,2,4)',ha='center',va='center',size=20,alpha=.5)
# plt.savefig('subplot-grid.png', dpi=64)
plt.show()
import matplotlib.gridspec as gridspec
G = gridspec.GridSpec(3, 3)
axes_1 = plt.subplot(G[0, :])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Axes 1',ha='center',va='center',size=24,alpha=.5)
axes_2 = plt.subplot(G[1,:-1])
plt.xticks([]),plt.yticks([])
plt.text(0.5,0.5, 'Axes 2',ha='center',va='center',size=24,alpha=.5)
axes_3 = plt.subplot(G[1:, -1])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Axes 3',ha='center',va='center',size=24,alpha=.5)
axes_4 = plt.subplot(G[-1,0])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Axes 4',ha='center',va='center',size=24,alpha=.5)
axes_5 = plt.subplot(G[-1,-2])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'Axes 5',ha='center',va='center',size=24,alpha=.5)
#plt.savefig('gridspec.png', dpi=64)
plt.show()
Axes
Axes和subplot非常類似餐曼,不同的是压储,用戶可以任意設(shè)定Axes在Figures中的位置。
plt.axes([0.1,0.1,.8,.8])
plt.xticks([]), plt.yticks([])
plt.text(0.6,0.6, 'axes([0.1,0.1,.8,.8])',ha='center',va='center',size=20,alpha=.5)
plt.axes([0.2,0.2,.3,.3])
plt.xticks([]), plt.yticks([])
plt.text(0.5,0.5, 'axes([0.2,0.2,.3,.3])',ha='center',va='center',size=16,alpha=.5)
plt.show()
plt.axes([0.1,0.1,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.1,0.1,.8,.8])',ha='left',va='center',size=16,alpha=.5)
plt.axes([0.2,0.2,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.2,0.2,.5,.5])',ha='left',va='center',size=16,alpha=.5)
plt.axes([0.3,0.3,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.3,0.3,.5,.5])',ha='left',va='center',size=16,alpha=.5)
plt.axes([0.4,0.4,.5,.5])
plt.xticks([]), plt.yticks([])
plt.text(0.1,0.1, 'axes([0.4,0.4,.5,.5])',ha='left',va='center',size=16,alpha=.5)
# plt.savefig("axes-2.png",dpi=64)
plt.show()
Ticks
合理的刻度是圖像展示的重要組成部分
其它類型的圖像
常規(guī)繪圖
n = 256
X = np.linspace(-np.pi,np.pi,n,endpoint=True)
Y = np.sin(2*X)
plt.axes([0.025,0.025,0.95,0.95])
plt.plot (X, Y+1, color='blue', alpha=1.00)
plt.fill_between(X, 1, Y+1, color='blue', alpha=.25)
plt.plot (X, Y-1, color='blue', alpha=1.00)
plt.fill_between(X, -1, Y-1, (Y-1) > -1, color='blue', alpha=.25)
plt.fill_between(X, -1, Y-1, (Y-1) < -1, color='red', alpha=.25)
plt.xlim(-np.pi,np.pi), plt.xticks([])
plt.ylim(-2.5,2.5), plt.yticks([])
# plt.savefig('plot_ex.png',dpi=48)
plt.show()
散點(diǎn)圖
n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X)
plt.axes([0.025,0.025,0.95,0.95])
plt.scatter(X,Y, s=75, c=T, alpha=.5)
plt.xlim(-1.5,1.5), plt.xticks([])
plt.ylim(-1.5,1.5), plt.yticks([])
# plt.savefig('scatter_ex.png',dpi=48)
plt.show()
柱狀圖
n = 12
X = np.arange(n)
Y1 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
Y2 = (1-X/float(n)) * np.random.uniform(0.5,1.0,n)
plt.axes([0.025,0.025,0.95,0.95])
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
for x,y in zip(X,Y1):
plt.text(x+0.4, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
for x,y in zip(X,Y2):
plt.text(x+0.4, -y-0.05, '%.2f' % y, ha='center', va= 'top')
plt.xlim(-.5,n), plt.xticks([])
plt.ylim(-1.25,+1.25), plt.yticks([])
# plt.savefig('bar_ex.png', dpi=48)
plt.show()
等值線圖
def f(x,y):
return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)
X,Y = np.meshgrid(x,y)
plt.axes([0.025,0.025,0.95,0.95])
plt.contourf(X, Y, f(X,Y), 8, alpha=.75, cmap=plt.cm.hot)
C = plt.contour(X, Y, f(X,Y), 8, colors='black', linewidth=.5)
plt.clabel(C, inline=1, fontsize=10)
plt.xticks([]), plt.yticks([])
plt.show()
顯示圖像
def f(x,y):
return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
n = 10
x = np.linspace(-3,3,3.5*n)
y = np.linspace(-3,3,3.0*n)
X,Y = np.meshgrid(x,y)
Z = f(X,Y)
plt.axes([0.025,0.025,0.95,0.95])
plt.imshow(Z,interpolation='nearest', cmap='bone', origin='lower')
plt.colorbar(shrink=.92)
plt.xticks([]), plt.yticks([])
plt.show()
餅狀圖
n = 20
Z = np.ones(n)
Z[-1] *= 2
plt.axes([0.025,0.025,0.95,0.95])
plt.pie(Z, explode=Z*.05, colors = ['%f' % (i/float(n)) for i in range(n)])
plt.gca().set_aspect('equal')
plt.xticks([]), plt.yticks([])
plt.show()
繪制格網(wǎng)
axe = plt.gca()
axe.set_xlim(0,4)
axe.set_ylim(0,3)
axe.xaxis.set_major_locator(plt.MultipleLocator(1.0))
axe.xaxis.set_minor_locator(plt.MultipleLocator(0.1))
axe.yaxis.set_major_locator(plt.MultipleLocator(1.0))
axe.yaxis.set_minor_locator(plt.MultipleLocator(0.1))
axe.grid(which='major',axis='x',linewidth=0.75, linestyle='-', color='0.75')
axe.grid(which='minor', axis='x', linewidth=0.25, linestyle='-', color='0.75')
axe.grid(which='major',axis='y',linewidth=0.75, linestyle='-', color='0.75')
axe.grid(which='minor', axis='y', linewidth=0.25, linestyle='-', color='0.75')
axes.set_xticklabels([])
axes.set_yticklabels([])
plt.show()
3D圖像
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X,Y = np.meshgrid(X,Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
ax.plot_surface(X,Y,Z,rstride=1, cstride=1, cmap='hot')
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.cm.hot)
ax.set_zlim(-2,2)
plt.show()
繪制文本
eqs = []
eqs.append((r"$W^{3\beta}_{\delta_1 \rho_1 \sigma_2} = U^{3\beta}_{\delta_1 \rho_1} + \frac{1}{8 \pi 2} \int^{\alpha_2}_{\alpha_2} d \alpha^\prime_2 \left[\frac{ U^{2\beta}_{\delta_1 \rho_1} - \alpha^\prime_2U^{1\beta}_{\rho_1 \sigma_2} }{U^{0\beta}_{\rho_1 \sigma_2}}\right]$"))
eqs.append((r"$\frac{d\rho}{d t} + \rho \vec{v}\cdot\nabla\vec{v} = -\nabla p + \mu\nabla^2 \vec{v} + \rho \vec{g}$"))
eqs.append((r"$\int_{-\infty}^\infty e^{-x^2}dx=\sqrt{\pi}$"))
eqs.append((r"$E = mc^2 = \sqrt{{m_0}^2c^4 + p^2c^2}$"))
eqs.append((r"$F_G = G\frac{m_1m_2}{r^2}$"))
plt.axes([0.025,0.025,0.95,0.95])
for i in range(24):
index = np.random.randint(0,len(eqs))
eq = eqs[index]
size = np.random.uniform(12,32)
x,y = np.random.uniform(0,1,2)
alpha = np.random.uniform(0.25,.75)
plt.text(x, y, eq, ha='center', va='center', color="#11557c", alpha=alpha,
transform=plt.gca().transAxes, fontsize=size, clip_on=True)
plt.xticks([]), plt.yticks([])
plt.show()