Matlab 根据矢量值打印符号

Matlab 根据矢量值打印符号,matlab,plot,scatter-plot,Matlab,Plot,Scatter Plot,我有一个由2D向量(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

我有一个由2D向量(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的每个点指定不同的符号


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

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


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

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

hold on
arrayfun(@(n) plot(X(n,1), X(n,2), S{Y(n)}), 1:size(X,1))
或者,以“常规方式”编写循环:

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

如果您的数据集很大,您可以排序
[Y\u sorted,sort\u idx]=sort(Y)
,然后使用
sort\u idx
索引
X
,如下所示:
X\u sorted=X(sort\u idx)。在此之后,使用
histc
mat2cell
X\u排序后的
Y
值分成4组,每组一个。然后在四个组上循环并分别绘制每个组

这样,您只需要循环四个值,而不考虑数据中的元素数量。如果元素的数量很大,那么这应该快得多

[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
First approach = 0.8409
Second approach = 0.0039
对于1000个元素:

First approach: 0.0086
Second approach: 0.0037
First approach = 0.8409
Second approach = 0.0039

无需循环,使用
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)
您将获得:

谢谢。实际上,您不需要进行排序,只需获得与循环中正在处理的类相对应的X值:
X(Y==i,:)
将返回属于类
i
的点。以前从未使用过它,因此没有考虑过它。。。这显然是最好的答案+1=)这正是我想要的。谢谢