Pyplot
http://www.labri.fr/perso/nrougier/teaching/matplotlib/
pyplot提供了一個方便的matplotlib基於對象庫的借口,是模仿了matlab,因此,在pyplot中的很多命令和參數,都和matlab相似。
簡單的畫圖simple plot
我們想在同一個圖中划出一個cos和sin函數圖,第一步是獲取cos和sin的數據,構建函數
import numpy as np
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
定義了一個numpy的數組X,從-π到π,共256個值,同時定義了C和S,也就是兩個三角函數,也有256個值。也是一個數組,也可以說是列表。
在matplotlib中,有一系列的默認設置,用來自定義各種屬性。可以通過配置各種屬性,來調整整個圖,比如表格大小、像素、線的寬度,顏色和風格,線軸、坐標、表格屬性、文本和字體屬性。在很多情況下,默認的設置都是比較好用的,如果是有特殊的需求,可以修改這些屬性值。
開始畫圖。
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-np.pi,np.pi,256,endpoint=True)
y = np.sin(x)
z = np.cos(x)
plt.plot(x,y)
plt.plot(x,z)
plt.show()
實例化默認值
在下面的腳本中,可以通過修改所有的表格屬性值,來影響圖標的展出。而在上面的圖中,這些值都被明確的設定為默認值,現在可以通過交互式的操作,來看一下這些值影響的效果。
下面是線條屬性值和線條樣式。
from matplotlib import pyplot as plt
import numpy as np
#創建一個6×8的圖框,像素為100
plt.figure(figsize=(6,8),dpi=100)
#創建一個子圖,網格為1×1
plt.subplot(111)
x = np.linspace(-np.pi,np.pi,256,endpoint=True)
y = np.sin(x)
z = np.cos(x)
#畫圖,使用不同的顏色和線條
plt.plot(x,y,color='blue',linewidth=1.0,linestyle='-')
plt.plot(x,z,color='red',linewidth=1.0,linestyle='-')
#設置x軸的范圍
plt.xlim(-4,4)
#設置x軸的標尺刻度,從-4到4,取9個值
plt.xticks(np.linspace(-4,4,9,endpoint=True))
#設置y軸的范圍
plt.ylim(-1,1)
#設置y軸的標尺刻度,從-1到1,取5個值
plt.yticks(np.linspace(-1,1,5,endpoint=True))
plt.show()
畫出來的圖如下所示:
第一步:修改線條顏色,cos線條是藍色,sin線條是紅色,設置線條寬度。
plt.plot(x,y,color='blue',linewidth=1.0,linestyle='-')
plt.plot(x,z,color='red',linewidth=1.0,linestyle='-')
第二步:修改限制,當前表格的限制有一點緊,可以適當擴充一下表格大小,主要是x和y的兩邊。
#放大x和y軸
plt.xlim(x.min()*1.1,x.max()*1.1)
plt.ylim(y.min()*1.1,y.max()*1.1)
第三步:設置刻度值,因為在三角函數的圖像中,x軸上面應該顯示的是從-π到π的5個值。但是實際上顯示的是數字,所以想通過修改這個刻度值,來顯示。
#設置x軸的刻度值,顯示pi
plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi])
第四步:設置刻度值標簽,實際上上面的圖還是沒有顯示π。現在是已經均分了x軸,雖然現實的是3.14,最好還是顯示π,在設置刻度值的時候,在第二個參數中也提供了對應的標簽。
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$'])
兩個參數,將第一個參數值,用第二個參數來顯示
第五步:移動spines
Spine是一組線,連接了軸心刻度,在數據區域的邊界,可以放置在任意位置,目前是防止在軸心的邊界上了。需要改變一下,移動到中間,坐標系有四個象限,放棄了頂部和右側的部分,也就是輪廓。實際上意思是說,在這個圖里面,spine是最外側的4條線,將數據圖像封閉在其中。通過移動spine,讓坐標系的中心在原點,然后將上側和右側的spine刪除,也就是 取消顏色。然后將底部和左側的spine,移動到數據為0的區域。
有4個spine,分別是top,bottom,right和left,分別對應封閉這個數據圖形的4個邊。需要修改的代碼如下:
#移動邊界線,構建坐標系,原點為0
ax = plt.gca()#獲取當前軸線實例
ax.xaxis.set_ticks_position('bottom')#x軸線,使用spine中的bottom線
ax.yaxis.set_ticks_position('left')#y軸線,使用spine中的left線
ax.spines['bottom'].set_position(('data',0))#將bottom線的位置設置為數據為0的位置
ax.spines['left'].set_position(('data',0))#將left線的位置設置為數據為0的位置
ax.spines['top'].set_color('none')#將top線的顏色設置為無
ax.spines['right'].set_color('none')#將right線的顏色設置為無
第六步:增加圖例
在圖的左上角增加圖例,需要在plot方法中增加關鍵字label,然后這個關鍵字會被在legend中調用。
#增加圖例
plt.plot(x,y,label='Sin(x)')
plt.plot(x,z,label='Cos(x)')
plt.legend(loc='upper left')#將圖例放在左上角
第七步:注釋特定點
通過注釋命令,可以為特定的點增加注釋,也就是在圖中標出這些特定的點,假如要在途中,為2π/3標注出sin和cos的值。需要在曲線上,畫一條垂直的虛線,然后通過箭頭,在圖上表示出來。
#在圖上增加標注信息
t = 2*np.pi/3
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=1.5, linestyle="--")
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=(+10, +30), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))