如何在Matlab中用空的网格正方形绘制网格网格(即显示网格线)

时间:2018-10-02 13:10:27

标签: matlab plot

我正在使用meshgrid创建坐标矩阵以在欧洲的网格数据内绘制模型输出。数据集为106 x 103,并且在无数据的地方,该值设置为NaN。

[meshlat,meshlon]=meshgrid(rlat,rlon);
surf(meshlon,meshlat,data(:,:,1)),'linestyle','none';view(2); 

enter image description here

但是我实际上也希望绘制所有没有输出的网格正方形(因此,该地图中包含斯堪的纳维亚半岛的多余正方形。但是我希望它们是白色的):

enter image description here

我在想,我可能需要创建一个与网眼和网眼大小相同的第三个矩阵,并用与白色相对应的数字填充它...将其绘制,然后键入“ hold”,然后在顶部绘制我的地图?我不确定如何指定白色?还是有另一种方法?

这是问题的简化版本:

data = magic(4);
data(1,2) = nan;
x = [1,2,3,4];
lat = repmat(x,4,1);
lon = lat';
surf(lon,lat,data);view(2);

您可以看到左侧的空白。.在此示例中,我想查看正方形所在的额外网格线(如果数据集中没有nans)

当我尝试@Hoki的建议时,我最终在矩阵中每个“单元格”周围都形成了网格正方形……无论是用数字还是NaN(下面)填充的,这都不是我最初需要的。我只想要土地块(有实数,而不是NaN周围有网格线): enter image description here

通过使用完整的数据集(在第一个图像中),我使用以下命令绘制了陆块的网格正方形的轮廓:

surf(meshlon,meshlat,fulldata(:,:,1),'FaceColor','none','EdgeColor','k');view(2);

然后我在原始数据集上绘制了“彩色”网格正方形:

hold on;
surf(meshlon,meshlat,data(:,:,1)),'linestyle','none';view(2); 

使用下面的简化示例,代码为:

data = magic(4);
datafull=data;
data(1,2) = nan;
x = [1,2,3,4];
lat = repmat(x,4,1);
lon = lat';
surf(lon,lat,datafull,'FaceColor','none','EdgeColor','k');view(2);
hold on
surf(lon,lat,data);view(2);

1 个答案:

答案 0 :(得分:1)

有几种方法可以达到所需的结果。不幸的是,“更清洁”和更少的内存消耗方式比简单的解决方法要复杂得多。

方法1 (不推荐,但不详细...)

  • 您需要创建一种特殊的颜色图,该颜色图的一端(最小或最大)为“白色”,并确保映射到该颜色的值在数据中。 / li>
  • 在绘制数据之前,对于斯堪的纳维亚半岛的所有像素(或任何没有值但要查看网格的像素),将NaN替换为将映射到色彩图中的白色。

如您所见,此方法将迫使您为每个新数据集重新评估色图,因此不太灵活。

方法2 (建议使用更通用的方法...) 只需按照您的需要创建一个空的“网格”,然后将其显示在表面图的顶部即可。该网格将是透明的,因此可以在任何数据集的顶部使用。

例如:

%% Your example
data = magic(4);
data(1,2) = nan;
x = [1,2,3,4];
lat = repmat(x,4,1);
lon = lat';
surf(lon,lat,data);view(2);


%% The overlay grid:
% Create a grid the same size of the data. We set the Z value to the max of
% the original data set to make sure the grid will be "on top" of the
% surface plot when view from above.
datagrid = ones(size(data))*max(data(:)) ;
% plot the grid on top of the previous surface plot
hold on
hm = mesh(lon,lat,datagrid,'FaceColor','none','EdgeColor','k') ;

这就是您所得到的。右边的第二个图是相同的,只是视图不同,因此您了解了Z维度上发生的情况。

使用这样的参考网格,您可以将其覆盖在您的任何数据集上,而不管哪个区域被空白/清空了。

enter image description here