GNU Octave中boxplot()与legend()联用的图例匹配问题
解决Octave中boxplot与legend图例错位的问题
问题根源
Octave的boxplot函数为每个数据集生成7个独立的绘图对象(包含箱体、四分位线、中位数线、须线、异常值点等),调用legend时默认会按这些对象的顺序逐个匹配图例文本,自然就出现了你遇到的错位问题——第二个文本对应第一个箱线图的子元素,而非第二个箱线图整体。
解决方案:指定图例对应的绘图元素
我们可以从boxplot返回的句柄中,提取每个箱线图的代表元素(比如箱体、中位数线),再和其他绘图元素一起传入legend,就能实现文本与箱线图的正确对应。
方法1:提取每个箱线图的第一个元素作为代表
boxplot返回的句柄b是一个7×N的矩阵(N是数据集数量),每一列对应一个数据集的7个绘图对象。取每列的第一个元素作为该箱线图的代表即可:
data1 = randn(100, 1); data2 = randn(100, 1) + 3; figure; % 绘制箱线图并获取所有绘图对象句柄 b = boxplot({data1, data2}); hold on; % 绘制额外的参考线 p1 = plot([0 2.5],[2 2],'--'); % 提取每个箱线图的第一个元素,加上参考线的句柄 legend_handles = [b(1,1), b(1,2), p1]; % 传入句柄和对应的图例文本 legend(legend_handles, {'data1','data2','line'});
方法2:指定更精准的代表元素(比如中位数线)
如果想让图例用中位数线来代表箱线图,可以先查看每个对象的类型,确认中位数线对应的索引:
% 查看第一个箱线图所有对象的类型 get(b(:,1),'Type')
通常中位数线是第5个元素(索引5),此时修改legend_handles为:
legend_handles = [b(5,1), b(5,2), p1];
补充说明
- Windows环境下,
boxplot的第一个元素是patch类型的箱体;Linux下则是line类型的箱体边缘线,两种都能作为箱线图的代表元素。 - 你可以根据需求选择不同的代表元素,只要保证每个箱线图对应一个唯一的对象句柄即可。
内容的提问来源于stack exchange,提问作者Jürgen O.
相关产品推荐
相关产品推荐

