首頁 > 軟體

Python Matplotlib繪製動圖平滑曲線

2022-08-12 14:01:14

繪製動圖

FuncAnimation,它的使用要求簡潔且客製化化程度較高。如果想將很多圖片合併為一個動圖,那麼ArtistAnimation是最合適的選擇。

FuncAnimation

通過反覆呼叫同一函數來製作動畫。

注意:建立FuncAnimation物件後一定要將其賦值給某個變數,否則系統會將其進行垃圾回收。

class matplotlib.animation.FuncAnimation(fig, 
										func, 
										frames=None, 
										init_func=None, 
										fargs=None, 
										save_count=None, *, 
										cache_frame_data=True, 
										**kwargs)

引數:

  • fig:Figure。用於顯示動畫的figure物件
  • func:callable。用於更新每幀動畫的函數。func函數的第一個引數為幀序號。返回被更新後的圖形物件列表。
  • frames:iterable, int, generator function, or None, optional。動畫長度,幀序號組成的列表
  • init_func:callable, optional。自定義開始幀,即繪製初始化圖形的初始化函數
  • fargs:tuple or None, optional。額外的需要傳遞給func函數的引數。
  • save_count:int, default: 100。儲存計數
  • cache_frame_data:bool, default: Trueinterval:int, default: 200。重複呼叫功能函數的間隔時間,單位是毫秒。
  • repeat_delay:int, default: 0。當repeat為True時,動畫延遲多少毫秒再回圈。
  • repeat:bool, default: True。是否是迴圈動畫。
  • blit:bool, default: False。選擇更新所有點,還是僅更新產生變化的點。

範例:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig = plt.figure()
ax = fig.subplots()

t=np.linspace(0,10,100)
y=np.sin(t)
ax.set_aspect(3)
ax.plot(t,y,'--',c='gray')
line=ax.plot(t,y,c='C2')

def update(i):  #幀更新函數
    global t    #直接參照全域性變數,也可以通過函數的frames或fargs引數傳遞。
    t+=0.1
    y=np.sin(t)
    line[0].set_ydata(y)
    return line

ani=FuncAnimation(fig,update,interval=100) #繪製動畫
plt.show() #顯示動畫

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure(figsize=(7, 2), dpi=100)
ax = plt.subplot()
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)
line1, = ax.plot(X, C, marker="o", markevery=[-1], markeredgecolor="white")
line2, = ax.plot(X, S, marker="o", markevery=[-1], markeredgecolor="white")

def update(frame):
    line1.set_data(X[:frame], C[:frame])
    line2.set_data(X[:frame], S[:frame])

ani = animation.FuncAnimation(fig, update, interval=10)
plt.show()

方法 init(fig, func[, frames, init_func, …])

  • new_frame_seq()
  • new_saved_frame_seq()
  • pause()
  • resume()
  • save(self, filename, writer=None, fps=None, dpi=None, codec=None, bitrate=None, extra_args=None, metadata=None, extra_anim=None, savefig_kwargs=None)
    • filename:儲存的檔名
    • writer:FFMpegFileWriter,ImageMagickFileWriter, AVConvFileWriter物件範例,或者表示這些物件的字串(‘ffmpeg’, ‘imagemagick’,‘avconv’)
    • fps:每秒的幀數
  • to_jshtml([fps, embed_frames, default_mode])返回js動畫,用base64文字編碼。
    • fps:每秒幀數,預設根據動畫的interval確定。
    • embed_frames:布林型別,是否嵌入幀。
    • default_mode:‘loop’,‘once’或者’reflect’

ArtistAnimation

通過呼叫一個固定的Artist物件來製作動畫,例如給定的系列圖片或者matplotlib的繪圖物件.。

class matplotlib.animation.ArtistAnimation(fig, artists, *args, **kwargs)

引數:

  • fig:Figure
  • artists:list
  • interval:int, default: 200。每一幀之間的間隔
  • repeat_delay:int,
  • default: 0。每顯示一次動畫後間隔多長時間重複
  • repeat:bool, default: True。是否重複動畫
  • blit:bool, default: False

範例:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
fig = plt.figure()
ax = fig.subplots()

arts=[]
t=np.linspace(0,np.pi*2,20)
for i in range(20):
    t+=np.pi*2/20
    y=np.sin(t)
    lines=ax.plot(y,'--',c='gray')  #繪製一幀圖形
    arts.append(lines)              #每幀圖形都儲存到列表中

