如何在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
相关产品推荐
相关产品推荐

