【问题标题】:Creating a scatter plot in matlab with different colors and markers for two different grouping variables在matlab中为两个不同的分组变量创建具有不同颜色和标记的散点图
【发布时间】:2016-12-01 00:26:39
【问题描述】:

我似乎在 matlab 中创建二维散点图时遇到问题,其中有两个分组变量,其中一个变量显示不同的颜色,另一个变量显示不同的标记。变量“score”具有 X 和 Y 值,两个分组变量是“att21”和“att22”。

我使用以下代码:

f=figure;
gscatter(score(:,1), score(:,2), {att21, att22}, 'br', 'xo');

我得到的是: scatter plot

但是,我想要得到的是 L4 的蓝色和 L1 的红色和 Flake 的 x 和 Chunk 的 o。我也希望图例能说明这一点。

我错过了什么?

感谢您的帮助...

【问题讨论】:

    标签: matlab grouping scatter-plot


    【解决方案1】:

    好吧,我想我明白了。 Noel 提供的解决方案只有在我知道每个分组变量中的组数的情况下才有效,但不幸的是,情况并非如此。

    所以我想出了使用嵌套循环的解决方案。

    f=figure;
    hold on;
    marker = '+o*.xsd';
    clr = 'rgbymck';
    
    att1v = unique(att1);
    att2v = unique(att2);
    attv = [att1v; att2v];
    att1count = 1;
    att2count = 1;
    
    for k=1:length(score)
        att1count = 1;
        att2count = 1;
        while att1count <= length(att1v)
            if isequal(att1(k),att1v(att1count))
                while att2count <= length(att2v)
                    if isequal(att2(k),att2v(att2count))
                        f=scatter(score(k,1),score(k,2),15,clr(att1count),marker(att2count));
    
                    end
                    att2count = att2count + 1;
                end
            end
            att1count = att1count + 1;
        end
    end
    legend(attv);
    

    现在散点图正常,每个变量最多支持 7 个组。我剩下的唯一问题是我无法创建一个图例来显示所有组的不同标签。

    我设法得到的是这个:plot with bad legend

    如果有人对我有解决方案,那就太好了......

    非常感谢

    【讨论】:

    • 我将编辑我的答案以包括您不知道组数的情况。最好是创建标记和颜色字符串,所以gscatter 处理图例。
    【解决方案2】:

    当您按 2 个分组变量进行分组时,每个变量有 2 个类别,您隐式创建了 4 个不同的组,因此您必须根据您的情况为 4 个组定义颜色和标记

    gscatter(score(:,1), score(:,2), {att21, att22}, 'rrbb', 'xoxo');
    

    但是由于gscatter会在定义的颜色或标记小于组数的情况下重复模式,你可以通过这样做节省2个字符

    gscatter(score(:,1), score(:,2), {att21, att22}, 'rrbb', 'xo');
    

    如果您不知道每个类别中的组数,您可以使用命令unique 获取它们并计算它们,然后使用该数字创建标记和颜色。以你为例

    marker = '+o*.xsd';
    clr = 'rgbymck';
    
    n_groups_att1 = length(unique(att21));
    n_groups_att2 = length(unique(att22));
    
    m = marker(1:n_groups_att2);
    
    c = repmat(clr(1:n_groups_att1),n_groups_att2,1);
    c = c(:)';
    
    gscatter(score(:,1), score(:,2), {att21, att22}, c, m);
    

    只需确保 marker 和 clr 的元素多于每个分组变量中可能的组数

    【讨论】:

    • @G.Herzlinger 很高兴我能提供帮助,请将您的问题设置为已回答,以便将其关闭。
    猜你喜欢
    • 2014-12-16
    • 2021-09-19
    • 2018-09-29
    • 2020-08-10
    • 1970-01-01
    • 2019-11-03
    • 2012-12-05
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多