根据矢量值绘制符号

时间:2016-08-03 09:18:29

标签: 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), X(:,2), S(Y))


Error using plot
Invalid first data argument

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

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

2 个答案:

答案 0 :(得分:4)

不需要循环,请使用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)

你会得到: group scatter

答案 1 :(得分:3)

如果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

enter image description here

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

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

这样,无论数据中的元素数量是多少,您只需循环遍历四个值。如果元素数量很高,这应该快得多。

[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