过去我在SO上寻求帮助取得了一些成功,并从你们那里获得了很多好的提示和技巧。我遇到了三个我真正喜欢帮助的问题。 首先,这是我用作输入的散点图的图片:
以下是我用来生成精确图表的代码(减去手动箭头/线条):
我想知道是否有人可以帮我解决三个问题:
感谢您抽出宝贵时间来查看我的问题。我真的希望有人可以帮我解决这个问题 - 我一直在试图弄清楚如何做这些事情,我无法想出解决方案。
编辑:删除了我的LS方法的链接,因为它在水平方向上是不正确的。
答案 0 :(得分:0)
好吧,所以我有一点停机时间试图在这里伸出援助之手。我想我至少可以让你开始以编程方式绘制线条,希望它能让你深入了解解决你在这里遇到的其他两个问题。
我几乎复制了你的代码并从那里开始。我在这里粘贴的是我在你宣布cx和cy matricies之后添加/调整的内容。
现在解释我的思维过程和逻辑。 Cy
被设计为cx
和cy
的“压缩”矩阵,但是沿Y坐标值排序。除了沿X坐标排序外,Cx
是相同的。我希望逻辑等应该非常直接。如果不是这样说,我会解释!
现在是diffY
和diffX
。我得到了每个坐标(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)