Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Matlab中使用空网格正方形绘制网格网格(即显示网格线)_Matlab_Plot - Fatal编程技术网

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

如何在Matlab中使用空网格正方形绘制网格网格(即显示网格线),matlab,plot,Matlab,Plot,我正在使用meshgrid创建坐标矩阵,以绘制欧洲网格数据内的模型输出。数据集为106 x 103,如果没有数据,则将值设置为NaN [meshlat,meshlon]=meshgrid(rlat,rlon); surf(meshlon,meshlat,data(:,:,1)),'linestyle','none';view(2); 但我实际上希望所有没有输出的网格正方形也被绘制出来(所以在这张地图中,包括斯堪的纳维亚半岛的额外正方形……但我希望它们是白色的): 我在想,我可能需要创建第

我正在使用meshgrid创建坐标矩阵,以绘制欧洲网格数据内的模型输出。数据集为106 x 103,如果没有数据,则将值设置为NaN

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

但我实际上希望所有没有输出的网格正方形也被绘制出来(所以在这张地图中,包括斯堪的纳维亚半岛的额外正方形……但我希望它们是白色的):

我在想,我可能需要创建第三个矩阵,其大小与meshlat和meshlon相同,并用与白色相对应的数字填充它……绘制它,然后键入“保持”,并在顶部绘制我的地图?但是我不知道如何指定白色?还是有别的方法

以下是问题的简化版本:

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)< /P> 当我尝试@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);

有几种方法可以实现您想要的结果。不幸的是,“更干净”和更少内存消耗的方法比简单的解决方法要复杂得多

方法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
维度上的情况

使用这样的参考网格,您可以将其覆盖在任何数据集上,而不管哪些区域已被消隐/消隐


请回答包含代码和示例输入数据的问题,这称为a。这将使回答变得更容易,因为现在还不清楚为什么会出现这个问题。我的直觉是你在斯堪的纳维亚有
NaN
价值观;将它们设置为白色(RGB
[1]
)可以工作。当它们“无输出”时,
数据中的值是多少?此外,如果您有
'linestile'、'none'
,则不应看到黑线。请提供真实情况example@Adriaan我的代码非常庞大(495行),其中包含了我构建的函数。我确实有Nan值,其中没有模型输出(正如您正确确定的),我在我的问题中对其进行了修改。我现在要试着上传矩阵。@AnderBiguri:这正是我用来生成我上传的图像的代码。@matlab\u newby您不必提供创建您显示的图形的完整代码。。。相反,试着提供一些代码来生成一个小例子——甚至像
m=magic(4)这样简单的例子;m(10)=NaN;meshgrid…
),只要它能说明您的问题并且是独立的。谢谢您的帮助,但它并没有完全达到我的目的。我理解它为什么不这样做。网格基于的大小不是我想要的(请参阅上面编辑的问题以获取输出地图)。我需要找到一种方法,仅为矩阵中包含实际数字的单元格创建此“覆盖”。而不是NaNs。我使用了你的想法,并使其生效(在上面的问题中)。非常感谢您,您必须将基础栅格修剪为只显示陆地或只显示希望显示的栅格点/线,但想法是,一旦完成,您始终可以重复使用相同的基础栅格。要生成它(要知道在哪里向基本网格添加适当的
NaN
),您可以基于第二个数据集(示例中的第二张图片)进行生成,该数据集似乎包含您想要的所有地块。