You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于LineCollection实现不规则间距1D数据的波浪下落动画?

不规则Z轴间距的波浪下移动画实现方案

针对你需要的彩色填充波浪向下移动动画,结合Z轴数据间距不规则的特点,下面提供两种可行方案:一种是基于LineCollection的动画实现,另一种是更直观的fill_between适配方案。

方案一:基于LineCollection的动画实现

核心思路是通过更新LineCollection中每条线段的Y轴偏移量,配合颜色映射实现波浪下移效果。这里模拟了不规则的Z轴数据:

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

# 生成不规则Z轴数据(前两个间距特殊,其余均匀)
z = np.array([0, 0.8, 1.5, 2.2, 2.9, 3.6])
num_z = len(z)
# 生成基础波形数据
x = np.linspace(0, 10, 100)
y_base = np.sin(x)

# 创建画布和子图
fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlim(0, 10)
ax.set_ylim(-4, 2)
ax.set_xlabel('X')
ax.set_ylabel('Y')

# 初始化线段集合:每条线段对应一个Z层的波形,Y轴初始位置为-z[i]
segments = []
for i in range(num_z):
    y = y_base - z[i]
    points = np.column_stack((x, y))
    segments.append(points)

# 创建LineCollection,使用颜色映射区分不同Z层
lc = LineCollection(segments, cmap='viridis', linewidth=2)
# 设置颜色对应的数值(Z轴值)
lc.set_array(z)
ax.add_collection(lc)
plt.colorbar(lc, label='Z')

# 动画更新函数:让每个波形的Y轴偏移量增加(实现向下移动)
def update(frame):
    new_segments = []
    for i in range(num_z):
        # 每次偏移0.1,循环实现往复下移
        offset = frame * 0.1
        y = y_base - z[i] - offset
        # 当波形移出底部后,重置到顶部
        if np.min(y) < -4:
            y += 6
        points = np.column_stack((x, y))
        new_segments.append(points)
    lc.set_segments(new_segments)
    return lc,

# 创建动画
ani = FuncAnimation(fig, update, frames=100, interval=50, blit=True)
plt.show()

代码说明

  • 先构造不规则的Z轴数组,为每个Z层生成初始波形线段,Y轴位置由-z[i]确定
  • 通过FuncAnimation的update函数,不断更新每条线段的Y轴偏移量,实现波浪下移
  • 加入循环重置逻辑,避免波形移出视野后消失

方案二:基于fill_between的适配方案

如果觉得LineCollection操作复杂,也可以用fill_between结合多图层实现,同样适配不规则Z轴:

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

# 不规则Z轴数据
z = np.array([0, 0.8, 1.5, 2.2, 2.9, 3.6])
num_z = len(z)
x = np.linspace(0, 10, 100)
y_base = np.sin(x)

fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlim(0, 10)
ax.set_ylim(-4, 2)
ax.set_xlabel('X')
ax.set_ylabel('Y')

# 初始化每个Z层的填充区域
fills = []
cmap = plt.get_cmap('viridis')
for i in range(num_z):
    y = y_base - z[i]
    fill = ax.fill_between(x, y, -4, color=cmap(z[i]/np.max(z)), alpha=0.7)
    fills.append(fill)

# 更新函数:调整每个填充区域的Y数据
def update(frame):
    offset = frame * 0.1
    for i, fill in enumerate(fills):
        y = y_base - z[i] - offset
        if np.min(y) < -4:
            y += 6
        # 更新填充区域的路径数据
        path = fill.get_paths()[0]
        path.vertices[:, 1] = np.concatenate([y, np.full_like(y, -4)])
    return fills,

ani = FuncAnimation(fig, update, frames=100, interval=50, blit=True)
plt.show()

代码说明

  • 每个Z层对应一个fill_between填充区域,用颜色映射区分
  • 更新时直接修改填充路径的Y轴顶点数据,实现波浪下移效果
  • 同样加入循环重置逻辑,保持动画持续运行

两种方案都能适配Z轴不规则间距的情况,你可以根据实际需求选择。

内容的提问来源于stack exchange,提问作者user2256085

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:13:38