关于2D数据点的几个问题

时间:2012-08-03 10:19:43

标签: matlab

过去我在SO上寻求帮助取得了一些成功,并从你们那里获得了很多好的提示和技巧。我遇到了三个我真正喜欢帮助的问题。 首先,这是我用作输入的散点图的图片:

Scatter plot

以下是我用来生成精确图表的代码(减去手动箭头/线条):

Source Code

我想知道是否有人可以帮我解决三个问题:

  1. 如果给出以上几点,我如何以编程方式绘制我手动输入的那些线?我尝试了一种LS方法,它产生了好的(ish)结果,我不确定是否会得到“更紧”的直线。
  2. 我的数据中有时会出现与行/列方式中的其他数据不完全一致的异常值。有没有办法删除这些异常值(如Point A on the Plot中所示)?
  3. 最后有没有办法计算每个'矩形'的'中心',因为这些点没有按特定顺序排序?可以按特定顺序订购这些点来帮助吗?或者有更聪明的方法吗?
  4. 感谢您抽出宝贵时间来查看我的问题。我真的希望有人可以帮我解决这个问题 - 我一直在试图弄清楚如何做这些事情,我无法想出解决方案。

    编辑:删除了我的LS方法的链接,因为它在水平方向上是不正确的。

1 个答案:

答案 0 :(得分:0)

好吧,所以我有一点停机时间试图在这里伸出援助之手。我想我至少可以让你开始以编程方式绘制线条,希望它能让你深入了解解决你在这里遇到的其他两个问题。

我几乎复制了你的代码并从那里开始。我在这里粘贴的是我在你宣布cx和cy matricies之后添加/调整的内容。

现在解释我的思维过程和逻辑。 Cy被设计为cxcy的“压缩”矩阵,但是沿Y坐标值排序。除了沿X坐标排序外,Cx是相同的。我希望逻辑等应该非常直接。如果不是这样说,我会解释!

现在是diffYdiffX。我得到了每个坐标(Xs和Ys分别)的差异,因为我们知道这里有一个模式会导致XY对形成网格状。我基本上认为每个点(水平和垂直)的Y(或X)值存在相当大的差异。一旦我在相邻点之间有这种差异,我会寻找大于2的差异(这是在看到差异之后的事后)。 -1用于给出行的实际结束而不是下一行的开始,因为我们将从列表中的item(1,:)开始(如果你看一下这些行更有意义)在代码中。)

(这当然是一个巨大的假设,并且特定于这个特定的数据集。虽然可能会对大多数类似网格的形状进行推广,但必须进行测试。)

另外一张纸条。我确实注意到,在我使用差异收集的点列表中,我的思维过程开始崩溃。你可以继续按照我在代码中的模式绘制更多行,看看我的意思。

至于你的另外两个问题。您可以采取我在这里的想法并改进/扩展它。我想你应该能够通过简单地查看给定行中的所有点(idx [1] - > idx [2])并确保它们适合于该行来阻止异常值。基本上要求它们满足线条方程式的通用公式,您可以使用用于绘制线条的点来获得线条方程式。你当然必须对此有一点误差容忍度。

然后对于矩形,您可以使用有序的点组来创建矩形,并可能利用regionprops函数计算由数据点指定的矩形的质心(2D世界的中心)搜集。

祝你好运!

Cy = zeros(length(cy),2);
[Cy(:,2), IX] = sort(cy);
Cy(:,1) = cx(IX)';

diffY = [0; diff(Cy(:,2))]
idx = find(diffY>2)-1
Cy(idx,:) % Last mark in given row, appears to be slight issue further along.

Cx = zeros(length(cx),2);
[Cx(:,1), IX] = sort(cx);
Cx(:,2) = cy(IX)';

diffX = [0; diff(Cx(:,1))]
idx2 = find(diffX>2)-1
Cx(idx2,:) % Last mark in given row, appears to be slightly off later on. (top of grid though)



%%
figure('Position',[0,0,c,r]);
scatter(Cy(:,1),Cy(:,2),'.');
axis([0 c 0 r])
set(gca,'YDir','reverse')
% Horizontal lines
line([Cy(1,1) Cy(idx(1),1)], [Cy(1,2) Cy(idx(1),2)], 'Color', 'red', 'LineWidth', 2)
line([Cy(idx(1)+1,1) Cy(idx(2),1)], [Cy(idx(1)+1,2) Cy(idx(2),2)], 'Color', 'red', 'LineWidth', 2)
line([Cy(idx(2)+1,1) Cy(idx(3),1)], [Cy(idx(2)+1,2) Cy(idx(3),2)], 'Color', 'red', 'LineWidth', 2)

% Vertical lines
line([Cx(1,1) Cx(idx2(1),1)], [Cx(1,2) Cx(idx2(1),2)], 'Color', 'red', 'LineWidth', 2)
line([Cx(idx2(1)+1,1) Cx(idx2(2),1)], [Cx(idx2(1)+1,2) Cx(idx2(2),2)], 'Color', 'red', 'LineWidth', 2)