【问题标题】:Plot symbols depending on vector values根据向量值绘制符号
【发布时间】:2016-12-08 22:17:20
【问题描述】:

我有一个由二维向量 (X) 表示的点数据集。

每个点都属于一个由整数值(从 1 到 4)表示的分类数据 (Y)。

我想根据其类别用不同的符号绘制每个点。

玩具示例:

X = randi(100,10,2);   % 10 points ranging 1:100 in 2D space
Y = randi(4,10,1);     % class of the points (1 to 4)

我为每个类创建一个符号向量:

S = {'bx' 'rx' 'b.' 'r.'};

那我试试:

plot(X(:,1), X(:,2), S(Y))


Error using plot
Invalid first data argument

如何根据 Y 的值为 X 的每个点分配不同的符号?

诅咒我可以为每个类使用一个循环,并一个一个地绘制不同的类。但是有没有一种方法可以直接用不同的符号绘制每个类?

【问题讨论】:

    标签: matlab plot scatter-plot


    【解决方案1】:

    不需要循环,使用gscatter:

    X = randi(100,10,2);   % 10 points ranging 1:100 in 2D space
    Y = randi(4,10,1);     % class of the points (1 to 4)
    color = 'brbr';
    symbol = 'xx..';
    gscatter(X(:,1),X(:,2),Y,color,symbol)
    

    你会得到:

    【讨论】:

    • 之前没用过,所以也没多想……这显然是最好的答案! +1 =)
    • 这正是我想要的。谢谢
    【解决方案2】:

    如果X 有很多行,但S 类型很少,那么我建议您先检查第二种方法。它针对速度而不是可读性进行了优化。如果向量有 10 个元素,它的速度大约是两倍,如果向量有 1000 个元素,速度是 200 多倍。


    第一种方法(易于阅读):

    无论采用哪种方法,我认为您都需要一个循环:

    hold on
    arrayfun(@(n) plot(X(n,1), X(n,2), S{Y(n)}), 1:size(X,1))
    

    或者,以“常规方式”编写循环:

    hold on
    for n = 1:size(X,1)
       plot(X(n,1), X(n,2), S{Y(n)})
    end
    

    第二种方法(给出与上面相同的图):

    如果您的数据集很大,您可以对[Y_sorted, sort_idx] = sort(Y) 进行排序,然后使用sort_idxX 进行索引,如下所示:X_sorted = X(sort_idx);。在此之后,您使用histcmat2cellX_sorted 分成4 组,每个Y 值一组。然后你遍历四个组并分别绘制每个组。

    这样,您只需要遍历四个值,而不管数据中的元素数量如何。如果元素数量很多,这应该会快很多。

    [Y_sorted, Y_index] = sort(Y);
    X_sorted = X(Y_index, :);
    X_cell = mat2cell(X_sorted, histc(Y,1:numel(S)));
    
    hold on
    for ii = 1:numel(X_cell)
        plot(X_cell{ii}(:,1),X_cell{ii}(:,2),S{ii})
    end
    

    基准测试:

    我使用timeit 对这两种方法进行了非常简单的基准测试。结果表明第二种方法要快很多:

    对于 10 个元素:

    First approach: 0.0086
    Second approach: 0.0037
    

    对于 1000 个元素:

    First approach = 0.8409
    Second approach = 0.0039
    

    【讨论】:

    • 谢谢。实际上,您可以获取与循环中正在处理的类相对应的 X 值,而不是排序:X(Y==i, :) 将返回属于类 i 的点。
    猜你喜欢
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2012-09-19
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多