ani=ArtistAnimation(fig,arts,interval=200) #繪製動畫
#ani.save("animate_artists_basic.gif")  #儲存動畫
plt.show() #顯示動畫

方法:

__init__(fig, artists, *args, **kwargs)
new_frame_seq()
new_saved_frame_seq()
pause()
resume()
save(filename[, writer, fps, dpi, codec, ...])

引數:

  • filename:儲存的動畫檔名稱,如’mov.gif’,‘mov.mp4’。
  • writer:保持動畫的庫。MoviewWriter物件或者字串。預設值’ffmpeg’。

“pillow”:PillowWriter,用pillow庫寫如動畫檔案。
“ffmpeg”:FFMpegWriter,‎基於ffmpeg庫寫動畫。
“ffmpeg_file”:FFMpegFileWriter,基於檔案的FFMpegWriter,用ffmpeg庫把幀寫入臨時檔案,然後拼接成動畫。
“imagemagick”:ImageMagickWriter,‎基於管道的動畫GIF。‎幀通過管道傳輸到ImageMagick並寫入檔案。
“imagemagick_file”:基於檔案的imagemagick寫動畫。
“hmtl”:HTMLWriter,基於javascript html的動畫。

  • fps:每秒幀數,預設根據動畫的interval確定
  • dpi:每英寸點數,預設和figure相同。可以控制動畫大小尺寸。
  • codec:編碼格式,預設’h264’
to_html5_video([embed_limit])

embed_limit:動畫檔案大小限制,單位為MB。預設為20MB,超出限制則不建立動畫。 繪製平滑曲線

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])

plt.plot(x, y)
plt.title("Spline Curve")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

使用 scipy.ndimage.gaussian_filter1d() 高斯核類繪製平滑曲線

import numpy as np
import matplotlib.pyplot as plt 
from scipy.ndimage import gaussian_filter1d

x=np.array([1,2,3,4,5,6,7])
y=np.array([100,50,25,12.5,6.25,3.125,1.5625])
y_smoothed = gaussian_filter1d(y, sigma=5)

plt.plot(x, y_smoothed)
plt.title("Spline Curve Using the Gaussian Smoothing")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

使用 scipy.interpolate.make_interp_spline() 樣條插值類繪製平滑曲線

import numpy as np
from scipy.interpolate import make_interp_spline
import matplotlib.pyplot as plt 
x=np.array([1,2,3,4,5,6,7])
y=np.array([100,50,25,12.5,6.25,3.125,1.5625])
model=make_interp_spline(x, y)
xs=np.linspace(1,7,500)
ys=model(xs)
plt.plot(xs, ys)
plt.title("Smooth Spline Curve")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

它通過使用 scipy.interpolate.make_interp_spline() 首先確定花鍵曲線的係數,繪製出一條平滑的花鍵曲線。我們用給定的資料來估計花樣曲線的係數,然後用係數來確定間隔緊密的 x 值的 y 值,使曲線平滑。繪製曲線需要沿 X 軸 1 到 7 之間間隔相等的 500。

使用 scipy.interpolate.interp1d 插值類繪製平滑曲線

import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

x=np.array([1,2,3,4,5,6,7])
y=np.array([100,50,25,12.5,6.25,3.125,1.5625])

cubic_interploation_model=interp1d(x,y,kind="cubic")
xs=np.linspace(1,7,500)
ys=cubic_interploation_model(xs)
plt.plot(xs, ys)
plt.title("Spline Curve Using Cubic Interpolation")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

繪製曲線時,需要在 X 軸上 1 和 7 之間取間隔相等的 500 個點。

擬合曲線後繪製動圖

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from scipy.interpolate import interp1d

fig = plt.figure(figsize=(7, 2), dpi=100)
ax = plt.subplot()
x = np.array([1, 2, 3, 4, 5, 6, 7])
y = np.array([100, 50, 25, 12.5, 6.25, 3.125, 1.5625])
cubic_interploation_model = interp1d(x, y, kind="cubic")
xs = np.linspace(1, 7, 500)
ys = cubic_interploation_model(xs)
line3 = ax.plot(xs, ys)
def update(frame):
    line3[0].set_data(xs[:frame], ys[:frame])
ani = animation.FuncAnimation(fig, update, interval=10)
plt.show()

到此這篇關於Python Matplotlib繪製動圖平滑曲線的文章就介紹到這了,更多相關Python Matplotlib繪製平滑曲線內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com