使用Matlab gscatter函数将符号确定分配到组



假设一个数据集可以分为三组(例如,负数、零和正数),并且希望在图中使用不同的符号来表示这些组,将<分配给负数,o分配给零,>分配给正数;例如

gscatter([-1 -1 0 0 1 1],[1 2 1 2 1 2],[-1 -1 0 0 1 1],'k','<o>',10); xlim([-3 3]); ylim([0 3]);

进一步假设gscatter函数的输入数据缺乏来自所有组的表示。然后,组符号关系可能会改变,因为根据Matlab文档,gscatter根据分组变量的唯一值的排序顺序,将所提供列表中的符号顺序分配给组。这种分组算法的结果是,早期排序组中没有表示会导致符号/组分配的偏移,从而破坏符号意义(分配给组的精确符号可能无关紧要,但这个问题集中在特定符号必须总是分配给特定组的情况下)。例如,对于缺少负值的数据集,gscatter将把<符号分配给零,把o符号分配给正(>符号未被使用,因为当只存在两个不同的组时,第三个符号是无关的);例如

gscatter([-1 -1 0 0 1 1],[1 2 1 2 1 2],[-1 -1 0 0 1 1],'k','<o>',10); xlim([-3 3]); ylim([0 3]);

我的问题是,在数据集中可能丢失组的情况下,是否可以确定地将符号分配给特定组(例如,即使数据集中不存在<的负值,也可以强制将其分配给负值,以避免上述符号/组关系的偏移)。Matlab文档似乎表明,这样的操作是不可能的,这意味着必须依靠一系列if语句来确定是否缺少某些组,并为组表示的每个可能组合适当地重新定义受限符号集,但我想知道是否可以更优雅地规避这一限制。

通常,对于"处理可能存在或不存在的数据"问题,总是存在强迫数据的必要部分存在的可怕欺骗:

x = [-1 -1 0 0 1 1];
y = [1 2 1 2 1 2];
group = [-1 -1 0 0 1 1];
gscatter([x NaN NaN NaN], [y NaN NaN NaN], [group -1 0 1], 'k', '<o>', 10);

(如果与plot不同,gscatter只是忽略了一组只有NaN的坐标——我没有它可以进行实际测试——你可以只使用最终轴范围之外的任何坐标)

另一种可能性是改变流程本身,以确保无论数据如何都保持一致:

scatter(x(group == -1), y(group == -1), 10, 'k', '<');
hold on;
scatter(x(group == 0), y(group == 0), 10, 'k', 'o');
scatter(x(group == 1), y(group == 1), 10, 'k', '>');
hold off;

然而,在这种情况下,明确检查数据并调整是否存在几乎可以肯定是最好的方法,给定一个合适的Matlab习惯用法:

markers = '<o>';
midx = ismember([-1 0 1], group);
gscatter(x, y, group, 'k', markers(midx), 10);

最新更新