在Python中给数据做动画--一个简单的指南

456 阅读4分钟

当我们听到数据可视化这个词时,实际上我们想到的是什么?只是在一段时间内,我们可以得到一个图形、线图、散点图等的概念。但是,如果我们可以创建一些现场图。 这些不是视频记录,它只是纯粹的编程和使用一些库。我们能够制作漂亮的图表、直方图、偏差等的动画。

库和环境设置介绍

我们要使用的库是:

  1. Matplotlib
  2. Seaborn
  3. Numpy

集成开发环境的环境:

  1. Visual Studio Code
  2. Anaconda环境
  3. Python版本:3.9.7

Matplotlib的动画类

Matplotlib是一个非常著名的库,它使绘图变得相当容易。它是免费的、开源的,而且文档中提供了一个简单的入门指南。对于动画的目的,它提供了一个特殊的类,即。**"animation"。**这个类有几个函数可以满足我们在Python中为任何数据制作动画的要求。我们将看到如何用一个简单的代码来使用它。

可以查看官方文档:https://matplotlib.org/stable/api/animation_api.html

一个简单的散点图与一个动画散点图的对比

简单散点图的代码:

from matplotlib import pyplot as plt
import random
import sys

x = []
y = []

for i in range(0, 50):
    x.append(random.randint(0, 100))
    y.append(random.randint(0, 100))
        
# plt.xlim(0, 100)
# plt.ylim(0, 100)
plt.xlabel("X-axis")
plt.ylabel("Y-plot")
plt.title("Simple x-y plot")
plt.scatter(x, y, color = "green")
# plt.pause(0.01)
    
sys.exit(plt.show())

动画散点图的代码:

from matplotlib import pyplot as plt
import random
import sys

x = []
y = []

plt.xlabel("X-axis")
plt.ylabel("Y-plot")
plt.title("Simple x-y plot")
for i in range(0, 50):
    x.append(random.randint(0, 100))
    y.append(random.randint(0, 100))
    plt.scatter(x, y, color = "green")
    plt.pause(0.01)
    
sys.exit(plt.show())

解释一下:

  1. 首先,导入库。
  2. 然后我们声明两个空列表x和y。
  3. 然后运行一个for循环,使用 random 模块的 randint() 方法将一些随机的整数填充到列表中。记住要在循环中设置一个限制范围。
  4. 然后我们调用模块中的scatter()函数。 pyplot 模块中的scatter()函数。将绘图颜色设为绿色。
  5. 最后一个是非常重要的。我们使用plt.pause() 函数来设置每个图的时间间隔为0.01 秒。
  6. 然后,最后使用plt.show()函数来显示图。

柱状图的动画代码

from matplotlib import pyplot as plt
import random
import sys

x = []
y = []

plt.xlabel("X-axis")
plt.ylabel("Y-plot")
plt.title("Simple bar plot")
for i in range(0, 50):
    x.append(random.randint(0, 100))
    y.append(random.randint(0, 100))
    plt.bar(x, y, color = "green")
    plt.pause(0.01)
    
sys.exit(plt.show())

解释:

  1. 所有的过程都与上面的图相同。
  2. 但我们调用plt.bar() 函数来绘制动画条形图。

使用matplotlib.animation模块

当我们向前走的时候,主要的重点就放在内置的动画 类上了。这可以说是比较有趣的学习。这个子模块有几个要素。有两个子类继承了这个类的属性。

  1. ArtistAnimation。使用艺术家属性来制作动画。
  2. FuncAnimation:遵循递归原则,连续调用一个函数来制作图表/绘图的动画。

为了使绘图更加精细,我们使用这些类。对于一个快速的例子,我们将看到使用相同概念的sin(x)函数的流程。

FuncAnimation的语法

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

这个类有三个基本参数:

  1. func:一个函数来更新屏幕上的每一帧。
  2. init_func: 一个初始化器,用于读取绘图的数据。
  3. 框架更新屏幕上每秒每一帧的性质。

代码

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

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro')

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)
plt.show()

解释:

  1. 在第一行,从matplotlib的动画类中导入FuncAnimation函数。
  2. 然后为子绘图创建两个对象fig, axs
  3. 声明两个空列表为xdata, ydata。
  4. 然后创建一个plt.plot()函数"ln "和", "的实例 记住要给一个逗号,因为它将创建两个实例。
  5. 空实例有助于我们返回一个艺术家对象的序列。
  6. 创建一个init()函数。在其中设置 x_lim()0,到360度。在NumPy0 到2*np.pi。这决定了我们的函数从一个点到另一个点的旋转。设置y_lim()从-1到1,最后返回ln和那个空实例。
  7. 然后为了更新屏幕上的每一帧,创建一个update()函数。它接受一个 作为参数。在xdata 列表中添加帧。在ydata 列表中添加np.sin(frame),这是正弦转换。
  8. 使用 set_data() 函数修复信息,并插入两个列表xdata和ydata。返回ln和空实例。
  9. 为FuncAnimation()类创建一个动画对象。这需要两个函数作为参数。
    1. 初始化函数:我们代码中的init()
    2. 更新:我们代码中的update()。
  10. 最后用 plt.show() 方法显示图形。
  11. 我们有一个漂亮的sin(x)函数,显示其在轴上的流动。

实时图的应用

  1. 在股票市场上,投资者能够看到股票价格的实时增长和下降。
  2. 多专科医院有心脏监测器,使用动画图显示病人的脉搏。

结论

因此,通过这种方式,我们可以创建美丽的可视化。它们有非常好的应用,在许多现实生活的场景中都很有用。在这里,我们结束了这个话题。