📜  Python中的图形绘图 |设置 3

📅  最后修改于: 2022-05-13 01:55:03.439000             🧑  作者: Mango

Python中的图形绘图 |设置 3

Python中的图形绘图 |设置 1
Python中的图形绘图 |设置 2

Matplotlib 是一个非常广泛的库,它也支持图形动画。动画工具以matplotlib.animation基类为中心,它提供了一个构建动画功能的框架。主要的接口是TimedAnimationFuncAnimation ,在这两个接口中, FuncAnimation是最方便使用的一个。

安装:

  • Matplotlib :请参阅Python中的图形绘图 |设置 1
  • Numpy:您可以使用以下 pip 命令安装 numpy 模块:
    pip install numpy
  • FFMPEG :仅在将动画保存为视频时才需要。可执行文件可以从这里下载。

执行:

# importing required modules
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
  
# create a figure, axis and plot element
fig = plt.figure()
ax = plt.axes(xlim=(-50, 50), ylim=(-50, 50))
line, = ax.plot([], [], lw=2)
  
# initialization function
def init():
    # creating an empty plot/frame
    line.set_data([], [])
    return line,
  
# lists to store x and y axis points
xdata, ydata = [], []
  
# animation function
def animate(i):
    # t is a parameter
    t = 0.1*i
      
    # x, y values to be plotted
    x = t*np.sin(t)
    y = t*np.cos(t)
      
    # appending new points to x, y axes points list
    xdata.append(x)
    ydata.append(y)
      
    # set/update the x and y axes data
    line.set_data(xdata, ydata)
      
    # return line object
    return line,
      
# setting a title for the plot
plt.title('A growing coil!')
# hiding the axis details
plt.axis('off')
  
# call the animator    
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=500, interval=20, blit=True)
  
# save the animation as mp4 video file
anim.save('animated_coil.mp4', writer = 'ffmpeg', fps = 30)
  
# show the plot
plt.show()

这是输出动画的样子:现在,让我们尝试分段理解代码:

  • fig = plt.figure()
    ax = plt.axes(xlim=(-50, 50), ylim=(-50, 50))
    line, = ax.plot([], [], lw=2)

    在这里,我们首先创建一个图形,即所有子图的顶级容器。
    然后我们创建一个轴元素ax作为子图。 x 和 y 轴的范围/限制也在创建轴元素时定义。
    最后,我们创建名为line绘图元素。最初,x 和 y 轴点被定义为空列表,线宽(lw)被设置为 2。

  • def init():
        line.set_data([], [])
        return line,

    现在,我们声明一个初始化函数init 。动画师调用此函数来创建第一帧。

  • def animate(i):
        # t is a parameter
        t = 0.1*i
        
        # x, y values to be plotted
        x = t*np.sin(t)
        y = t*np.cos(t)
        
        # appending new points to x, y axes points list
        xdata.append(x)
        ydata.append(y)
        
        # set/update the x and y axes data
        line.set_data(xdata, ydata)
        
        # return line object
        return line,

    这是上述程序最重要的函数。动画师一次又一次地调用animate()函数来创建每一帧。调用此函数的次数由帧数决定,帧数作为参数传递给 animator。
    animate()函数将第 i 帧的索引作为参数。

    t = 0.1*i

    在这里,我们巧妙地使用了当前帧的索引作为参数!

    x = t*np.sin(t)
    y = t*np.cos(t)

    现在,由于我们有参数t ,我们可以轻松地绘制任何参数方程。例如,在这里,我们正在使用其参数方程绘制螺旋线。

    line.set_data(xdata, ydata)
    return line,

    最后,我们使用set_data()函数设置 x 和 y 数据,然后返回绘图对象line

  • anim = animation.FuncAnimation(fig, animate, init_func=init,
                                   frames=500, interval=20, blit=True)

    现在,我们创建 FuncAnimation 对象anim 。它需要下面解释的各种参数:
    fig :要绘制的图形。
    animate :为每一帧重复调用的函数
    init_func :用于绘制清晰框架的函数。它在第一帧之前被调用一次。
    帧数:帧数。 (注意:也可以是可迭代的或生成器。)
    间隔:帧之间的持续时间(以毫秒为单位)
    blit :设置 blit=True 意味着只绘制那些已经改变的部分。

  • anim.save('animated_coil.mp4', writer = 'ffmpeg', fps = 30)

    现在,我们使用save()函数将 animator 对象保存为视频文件。您将需要一个电影作家来保存动画视频。在此示例中,我们使用了 FFMPEG 电影编写器。所以,作家被设置为'ffmpeg'。
    fps代表每秒帧数。

示例 2

这个例子展示了如何通过应用一些简单的数学来制作旋转曲线!

# importing required modules
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
  
# create a figure, axis and plot element
fig = plt.figure()
ax = plt.axes(xlim=(-25, 25), ylim=(-25, 25))
line, = ax.plot([], [], lw=2)
  
# initialization function
def init():
    # creating an empty plot/frame
    line.set_data([], [])
    return line,
  
# set of points for a star (could be any curve)
p = np.arange(0, 4*np.pi, 0.1)
x = 12*np.cos(p) + 8*np.cos(1.5*p)
y = 12*np.sin(p) - 8*np.sin(1.5*p)
  
# animation function
def animate(i):
    # t is a parameter
    t = 0.1*i
      
    # x, y values to be plotted
    X = x*np.cos(t) - y*np.sin(t)
    Y = y*np.cos(t) + x*np.sin(t)
      
    # set/update the x and y axes data
    line.set_data(X, Y)
      
    # return line object
    return line,
      
# setting a title for the plot
plt.title('A rotating star!')
# hiding the axis details
plt.axis('off')
  
# call the animator    
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=100, interval=100, blit=True)
  
# save the animation as mp4 video file
anim.save('basic_animation.mp4', writer = 'ffmpeg', fps = 10)
  
# show the plot
plt.show()

以下是上述程序的输出:在这里,我们使用了一些简单的数学方法来旋转给定的曲线。

  • 星形是通过将 k = 2.5 和 0 x= [a-b]\cos (t) + b\cos [t(\frac{a}{b}-1)]

     y= [a-b]\sin (t) - b\sin [t(\frac{a}{b}-1)] , k= \frac{a}{b}

    这里也应用了同样的方法:

    p = np.arange(0, 4*np.pi, 0.1)
    x = 12*np.cos(p) + 8*np.cos(1.5*p)
    y = 12*np.sin(p) - 8*np.sin(1.5*p)
  • 现在,在每一帧中,我们使用复数旋转的概念来旋转星形曲线。设 x, y 为两个纵坐标。然后旋转角度 theta 后,新的纵坐标为:

     {x}' = x\cos \theta - y\sin \theta

     {y}' =  x\sin \theta + y\cos \theta

    这里也应用了同样的方法:

    X = x*np.cos(t) - y*np.sin(t)
    Y = y*np.cos(t) + x*np.sin(t)

总而言之,动画是创造令人惊叹的东西的好工具,并且可以使用它们来创造更多的东西。

因此,这就是使用 Matplotlib 生成和保存动画图的方式。