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

如何在GNU Octave中绘制支持Z轴滚动切换的3D数据集2D切片

实现方案

你只需要完成3处核心修改:将拼接存储的二维数据重塑为三维切片数组、把绘图句柄和切片数据存入控件用户区供回调读取、完善回调的切片更新逻辑即可,完整修改后代码如下:

clf;
colormap ("default");

# 加载原始数据
load "./toy.data"

# 配置切片参数
slice_rows = 5;
slice_cols = 5;
slice_count = size(M,1)/slice_rows;

# 将二维原始数据拆分为 行*列*切片数 的三维数组
slices = zeros(slice_rows, slice_cols, slice_count);
for i = 1:slice_count
    slices(:,:,i) = M( (i-1)*slice_rows +1 : i*slice_rows, : );
endfor

# 固定全局颜色映射范围,避免切换切片时颜色标尺跳动
caxis([min(M(:)), max(M(:))]);

# 绘制初始切片
x = 0:slice_cols;
y = 0:slice_rows;
h_img = imagesc(x, y, slices(:,:,1));

%% 添加滑块控件
hslider = uicontrol (                    ...
       'style', 'slider',                ...
       'Units', 'normalized',            ...
       'position', [0.1, 0.02, 0.8, 0.05], ...
       'min', 1,                         ...
       'max', slice_count,               ...
       'value', 1,                       ...
       'sliderstep', [1/(slice_count-1), 1/(slice_count-1)], ... # 点击箭头每次切换1个切片
       'callback', {@updateTime}         ...
     );

# 存储绘图句柄和切片数据到滑块用户区,供回调函数读取
set(hslider, 'UserData', struct('img_handle', h_img, 'slices', slices));

%% 切片切换回调函数
function updateTime (h_slider, event)
    user_data = get(h_slider, 'UserData');
    # 对滑块值取整,避免出现非整数切片索引
    current_slice = round(get(h_slider, 'value'));
    # 更新图像显示的切片数据
    set(user_data.img_handle, 'CData', user_data.slices(:,:,current_slice));
end

如果需要支持鼠标滚轮、键盘方向键切换切片,只需要额外给图窗绑定对应的滚轮/键盘事件回调,修改滑块的value属性即可复用现有逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:18:00