我正在使用meshgrid创建坐标矩阵以在欧洲的网格数据内绘制模型输出。数据集为106 x 103,并且在无数据的地方,该值设置为NaN。
[meshlat,meshlon]=meshgrid(rlat,rlon);
surf(meshlon,meshlat,data(:,:,1)),'linestyle','none';view(2);
但是我实际上也希望绘制所有没有输出的网格正方形(因此,该地图中包含斯堪的纳维亚半岛的多余正方形。但是我希望它们是白色的):
我在想,我可能需要创建一个与网眼和网眼大小相同的第三个矩阵,并用与白色相对应的数字填充它...将其绘制,然后键入“ 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周围有网格线):
通过使用完整的数据集(在第一个图像中),我使用以下命令绘制了陆块的网格正方形的轮廓:
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);
答案 0 :(得分:1)
有几种方法可以达到所需的结果。不幸的是,“更清洁”和更少的内存消耗方式比简单的解决方法要复杂得多。
方法1 (不推荐,但不详细...)
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
维度上发生的情况。
使用这样的参考网格,您可以将其覆盖在您的任何数据集上,而不管哪个区域被空白/清空了。