我一直在研究微混合器的模拟。我的模拟结果是表示空间坐标和属于该坐标的浓度值的数据点。使用Matlab我试图创建这些横截面的二维图,其中图的颜色指的是一定的浓度。
我做了一些关于其他人如何绘制分散数据图的研究。我得到了以下代码片段,几乎完全符合我的要求:
x_max=max(data(:,1)); %get max and min coordinates of datapoints
x_min=min(data(:,1));
y_max=max(data(:,2));
y_min=min(data(:,2));
figure(1);
%snap the datapoints to a grid
[xi,yi] = meshgrid(x_min:(x_max-x_min)/1000:x_max, y_min:(y_max-y_min)/1000:y_max);
zi = griddata(data(:,1),data(:,2),data(:,3),xi,yi,'linear');
%plot the data using surf
surf(xi,yi,zi,'EdgeColor','None');
%get the correct viewpoint
view(2);
此代码的唯一问题是它不遵守我的频道边界。它会在原始边框之外创建额外数据。您可以在我附加的两张图片中看到这一点。一个图像包含实际的数据点,因此您可以看到通道的横截面是什么样的。另一个是用我刚才描述的方法生成的图。
有人知道解决方法吗?这样我就可以制作颜色图并保持横截面的原始形状。
答案 0 :(得分:0)
griddata
是一个插值函数,因此它可以简单地插入网格的所有区域,这些区域由任意两个点之间的直线包围 - 即convex hull。就函数而言,表面中不需要的区域与横截面内部的点之间的小空间之间没有正式的区别,除了它之间插入的点之外进一步分开任意数量。
由于计算这些不需要区域的插值的计算代价很小,因此最快的解决方法是删除在创建之后您不想要的表面部分。如果您从其他来源获得该边界的定义,则最可靠的方法是执行此操作。如果您不这样做,那么您展示的示例数据boundary
应该很好地解决这个问题:
k = boundary(data(:,1),data(:,2));
然后,您可以在通过将网格中的值设置为NaN
来绘制曲面之前删除此值之外的插值:
zi(~inpolygon(xi,yi,data(k,1),data(k,2))) = NaN;