如何在 Octave 中的非矩形区域绘制数据?
How to plot data over a non-rectangular region in Octave?
我有三个大小相等的数组:x
、y
、z
。我想在 x
、y
上绘制 z
。问题是,那些 x
和 y
不代表矩形区域,例如在使用 meshgrid
函数的情况下会是什么。
我知道我可以使用 scatter
之类的东西,但那样只会在图形上给我分数本身。我想要的是填充的、平滑的图片。因此,与 scatter
创建的相反:
我想要这样的东西:
关于如何做到这一点有什么建议吗?我有一种感觉,在绘图之前必须通过插值或其他方式平滑数据,这本身应该很简单。
您可以使用 griddata()
在规则网格上插入 x
、y
数据,然后您可以使用 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。
我有三个大小相等的数组:x
、y
、z
。我想在 x
、y
上绘制 z
。问题是,那些 x
和 y
不代表矩形区域,例如在使用 meshgrid
函数的情况下会是什么。
我知道我可以使用 scatter
之类的东西,但那样只会在图形上给我分数本身。我想要的是填充的、平滑的图片。因此,与 scatter
创建的相反:
我想要这样的东西:
关于如何做到这一点有什么建议吗?我有一种感觉,在绘图之前必须通过插值或其他方式平滑数据,这本身应该很简单。
您可以使用 griddata()
在规则网格上插入 x
、y
数据,然后您可以使用 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。