如何基于3D矩阵绘制多边形区域内的多幅数值可视化图
嘿,我明白你的需求了——你现在有12个月的网格化数据,想在指定多边形S里用颜色体现每个网格的数值(0-100),而不是只画一堆红点对吧?之前的代码只能标记点,没法展示数值,那咱们来改改,用伪彩色图实现这个需求,步骤很清晰:
第一步:先搞定多边形区域的掩膜
首先我们需要生成一个和数据网格匹配的掩膜,把多边形外的区域标记出来,之后把这些区域的数据设为NaN,这样绘图时就只会显示多边形内的部分:
S = shaperead(polygon); [X,Y] = meshgrid(lon,lat); data = test; % 你的420×940×12数据矩阵 % 初始化掩膜:先设为全false,之后把多边形内的位置设为true mask = false(size(X)); N = length(S); for k = 1:N idx = insidepoly(X(:),Y(:),S(k).X,S(k).Y); mask(idx) = true; % 把每个多边形覆盖的网格标记为有效区域 end % 给12个月的数据都加上掩膜:多边形外的数据设为NaN data_masked = NaN(size(data)); for m = 1:12 data_masked(:,:,m) = data(:,:,m) .* mask; % 利用逻辑索引,无效区域置NaN end
第二步:绘制12个月的数值可视化图
接下来我们用pcolor(伪彩色图)来展示每个网格的数值,把12幅图排列在一个窗口里方便对比:
% 创建一个大窗口,方便排列12幅图 figure('Position', [100 100 1200 800]); for m = 1:12 subplot(3,4,m); % 3行4列布局,每个子图对应一个月 pcolor(X, Y, data_masked(:,:,m)); % 绘制伪彩色图,X/Y对应经纬度 shading flat; % 去掉网格线,让颜色块更平滑美观 colorbar; % 显示颜色条,对应0-100的数值范围 caxis([0 100]); % 固定所有图的颜色范围,保证月份间的数值对比公平 title(sprintf('%d月数据', m)); % 给每个子图加月份标题 xlabel('经度'); ylabel('纬度'); axis equal; % 保持经纬度的比例,避免地图变形 end
一些可选的优化小技巧
- 如果你觉得
pcolor的色块不够平滑,可以换成contourf(X,Y,data_masked(:,:,m),20),用填充等高线的方式展示数值; - 如果你的经纬度是地理坐标系,想要更专业的地图底图,可以搭配
geoshow函数,但需要先处理投影信息; - 要是想每个月份单独弹出窗口,把
subplot(3,4,m)换成figure就行,不过12个窗口可能有点占屏幕。
这样改完之后,每个月份的图都会清晰展示多边形内每个网格的数值大小,颜色深浅对应数值高低,完全满足你的需求啦!
内容的提问来源于stack exchange,提问作者hussain
相关产品推荐
相关产品推荐

