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

如何基于模拟三维数组创建3D填充区间可视化图表

3D填充区间可视化实现方案

核心思路

3D填充区间的本质是在**时间(X轴)-模拟次数(Y轴)**的平面上,为每个时间点绘制对应所有模拟运行的变量值范围,并填充该范围形成立体区域。直接对2000次运行的全量数据逐线绘制会导致性能卡顿,建议优先通过统计聚合(如分位数、极值)提取边界,再基于边界生成曲面完成填充。

步骤实现

1. 数据预处理

先转换时间轴单位,再计算每个时间点的变量边界统计量:

import numpy as np

# 假设matrix_outputs为(2000, 86400, 4)的三维数组
# 转换秒为分钟:86400秒 = 1440分钟
time_min = np.arange(86400) / 60

# 以第一个变量(预估负载)为例,提取全量数据
var_data = matrix_outputs[:, :, 0]
# 计算每个时间点的极值作为填充边界(也可用5%/95%分位数)
lower_bound = var_data.min(axis=0)
upper_bound = var_data.max(axis=0)

2. 3D填充区间绘制

方案1:聚合边界曲面填充(高效清晰)

通过网格映射将边界扩展为立体曲面,填充两个曲面间的区域:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# 构建X-Y网格:X为时间分钟,Y为模拟Run ID
X_grid, Y_grid = np.meshgrid(time_min, np.arange(2000))
# 将边界扩展为与网格匹配的维度
lower_surface = np.tile(lower_bound, (2000, 1))
upper_surface = np.tile(upper_bound, (2000, 1))

# 绘制上下边界曲面
ax.plot_surface(X_grid, Y_grid, lower_surface, color='#4a86e8', alpha=0.3)
ax.plot_surface(X_grid, Y_grid, upper_surface, color='#4a86e8', alpha=0.3)

# 填充曲面间的侧面区域(可选,增强立体感)
for x_idx in range(0, len(time_min), 60):  # 每1分钟抽样一个点,减少计算量
    x = time_min[x_idx]
    z_low = lower_bound[x_idx]
    z_high = upper_bound[x_idx]
    # 绘制左右侧连接面
    ax.fill_betweenx([z_low, z_high], x, x, 0, 1999, alpha=0.2, color='#4a86e8')

# 设置轴标签
ax.set_xlabel('Time (minutes)')
ax.set_ylabel('Run ID')
ax.set_zlabel('Estimated Load')
plt.show()

方案2:逐时间点区间填充(细节丰富)

若需展示每个时间点所有Run的变量分布范围,可逐点绘制矩形填充区域:

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

sample_interval = 60  # 每60秒抽样一个时间点,避免性能过载
for x_idx in range(0, len(time_min), sample_interval):
    x = time_min[x_idx]
    z_vals = var_data[:, x_idx]
    z_min, z_max = z_vals.min(), z_vals.max()
    y_range = np.arange(2000)
    
    # 填充当前时间点的Z值区间
    ax.fill_between(y_range, x, x, z_min, z_max, alpha=0.2, color='#4a86e8')
    # 绘制区间上下边缘线
    ax.plot3D([x]*2000, y_range, [z_min]*2000, color='gray', linewidth=0.5)
    ax.plot3D([x]*2000, y_range, [z_max]*2000, color='gray', linewidth=0.5)

ax.set_xlabel('Time (minutes)')
ax.set_ylabel('Run ID')
ax.set_zlabel('Estimated Load')
plt.show()

3. 优化建议

  • 抽样降维:86400个时间点全量绘制会严重拖慢速度,建议按10秒/1分钟间隔抽样。
  • 多变量区分:若需同时展示4个变量,可拆分4个3D子图,或用不同颜色(如负载用橙色、可再生能源用绿色)区分填充区域。
  • 交互视角:开启plt.ion()交互模式,方便旋转查看3D空间的细节。
  • 内存优化:若内存不足,可分批次处理模拟Run,避免一次性加载全量数据。

内容的提问来源于stack exchange,提问作者K. Rincon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:00:54