MATLAB柱状图中如何将零值对应图例以线条形式展示?
问题描述
现有如下向量数据,用于绘制柱状图:
% 当Phi/Psi = +/-10时 CoverageArea_mean_10 = [84.4735,21.1779,6.4247,2.1416]; CoverageArea_min_10 = [98.5128,21.1779,6.9007,2.1416]; CoverageArea_max_10 = [70.1963,19.0363,5.9488,2.1416]; % 当Phi/Psi = +/-40时 CoverageArea_mean_40 = [0,4.5211,2.3795,0]; CoverageArea_min_40 = [92.5640,21.1779,6.9007,2.1416]; CoverageArea_max_40 = [0,0.4759,0.2380,0];
当前绘图效果:
柱状图中,当Phi/Psi=+/-40时,mean和max类别的第1、4组数值为0,对应位置无柱状条显示,但图例中所有类别仍以柱状样式展示,导致零值项的图例与实际绘图表现不符。
预期效果:
零值对应的类别在图例中以线条形式呈现,而非柱状样式,匹配实际绘图中无柱状条的表现。
现有绘图代码:
%% 绘制覆盖面积柱状图 x = [15,30,45,60]; figure COVERAGE = [CoverageArea_min_10;CoverageArea_mean_10;CoverageArea_max_10]; COVERAGEAREA = [COVERAGE(:,1)';COVERAGE(:,2)';COVERAGE(:,3)';COVERAGE(:,4)']; bar(x,COVERAGEAREA); xlabel( '半功率张角, \Phi_1_/_2 (°)' ); ylabel('覆盖面积 (m²)'); BarNames = {'min','mean','max'}; legend(BarNames,'Location','best'); grid on; figure COVERAGE1 = [CoverageArea_min_40;CoverageArea_mean_40;CoverageArea_max_40]; COVERAGEAREA1 = [COVERAGE1(:,1)';COVERAGE1(:,2)';COVERAGE1(:,3)';COVERAGE1(:,4)']; bar(x,COVERAGEAREA1); xlabel( '半功率张角, \Phi_1_/_2 (°)' ); ylabel('覆盖面积 (m²)'); BarNames = {'min','mean','max'}; legend(BarNames,'Location','best'); grid on;
解决方案
要实现零值项图例用线条展示,需要手动控制图例的显示样式,具体步骤和代码如下:
修改后的代码
%% 绘制覆盖面积柱状图(优化版) x = [15,30,45,60]; % 处理Phi/Psi=+/-10的图 figure COVERAGE = [CoverageArea_min_10;CoverageArea_mean_10;CoverageArea_max_10]; COVERAGEAREA = [COVERAGE(:,1)';COVERAGE(:,2)';COVERAGE(:,3)';COVERAGE(:,4)']; bar_handles = bar(x,COVERAGEAREA); % 保存每个柱状类别的句柄 xlabel( '半功率张角, \Phi_1_/_2 (°)' ); ylabel('覆盖面积 (m²)'); BarNames = {'min','mean','max'}; % 构建自定义图例项 legend_entries = []; for i = 1:length(bar_handles) if all(COVERAGE(i,:) == 0) % 全零类别:创建不可见的线条对象用于图例展示 line_obj = plot(NaN,NaN,'Color',bar_handles(i).FaceColor,'LineStyle','-','LineWidth',2); legend_entries = [legend_entries, line_obj]; else % 非零类别:保留原柱状图句柄 legend_entries = [legend_entries, bar_handles(i)]; end end legend(legend_entries, BarNames,'Location','best'); grid on; % 处理Phi/Psi=+/-40的图 figure COVERAGE1 = [CoverageArea_min_40;CoverageArea_mean_40;CoverageArea_max_40]; COVERAGEAREA1 = [COVERAGE1(:,1)';COVERAGE1(:,2)';COVERAGE1(:,3)';COVERAGE1(:,4)']; bar_handles1 = bar(x,COVERAGEAREA1); xlabel( '半功率张角, \Phi_1_/_2 (°)' ); ylabel('覆盖面积 (m²)'); % 构建自定义图例项 legend_entries1 = []; for i = 1:length(bar_handles1) if all(COVERAGE1(i,:) == 0) line_obj = plot(NaN,NaN,'Color',bar_handles1(i).FaceColor,'LineStyle','-','LineWidth',2); legend_entries1 = [legend_entries1, line_obj]; else legend_entries1 = [legend_entries1, bar_handles1(i)]; end end legend(legend_entries1, BarNames,'Location','best'); grid on;
代码说明
- 通过
bar_handles保存每个柱状类别的句柄,获取其颜色信息,保证图例样式与原柱状条颜色一致。 - 遍历每个类别,判断是否为全零值:
- 全零类别:创建一个用
NaN定义的不可见线条,仅用于图例展示,样式设为实线。 - 非零类别:直接使用原柱状图句柄,保持柱状图例样式。
- 全零类别:创建一个用
- 将混合了柱状句柄和线条句柄的列表传入
legend,实现零值项用线条、非零项用柱状的图例效果。
内容的提问来源于stack exchange,提问作者SH_IQ
相关产品推荐
相关产品推荐

