根据向量值绘制图形符号

3

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

每个点都属于一个用整数值(from 1 to 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的每个点分配不同的符号?

当然,我可以使用循环为每个类别分别绘制不同的类别。但是否有一种方法可以直接用不同的符号绘制每个类别?

2个回答

3
不需要循环,使用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 =) - Stewie Griffin
这正是我正在寻找的。谢谢。 - user2261062

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 进行排序 [Y_sorted, sort_idx] = sort(Y),然后使用 sort_idx 索引 X,如下所示: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的点。 - user2261062

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接