如何基于模拟三维数组创建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
相关产品推荐
相关产品推荐

