julia+Makie制作动画

科技一点鑫得 2024-03-09 01:52:27
Makie可视化库

Makie是Julia编程语言的数据可视化生态系统,具有高性能和可扩展性。它适用于Windows、Mac和Linux平台。Makie的官方文档参见https://makie.juliaplots.org/stable/。

在julia中安装Makie库的方法

import Pkg; Pkg.add("GLMakie")动画制作原理

所谓动画就是很多帧的连续的图像组合起来形成的一种动态效果。Makie使用record方法来录制动画,首先生成一幅图像,接下来通过方法来修改图像,使用record记录一帧帧的图像并生成动画文件(支持.mp4、.mkv、.webm、.gif格式)。

使用Observable

在Makie动画中使用Observable可以大大地减少代码量,由于历史原因在Makie中Observable被称为Node,这两个术语可以互换。Observable是一个容器对象,其中存储的值可以交互式的改变,下面列举几个示例来熟悉Observale如何使用。

Node就是一个可以交互式更新的数据对象,下面创建一个初始值为0.0的Node对象

using GLMakie, Makiex = Node(0.0)

通过空索引的形式可以给Node对象赋值

x[] = 3.4

可以使用空索引的形式和to_value方法获取Node对象的值

data = x[]data = to_value(x)

使用lift方法可以创建依赖Node对象的Node对象

# 定义方法f为x的平方f(x) = x^2# left的第一个参数为方法,剩下的参数为f的输入参数x,为Node对象y = lift(f, x)# 更新x的值,y的值也随之改变x[]=3.3y[]10.889999999999999

可以使用@lift宏的形式创建依赖Node的Node对象,这样可以使新创建的Node对象形式上更加直观和简化

x = Node(rand(100))y = Node(rand(100))# 使用lift来创建z表示z=x+yz = lift((x, y) -> x .+ y, x, y)# 使用@lift来创建z表示z=x+y,使用宏的形式明显更简单明了z = @lift($x .+ $y)

动画示例

接下来我们实现下面这样的一个动画示例,蓝色曲线显示(-2π,2π)范围内的正弦曲线,红色原点动态展示x从-2π到2π范围内变化时(x,y)在正弦曲线上的坐标点的变化。

首先绘制正弦曲线,这个曲线是静态的,始终保持不变

using GLMakie# 创建图像窗口fig = Figure()# 创建子图,布局位置为fig的第1行、第1列# Makie布局采用行列的布局形式,可以生成复杂的布局结构ax = Axis(fig[1,1], tile="Makie动画示例")# 设置x,y轴的坐标范围为x: (-7,7),y: (-2,2)limits!(ax, -7, 7, -2, 2)# 绘制正弦曲线x = range(-2*pi, 2*pi, length=100)y = sin.(x)lines!(ax, x, y, color=:blue)

接下来,创建一个Node对象time来表示x轴上的某个坐标值,并通过scatter方法绘制坐标点(x, sin(x))

# 创建Node对象time,用来表示x轴的值time = Node([0.0])y_time = @lift(sin.($time))# 绘制坐标点(time, sin(time)),scatter!中的!表示在原图的基础上叠加,而不是清空原有的scatter!(ax, time, y_time, color=:red, markersize=15)

最后,使用record方法记录每一帧的图像并生成gif格式的动画文件,生成的文件目录在当前目录中

# 帧速framerate = 30# 为一迭代序列,范围为(-2π,2π),每一帧的变化步长为1/frameratetimestamps = range(-2*pi, 2*pi, step=1/framerate)record(fig, "makie_animation.gif", timestamps; framerate = framerate) do t # t就是timestamps迭代序列中的值 # 给Node对象time动态赋值后,scatter!绘制坐标点的位置也会动态变化 time[] = [t]end
0 阅读:0

科技一点鑫得

简介:感谢大家的关注