maplotlib 繪圖
一、基本繪圖
- 首先需要導入繪圖工具以及numpy
import matplotlib.pyplot as plt
import numpy as np
- 繪製一條直線與二次曲線
x = np.linspace(-2, 2, 50) # -2到2之間的50個點 均勻選取
y1 = 2 * x + 1 # 直線方程 y1 也是50個點
y2 = x ** 2 + 1 # 直線方程 y2 也是50個點
#創建一幅圖
plt.figure()
plt.plot(x, y1) #繪製直線
plt.plot(x, y2) #繪製曲線
1. figure()
# figsize=(10,8) 窗口大小
# dpi=80 圖像的分辨率
# facecolor='b' 背景的顏色
plt.figure(figsize=(10, 8), dpi=80,facecolor='b')
plt.figure(figsize=(8, 8), dpi=80,facecolor='r')
2. plt.plot()
- 繪製直線
# color = 'r' 顏色
# linewidth = 5 線寬
# linestyle = '-' 線類型
plt.plot(x, y1,color = 'r',linewidth = 5,linestyle = '-') #實線
plt.plot(x, y2,color = 'b',linewidth = 1,linestyle = '-.') #點劃線
plt.plot(x, y1, color='g', linewidth=3, linestyle=':') #虛線
plt.plot(x, y2, color='y', linewidth=1, linestyle='--') #破折線
- 繪製點
# marker='o' 標記類型
# markerfacecolor='b' 標記顏色
# markersize=20 標記大小
plt.plot(0, 0, marker='o', markerfacecolor='b', markersize=20)
plt.plot(1, 1, marker='*', markerfacecolor='r', markersize=5)
plt.plot(3, 3, marker='x', markerfacecolor='y', markersize=10)
3.plt.subplot()
同個窗口內的多幅圖像
plt.subplot(221)
plt.plot(x, y1,color = 'r',linewidth = 5,linestyle = '-')
plt.plot(x, y2,color = 'b',linewidth = 1,linestyle = '-.')
plt.subplot(222)
plt.plot(x, y1, color='g', linewidth=3, linestyle=':')
plt.plot(x, y2, color='y', linewidth=1, linestyle='--')
plt.subplot(223)
plt.plot(0, 0, marker='o', markerfacecolor='b', markersize=20)
plt.plot(1, 1, marker='*', markerfacecolor='r', markersize=5)
plt.subplot(224)
plt.plot(3, 3, marker='x', markerfacecolor='y', markersize=10)
4. 重新定義座標
# 一種方式,直接用新座標替換
# 第二種方式 替換成文字
new_ticks = np.linspace(-1,2,5)
plt.xticks(new_ticks)
plt.yticks([-3,-1.8,-1,1.5,3],[r'$E\ E$','D',r'$C$','B','A'])
# r'$E\ E$' $$ 顯示字體更標準 空格前必須加\
5. 移動座標軸
# 移動座標軸 ax 就是整張圖
ax = plt.gca() #獲取整張圖
ax.spines['right'].set_color('none')#右邊的軸設置成沒有
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# 設置x軸的位置在 y = 0處
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
6. 增加標註
#方式一 在plot中添加label
plt.plot(x, y2,label = 'up')
plt.plot(x, y1,label = 'down')
# # 自動增加標註 loc = 'best' 'upper right'
plt.legend()
#方式二 定義plot名稱 在legend中定義標籤(推薦)
line1, = plt.plot(x, y2)
line2, = plt.plot(x, y1)
plt.legend(handles = [line1,line2,], labels= ['aaa','bbb'],loc = 'best')
二、高級繪圖
2.1 動畫製作GIF
def sintest1():
fig,ax = plt.subplots()
plt.xlim(-2 * np.pi * 2, 2 * np.pi * 2)
plt.ylim(-1.1,1.1)
x = np.arange(0,2*np.pi,0.05)
line, = ax.plot(x,np.sin(x))
line2, = ax.plot(x,np.cos(x))
text_pt = plt.text(0, 0, '', fontsize=10,color = 'r')
text_pt2 = plt.text(0, 0, '', fontsize=10, color='b')
ax = plt.gca()
ax.spines['right'].set_color('none') # 右邊的軸設置成沒有
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# 設置x軸的位置在 y = -1處
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))
def animate(i):
# plt.xlim(0, 2*np.pi*i/100)
c = i-200
x = np.arange(-4*np.pi,2*np.pi*c/100,0.05)
line.set_xdata(x)
line.set_ydata(np.sin(x))
text_pt.set_position((2*np.pi*c/100, np.sin(2*np.pi*c/100)))
text_pt.set_text("x=%.3f, y=%.3f" % (2*np.pi*c/100, np.sin(2*np.pi*c/100)))
line2.set_xdata(x)
line2.set_ydata(np.cos(x))
text_pt2.set_position((2*np.pi*c/100, np.cos(2*np.pi*c/100)))
text_pt2.set_text("x=%.3f, y=%.3f" % (2*np.pi*c/100, np.cos(2*np.pi*c/100)))
# line.set_xdata(x)
# line.set_ydata(x)
return line,text_pt,line2,text_pt2
def init():
line.set_ydata(np.sin(x))
line2.set_ydata(np.cos(x))
return line,line2
ani = animation.FuncAnimation(fig=fig,func= animate,frames=400,init_func=init,interval=30,blit=True )
# ani.save('sin_test3.gif', writer='pillow', fps=10)
plt.show()