You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

代码说明

  1. 通过bar_handles保存每个柱状类别的句柄,获取其颜色信息,保证图例样式与原柱状条颜色一致。
  2. 遍历每个类别,判断是否为全零值:
    • 全零类别:创建一个用NaN定义的不可见线条,仅用于图例展示,样式设为实线。
    • 非零类别:直接使用原柱状图句柄,保持柱状图例样式。
  3. 将混合了柱状句柄和线条句柄的列表传入legend,实现零值项用线条、非零项用柱状的图例效果。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:40:32