You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MATLAB中bar3图条形尺寸调整及非等距坐标轴适配问询

解决Matlab bar3条形尺寸匹配非等距坐标轴的问题

这个问题确实戳中了bar3的一个局限性——它默认把所有X/Y轴的类别当作等间距的离散项,完全忽略你设置的标签数值,所以条形都是统一的正方形。要实现条形尺寸匹配坐标轴实际数值的效果,你需要手动用patch函数来构建每个3D条形,下面是具体的实现步骤和代码:

步骤说明

  1. 定义你的数据、X/Y轴的实际数值标签
  2. 计算每个条形在X和Y方向的宽度(基于坐标轴数值的间隔,避免条形重叠)
  3. 遍历每个数据点,用patch绘制对应的3D长方体(即条形)
  4. 调整坐标轴、颜色、视角等样式

示例代码

% 准备数据和坐标轴标签
data = rand(3,4); % 3行(Y轴),4列(X轴)
x_labels = [10 20 30 40];
y_labels = [100 200 300];

% 计算X/Y方向的条形宽度(取间隔的80%,避免重叠)
x_widths = diff(x_labels) * 0.8;
% 第一个X条形的宽度用第一个间隔的80%,保持一致
x_widths = [x_widths(1), x_widths]; 
y_widths = diff(y_labels) * 0.8;
y_widths = [y_widths(1), y_widths];

% 设置颜色(可以用colormap生成)
colors = jet(size(data,1)*size(data,2));

figure;
hold on;
axis tight;

% 遍历每个数据点,绘制3D条形
for y_idx = 1:size(data,1)
    for x_idx = 1:size(data,2)
        % 计算条形的左下角坐标
        x_start = x_labels(x_idx) - x_widths(x_idx)/2;
        y_start = y_labels(y_idx) - y_widths(y_idx)/2;
        z_start = 0;
        
        % 条形的尺寸
        x_len = x_widths(x_idx);
        y_len = y_widths(y_idx);
        z_len = data(y_idx, x_idx);
        
        % 构建长方体的8个顶点坐标
        vertices = [
            x_start, y_start, z_start;
            x_start+x_len, y_start, z_start;
            x_start+x_len, y_start+y_len, z_start;
            x_start, y_start+y_len, z_start;
            x_start, y_start, z_start+z_len;
            x_start+x_len, y_start, z_start+z_len;
            x_start+x_len, y_start+y_len, z_start+z_len;
            x_start, y_start+y_len, z_start+z_len;
        ];
        
        % 构建长方体的面(每个面由4个顶点索引组成)
        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((y_idx-1)*size(data,2)+x_idx,:), 'EdgeColor', 'k');
    end
end

% 设置坐标轴标签和范围
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Value');
set(gca, 'XTick', x_labels);
set(gca, 'YTick', y_labels);
view(3);
grid on;

其他绘图建议

  • 如果你的数据更适合用“数值位置对应”的可视化,也可以考虑使用surfmesh,把数据作为高度,直接映射到真实的X/Y坐标上,这样能更直观地展示数值分布。
  • 如果不需要3D效果,heatmap结合颜色条也能很好地展示数据,同时X/Y轴可以直接使用非等距的数值标签,不需要额外调整。

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

火山引擎 最新活动