Matlab中在网格上绘制堆叠3D柱状图的技术问题
嘿,这个需求其实完全可以通过手动指定每个堆叠柱的位置来实现,我给你整理了清晰的实现思路和代码示例:
核心思路
Matlab 默认的 bar3(A,'stacked') 会把所有50个堆叠柱排成一行,我们要做的就是把每个柱子(对应矩阵A的每一行)分配到5×10的网格坐标上,手动指定每个柱子的X(横向列)和Y(纵向行)位置,再逐个绘制堆叠柱,最后统一调整布局样式。
完整实现代码
这里先模拟生成50行4列的示例矩阵,你可以直接替换成自己的矩阵A:
% 模拟生成50行4列的整数矩阵(替换成你的A即可) A = randi([1, 15], 50, 4); % 定义网格的行数和列数 grid_rows = 5; grid_cols = 10; % 创建图形窗口并开启hold模式,方便逐个绘制柱子 figure; hold on; % 遍历矩阵的每一行(每个堆叠柱) for idx = 1:size(A, 1) % 计算当前柱子在网格中的位置:行号和列号 % 第idx个柱子,行号是ceil(idx/10),列号是mod(idx-1,10)+1,完全符合你的要求 current_row = ceil(idx / grid_cols); current_col = mod(idx - 1, grid_cols) + 1; % 绘制当前行的堆叠3D柱状图,指定X=current_col,Y=current_row,对应网格位置 bar3(current_col, current_row, A(idx, :), 'stacked'); end % 调整坐标轴和标签,让布局更清晰直观 xlabel('横向网格列'); ylabel('纵向网格行'); zlabel('数值'); xticks(1:grid_cols); % 显示1到10的横向刻度 yticks(1:grid_rows); % 显示1到5的纵向刻度 title('5×10网格布局的堆叠3D柱状图'); % 关闭hold模式 hold off;
关键细节解释
- 位置计算:
current_row = ceil(idx/10)会把每10个柱子分到下一行,比如第11个柱子(idx=11),ceil(11/10)=2,对应第2行;current_col = mod(idx-1,10)+1则是循环分配1到10的列号,idx=11时mod(10,10)+1=1,对应第1列,完美匹配你要的布局。 - 逐个绘制:开启
hold on后,每次调用bar3都会在当前图上叠加绘制,指定X和Y坐标就能把每个堆叠柱放到对应的网格点上。 - 样式调整:你可以根据需要添加
'Width'参数调整柱子宽度,比如bar3(..., 'Width', 0.7),避免柱子过于拥挤;也可以用colormap设置堆叠层的颜色方案。
内容的提问来源于stack exchange,提问作者Deathcrush
相关产品推荐
相关产品推荐

