如何用MATLAB绘制示例图样式的多组3D直方图?bar3/histogram2不适用
解决方案
方法1:手动偏移分组的bar3实现多组3D直方图
当bar3默认的分组模式无法满足需求时,可通过手动设置每组数据的x轴偏移,让不同组的直方图在空间上独立排列,避免重叠或堆叠。
示例代码:
% 生成模拟数据:3组,每组4个类别,每个类别对应5个统计值 group1 = rand(4,5); group2 = rand(4,5) + 0.2; group3 = rand(4,5) - 0.1; % 设置组间偏移量,控制分组间距 offset = 0.8; x1 = 1:size(group1,1); x2 = x1 + offset; x3 = x1 + 2*offset; figure; hold on; % 分别绘制每组直方图,设置柱子宽度和颜色 bar3(x1, group1, 0.7, 'FaceColor', [0.2 0.6 0.8]); bar3(x2, group2, 0.7, 'FaceColor', [0.8 0.3 0.3]); bar3(x3, group3, 0.7, 'FaceColor', [0.3 0.8 0.3]); % 配置轴标签与图例 xlabel('类别'); ylabel('数据维度'); zlabel('统计值'); legend('组1', '组2', '组3', 'Location', 'best'); % 调整x轴刻度,清晰区分分组 xticks([mean(x1) mean(x2) mean(x3)]); xticklabels({'类别组A', '类别组B', '类别组C'}); grid on; hold off;
方法2:自定义patch对象实现精细化控制
如果需要更灵活的样式(比如自定义柱子形状、间距),可以直接通过patch对象手动构建每个柱子,完全掌控直方图的布局。
示例代码:
% 模拟数据:2组,每组3个类别,每个类别对应一个统计值 data = [2.1 3.5 1.8; 2.8 4.2 2.5]; groups = size(data,1); categories = size(data,2); % 设置柱子尺寸与间距参数 bar_width = 0.3; bar_depth = 0.3; group_gap = 0.5; category_gap = 0.5; figure; hold on; % 定义每组的颜色 colors = [[0.2 0.6 0.8], [0.8 0.3 0.3]]; for g = 1:groups for c = 1:categories % 计算柱子中心坐标 x = (g-1)*(bar_width + group_gap) + bar_width/2; y = (c-1)*(bar_depth + category_gap) + bar_depth/2; z = data(g,c); % 定义柱子的8个顶点坐标 vertices = [ x-bar_width/2, y-bar_depth/2, 0; x+bar_width/2, y-bar_depth/2, 0; x+bar_width/2, y+bar_depth/2, 0; x-bar_width/2, y+bar_depth/2, 0; x-bar_width/2, y-bar_depth/2, z; x+bar_width/2, y-bar_depth/2, z; x+bar_width/2, y+bar_depth/2, z; x-bar_width/2, y+bar_depth/2, z; ]; % 定义柱子的面索引(对应顶点顺序) faces = [ 1 2 3 4; % 底面 5 6 7 8; % 顶面 1 2 6 5; % 前面 2 3 7 6; % 右面 3 4 8 7; % 后面 4 1 5 8; % 左面 ]; % 绘制柱子 patch('Vertices', vertices, 'Faces', faces, 'FaceColor', colors(:,g), 'EdgeColor', 'k'); end end % 配置轴标签与刻度 xlabel('分组'); ylabel('类别'); zlabel('统计值'); xticks(1:groups); xticklabels({'组1', '组2'}); yticks(1:categories); yticklabels({'类别1', '类别2', '类别3'}); axis tight; grid on; hold off;
补充说明
bar3默认的grouped模式会将同类别不同组的柱子放在同一x位置,容易出现视觉混淆,手动偏移x坐标可解决该问题。histogram2仅用于绘制二维数据的频数分布,无法直接实现多组独立的统计类3D直方图,因此不适用此类需求。
内容的提问来源于stack exchange,提问作者Heri
相关产品推荐
相关产品推荐

