如何在 Octave 中的非矩形区域绘制数据?

How to plot data over a non-rectangular region in Octave?

我有三个大小相等的数组:xyz。我想在 xy 上绘制 z。问题是,那些 xy 不代表矩形区域,例如在使用 meshgrid 函数的情况下会是什么。

我知道我可以使用 scatter 之类的东西,但那样只会在图形上给我分数本身。我想要的是填充的、平滑的图片。因此,与 scatter 创建的相反:

我想要这样的东西:

关于如何做到这一点有什么建议吗?我有一种感觉,在绘图之前必须通过插值或其他方式平滑数据,这本身应该很简单。

您可以使用 griddata() 在规则网格上插入 xy 数据,然后您可以使用 imagesc() 绘制结果。

这是一个带有基本圆的最小示例:

% INPUT
x = cos(0:0.1:2*pi);
y = sin(0:0.1:2*pi);
z = (0:0.1:2*pi);

% Create a regular grid that have the same boundary as your x,y data
[xx,yy] = meshgrid(linspace(-1,1,100),linspace(-1,1,100));
% Grid interpolation 
zz = griddata (x, y, z, xx, yy);
% Plot
imagesc(zz)
colormap ([jet(); 1 1 1]);  % I add a last [1 1 1] triplet to set the NaN color to white.

注意到这仅在您保留默认插值方法(线性插值)时才有效。另一种方法(立方和最近)将通过解析延拓扩展定义域。

我意识到最好的方法是对 的提议稍作修改:

而不是行

imagesc(zz)
colormap ([jet(); 1 1 1]);

这样做:

surf(xx, yy, zz);
shading interp;
colormap("jet");

这消除了黑色背景的问题。然后只需要用鼠标旋转相机,使 3d 表面从上方看起来像 2d。