如何在Matlab中生成平滑的等高线图?

9
我希望将包含2个变量的数据以2D格式进行展示。数值用颜色表示,而两个变量则分别作为横轴和纵轴。我使用contourf函数绘制数据图表:
clc; clear;

load('dataM.mat')

cMap=jet(256); %set the colomap using the "jet" scale
F2=figure(1);
[c,h]=contourf(xrow,ycol,BDmatrix,50);
set(h, 'edgecolor','none');

xlim([0.0352 0.3872]);
ylim([0.0352 0.3872]);

colormap(cMap);
cb=colorbar;
caxis([0.7 0.96]);
% box on;
hold on;

xrow和ycol都是6x6的矩阵,表示坐标。BDmatrix是6x6的矩阵,表示相应的数据。然而,我得到的是这个图像:enter image description here 下面是xrow和yrow矩阵:enter image description here 下面是BDmatrix矩阵:enter image description here 是否可能使轮廓颜色平滑变化,而不是出现连接数据点的直线?该图的问题在于粗粒度,不够吸引人。我已经尝试用imagec替换contourf,但似乎不起作用。我正在使用MATLAB R2015b。

2
使用更细的网格插值您的数据!如果需要帮助,请提供您的数据或示例数据。 - Robert Seifert
7
请注意,您是一名功能程序员。请勿将文本发布为图像。如果我们将答案发布为图像,那会多么令人讨厌啊,您可以想象一下。 - Ander Biguri
1个回答

18

你可以对你的数据进行插值。

newpoints = 100;
[xq,yq] = meshgrid(...
            linspace(min(min(xrow,[],2)),max(max(xrow,[],2)),newpoints ),...
            linspace(min(min(ycol,[],1)),max(max(ycol,[],1)),newpoints )...
          );
BDmatrixq = interp2(xrow,ycol,BDmatrix,xq,yq,'cubic');
[c,h]=contourf(xq,yq,BDmatrixq);

通过参数 newpoints 来选择新图的“平滑度”。

Plot sample

为了减少颜色边缘,可以增加值步数的数量。默认为 10。以下代码将值步数增加到 50:

 [c,h]=contourf(xq,yq,BDmatrixq,50);

范例细节

对于非常平滑的色彩渐变,使用3D表面图更合适。只需将其旋转为俯视图即可。与具有许多值步骤的轮廓图相比,表面图也更快。

 f = figure;
 ax = axes('Parent',f);
 h = surf(xq,yq,BDmatrixq,'Parent',ax);
 set(h, 'edgecolor','none');
 view(ax,[0,90]);
 colormap(Jet);
 colorbar;

样例平滑图

注1: 立方插值不保持形状。这意味着,插值后的形状可能具有高于原始 BDmatrix 的最大值的极大值(和低于原始值的极小值)。如果 BDmatrix 具有嘈杂值,则插值可能不好。

注2: 如果您自己生成了xrowyrow(并知道其限制),则不需要我所做的最小-最大提取。

注3: 在将数据矩阵的截图添加到您的原始帖子后,可以看到xrowycol来自ndgrid生成器。因此,在这里我们也必须使用它以保持一致性。由于interp2需要meshgrid,因此我们必须切换到griddedInterpolant

[xq,yq] = ndgrid(...
            linspace(min(min(xrow,[],1)),max(max(xrow,[],1)),newpoints ),...
            linspace(min(min(ycol,[],2)),max(max(ycol,[],2)),newpoints )...
          );
F = griddedInterpolant(xrow,ycol,BDmatrix,'cubic');
BDmatrixq = F(xq,yq);

我正在尝试您上面发布的代码。出现了一个错误:“Error using .* Matrix dimensions must agree.” 这是由于xrow,yrow是6x6矩阵的原因吗?如何解决?谢谢。 - Kelvin S
我的代码中没有乘法运算符。你做了什么?你应该更新原始问题并附加代码。 - Loamsiada
我更新了我的代码并发布了我的数据。为了尝试您的方法,我直接将您的代码放入我的代码中,但是出现了上述错误。有什么建议吗?谢谢。 - Kelvin S
1
我在 linspace 命令中错过了第二个最小值和最大值。也许这可以解决你的错误。但是你的数据还显示,你的网格来自 ngrid 生成器...请看我的注释3。 - Loamsiada
你能帮忙回答这个问题吗?https://dev59.com/gsn6oIgBc1ULPQZFcbvq - dtn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接