我希望你在Matlab中绘制散点的边界,并用指定的颜色填充它。
让我首先向你展示散布是什么样子的。
scatter(x,y)
现在,让我向您展示我尝试设计的边框。
k = boundary(x,y);
plot(x(k),y(k));
它会产生这样的结果
这不是我想要的。首先,散点是很好的凸起的,我不明白为什么boundary
会产生这样奇怪的形状。其次,我想在边框内涂上蓝色。
你能告诉我该怎么做吗?此外,在构建边界时,我不希望依赖于散布的凸性,因为在我的一些真实示例中,散布不是凸的。
发布于 2018-11-06 21:20:49
边界
在没有任何关于期望的信息的情况下,没有简单的方法来获得非凸形的边界。什么时候边界应该跟随凸包,什么时候应该偏离它?Matlab函数boundary
是通用的,可以处理任意输入坐标。它有一个‘收缩因子’参数s
,可以在0(凸包)和1(高度非凸包)之间调整,这取决于预期的结果。
% Make some x,y data with a missing corner
[x,y]=meshgrid(1:20);
sel=~(x>15 & y<=5);
x=x(sel);y=y(sel);
% Compute boundary with several values for s
k=boundary([x,y]); %Default shrink factor : 0.5
k_convhull=boundary([x,y],0);
k_closest=boundary([x,y],1);
% Plot the boundary:
plot(x,y,'ok') %black circles
hold on
plot(x(k),y(k),'-r') %red line
plot(x(k_convhull),y(k_convhull),'-g') %green line
plot(x(k_closest),y(k_closest),'-b') %blue line
即使将“收缩因子”设置为1,可重入的边角仍然有些缩小。如果这不适合您,您将需要创建自己的函数来计算边界的坐标。
绘制曲面
你需要在那里使用一个面片对象。
p=patch(x(k3),y(k3),[1 .8 .8]);
uistack(p,'bottom')
[1 .8 .8]
是面片曲面的RGB颜色(浅粉色) uistack
用于将面片移动到其他图形对象下方,因为它不是透明的。它仍将覆盖轴栅格(如果有的话)。另一种选择是:
p=patch(x(k3),y(k3),[1 0 0],'FaceAlpha',.2);
在这里,面片将是纯红色并绘制在其他对象之上,但通过alpha通道设置了80%的透明度(0表示完全透明,1表示纯色)。
请注意,patch对象类有如此多的选项,除了像这样的基本用例之外,处理起来有些复杂。
https://stackoverflow.com/questions/53161452
复制相似问题