You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于X、Y、Z三个向量绘制热力图?已实现散点图

如何将离散X-Y-Z数据转换为热力图(MATLAB)

看起来你已经成功画出带色条的散点图了,现在想把这些离散数据转换成热力图对吧?核心问题在于热力图需要规则的网格数据,而你当前的X、Y是随机分布的离散点,没有覆盖连续的网格区域,所以得先把离散点插值成连续网格,再进行绘制。

先帮你修正一下原始的数据处理代码——你之前把V定义成了字符串,这会导致后续赋值出错,直接用数值矩阵即可,而且循环赋值完全没必要,直接提取列就好:

% 直接定义数值矩阵,避免字符串转换的麻烦
V = [1.629 1.812 0.342;0.583 1.207 0.867;0.636 0.904 0.805;1.016 1.713 0.579;0.507 1.905 0.851;1.5 0.839 0.314;1.726 0.761 0.501;0.493 0.341 0.696;0.672 1.907 0.814;1.145 1.988 0.575;0.468 0.101 0.419;0.645 0.101 0.379;0.948 1.04 0.669;0.189 0.796 0.894;0.467 1.611 0.829;0.623 0.213 0.401;0.886 0.798 0.423;0.001 1.05 0.9;0.869 1.071 0.742;0.948 1.73 0.65;0.882 0.858 0.67;0.356 1.765 0.889;0.111 0.002 0.751;0.45 1.39 0.883;0.371 0.007 0.792;0.08 0.34 0.878;0.374 0.757 0.529;0.539 1.866 0.751;0.008 1.457 0.899;0.008 0.242 0.847];

% 直接提取列向量,替代冗余的循环
x = V(:,1);
y = V(:,2);
z = V(:,3);

接下来是关键的插值步骤,生成规则网格并把离散的Z值映射到网格上:

% 生成覆盖X、Y范围的规则网格,100x100的分辨率足够让热力图平滑
[X_grid, Y_grid] = meshgrid(linspace(min(x), max(x), 100), linspace(min(y), max(y), 100));

% 使用griddata进行插值,'v4'是MATLAB经典的平滑插值方法,也可以选'linear'或'nearest'
Z_grid = griddata(x, y, z, X_grid, Y_grid, 'v4');

现在你可以用几种不同的函数绘制热力图,按需选择:

方式1:伪彩色热力图(pcolor)

适合展示连续的颜色分布,配合shading flat可以去掉网格线,让颜色更连贯:

figure;
pcolor(X_grid, Y_grid, Z_grid);
shading flat; % 关闭网格线,使颜色区域连续
colorbar; % 添加色条,对应Z值
xlabel('X');
ylabel('Y');
title('热力图(pcolor)');
grid on;

方式2:填充等高线热力图(contourf)

如果想同时展示Z值的等高线和颜色填充,这个方法很合适:

figure;
contourf(X_grid, Y_grid, Z_grid, 20); % 20代表等高线的数量,数值越大越精细
colorbar;
xlabel('X');
ylabel('Y');
title('热力图(contourf)');
grid on;

方式3:交互式热力图(heatmap)

如果你的MATLAB版本支持R2017b及以上,heatmap可以生成交互式的热力图,鼠标悬停能查看具体数值:

figure;
h = heatmap(X_grid(:), Y_grid(:), Z_grid(:));
h.XLabel = 'X';
h.YLabel = 'Y';
h.Title = '热力图(heatmap)';

小提示:

  • 插值方法可以根据数据特性调整:nearest适合离散分类数据,linear是线性插值,v4适合平滑的连续数据。
  • 如果你的数据点分布不均匀,插值后可能出现部分区域无值的情况,可以考虑增加插值点数量或者调整网格范围。

内容的提问来源于stack exchange,提问作者Fras

火山引擎 最新活动