MATLAB多级分组柱状图制作及分组标签个性化设置技术问询
实现MATLAB多级分组柱状图并添加自定义分组标签
没问题!我帮你搞定这个MATLAB多级分组柱状图,还能轻松给分组加上你要的前缀后缀(比如0.5h、1000℃、5%),同时满足显示“AR”字符的需求。下面是完整的实现步骤和代码:
1. 数据准备与自定义标签设置
首先把你提供的数据导入MATLAB,转换成表格格式方便处理,同时给各级分组加上你需要的前缀/后缀:
% 导入原始数据 data = [ "AR", 1100, 0.5, 2; "AR", 1100, 1, 3; "5", 1000, 0.5, 4; "5", 1000, 1, 5; "5", 1050, 0.5, 4; "5", 1050, 1, 5; "5", 1100, 0.5, 4; "5", 1100, 1, 5; "15", 1000, 0.5, 4; "15", 1000, 1, 5; "15", 1050, 0.5, 4; "15", 1050, 1, 5; "15", 1100, 0.5, 4; "15", 1100, 1, 5; ]; % 转换为table格式,便于分组操作 tbl = table(data(:,1), str2double(data(:,2)), str2double(data(:,3)), str2double(data(:,4)), ... 'VariableNames', {'Col1', 'Col2', 'Col3', 'Col4'}); % 给分组添加自定义前缀/后缀 col1_labels = replace(tbl.Col1, ["5", "15"], ["5%", "15%"]); % 给5、15添加%后缀 col2_labels = string(tbl.Col2) + "℃"; % 给温度值添加℃后缀 col3_labels = string(tbl.Col3) + "h"; % 给时间值添加h后缀
2. 计算多级分组的柱子位置
因为是三级分组(Col1→Col2→Col3),我们需要给不同层级的分组设置不同间距,让图表结构更清晰:
% 获取各级分组的唯一值 unique_col1 = unique(tbl.Col1); unique_col2 = unique(tbl.Col2); unique_col3 = unique(tbl.Col3); % 定义间距参数(可根据需求调整) group_gap = 2; % 第一级大分组之间的间距 subgroup_gap = 0.5; % 第二级子分组之间的间距 bar_width = 0.4; % 单根柱子的宽度 % 计算每个柱子的X轴位置 x_pos = []; current_x = 1; for i = 1:length(unique_col1) col1_val = unique_col1(i); % 获取当前第一级分组下的所有第二级分组 col2_subset = unique(tbl.Col2(tbl.Col1 == col1_val)); for j = 1:length(col2_subset) col2_val = col2_subset(j); % 获取当前第二级分组下的所有第三级分组 col3_subset = unique(tbl.Col3(tbl.Col1 == col1_val & tbl.Col2 == col2_val)); for k = 1:length(col3_subset) x_pos = [x_pos, current_x + (k-1)*(bar_width + 0.1)]; end current_x = current_x + length(col3_subset)*(bar_width + 0.1) + subgroup_gap; end current_x = current_x + group_gap; end
3. 绘制柱状图并添加标签
现在绘制柱子,然后依次添加三级分组的标签,最后在图中添加“AR”字符:
% 创建画布,设置合适大小 figure('Position', [100, 100, 1000, 600]); bar(x_pos, tbl.Col4, bar_width, 'EdgeColor', 'black'); hold on; % 添加第三级分组标签(0.5h、1h) xticks(x_pos); xticklabels(col3_labels); % 添加第二级分组标题(1000℃、1050℃、1100℃) second_level_x = []; current_x = 1 + (length(unique_col3)-1)*(bar_width + 0.1)/2; for i = 1:length(unique_col1) col1_val = unique_col1(i); col2_subset = unique(tbl.Col2(tbl.Col1 == col1_val)); for j = 1:length(col2_subset) second_level_x = [second_level_x, current_x]; current_x = current_x + length(col3_subset)*(bar_width + 0.1) + subgroup_gap; end current_x = current_x + group_gap; end text(second_level_x, zeros(size(second_level_x))-0.3, string(unique_col2)' + "℃", ... 'HorizontalAlignment', 'center', 'FontSize', 10); % 添加第一级分组标题(AR、5%、15%) first_level_x = []; current_x = 1 + (length(col2_subset)*length(unique_col3)*(bar_width + 0.1) + (length(col2_subset)-1)*subgroup_gap)/2; for i = 1:length(unique_col1) first_level_x = [first_level_x, current_x]; current_x = current_x + length(col2_subset)*length(unique_col3)*(bar_width + 0.1) + (length(col2_subset)-1)*subgroup_gap + group_gap; end text(first_level_x, zeros(size(first_level_x))-0.6, replace(unique_col1, ["5", "15"], ["5%", "15%"]), ... 'HorizontalAlignment', 'center', 'FontSize', 12, 'FontWeight', 'bold'); % 在图中添加"AR"字符(位置可根据需求调整) text(max(x_pos)-2, max(tbl.Col4)+0.5, 'AR', 'FontSize', 14, 'FontWeight', 'bold', 'Color', 'red'); % 设置图表其他属性 ylabel('柱高数值', 'FontSize', 12); title('多级分组柱状图', 'FontSize', 14); ylim([0, max(tbl.Col4)+1]); % 调整Y轴范围,避免标签被遮挡 grid on; hold off;
自定义调整说明
- 如果需要修改前缀/后缀,只需要调整
col1_labels、col2_labels、col3_labels的生成规则即可,比如把"5%"改成"5wt%"完全没问题。 - 分组间距、柱子宽度可以通过修改
group_gap、subgroup_gap、bar_width参数来调整,让图表布局更符合你的需求。 - “AR”字符的位置可以通过修改
text函数的前两个参数(X、Y坐标)来调整。
内容的提问来源于stack exchange,提问作者Vijay Bharadwaj J
相关产品推荐
相关产品推荐

