文章目录
- 概要
- 整体架构流程
- 技术名词解释
- 技术细节
- 小结
概要
在科研数据可视化工作中,MATLAB内置imagesc、pcolor、contour等常规热图函数存在明显局限:只支持规则网格化数据。在现场试验测点、非均匀采样、离散仿真点位场景下,想要绘图必须先做插值网格化处理,插值操作容易生成虚假数据,扭曲原始测点分布规律。
针对该痛点,本文实现一套基于三维散点俯视投影的线型热图方案,封装自定义函数linearheatmap。核心优势不需要对离散数据插值,完整保留每一个原始采样点信息 。
代码开箱运行,可直接用于毕业论文、期刊论文配图。
整体架构流程
整套绘图系统采用分层模块化设计,各模块解耦,方便按需修改拓展,完整执行流程如下:
- 数据输入层
接收X、Y坐标矩阵/向量与对应特征值Z,函数内部自动将多维数组展平为一维列向量,统一数据格式,兼容各类仿真、试验数据集。 - 核心绘图层
调用自定义linearheatmap函数,底层依托scatter3渲染全部采样点,自动识别入参数量,支持两种模式:仅设置标记大小、同时自定义标记大小与标记形状。 - 维度转换层
通过view(0,90)设置垂直俯视视角,剥离三维Z轴空间视觉效果,将3D散点画布投影成二维平面,实现热图视觉效果。 - 样式美化层
加载内置RGB渐变色板,配置坐标轴字体、刻度;修复MATLAB原生图表缺少上、右侧边框的问题,符合国际期刊绘图规范。 - 图像输出层
固定画布尺寸单位为厘米,统一输出分辨率,支持PNG位图、PDF矢量图切换导出。
执行链路总结:原始XYZ数据 → linearheatmap渲染散点 → 3D俯视投影转为二维热图 → 图表样式精细化美化 → 高清图像文件导出
技术名词解释
- 线型热图
区别色块填充型传统热图,依靠大量离散标记点排布,通过颜色映射展示数值高低。适合非均匀离散测点,完整保留点位位置信息。 - scatter3
MATLAB原生三维散点绘图函数,可以独立定义每个坐标点的位置、大小、填充颜色、标记样式,是离散空间数据可视化基础工具。 - view(az,el) 视角投影
图形视角控制命令,view(0,90)代表方位角0°、仰角90°,从画布正上方垂直向下观察,消除三维高度视觉,实现3D图形平面化。 - Marker标记参数
散点绘图基础配置项,包含MarkerSize标记尺寸、标记形状(圆形o、正方形s、小点.等)。 - colormap色板映射表
N行3列RGB数值矩阵,程序按照数值大小,自动匹配矩阵内对应的颜色,完成数据到色彩的线性映射,是热图色彩渲染核心。 - 离散采样数据
采样点位分布没有固定网格,点与点间距不统一,无法直接使用imagesc绘图,也是本文方案主要适配的数据类型。
技术细节
4.1 自定义核心函数 linearheatmap.m
函数支持可变参数输入,自带数据格式兼容处理,降低使用门槛。
matlab
function linearheatmap(X,Y,Z,ms,mt)
% linearheatmap 散点投影线型热图绘制函数
% X,Y,Z :坐标与数值矩阵/向量
% ms :标记大小
% mt :可选输入,标记样式
data = [X(:),Y(:),Z(:)];
% 判断输入参数个数,自适应绘图模式
if nargin < 5
scatter3(data(:,1),data(:,2),data(:,3),ms,data(:,3),'filled')
else
scatter3(data(:,1),data(:,2),data(:,3),ms,data(:,3),mt,'filled')
end
end
两种标准调用示例:
matlab
linearheatmap(x,y,z,50); % 仅设置标记大小,默认圆形标记
linearheatmap(x,y,z,50,'s'); % 设置大小+方形标记
4.2 无外部依赖SCI配色
方案内置完整256阶渐变色RGB矩阵,不再依赖第三方配色工具箱,所有MATLAB版本均可直接运行。如需翻转颜色渐变方向,打开map = flipud(map);注释即可。
4.3 二维热图实现核心原理
matlab
view(0,90)
单纯使用scatter3生成的是三维视图,必须搭配垂直俯视视角,去除空间高度视觉,才能实现二维热图效果,这是整套方案最关键的一行代码。
4.4 学术图表美化细节
- 关闭MATLAB默认完整边框,额外创建叠加坐标轴补齐顶部、右侧边框,匹配SCI期刊绘图习惯;
- 全局统一Arial无衬线字体,分层控制标题、坐标轴标签字号;
- 刻度向外显示,降低坐标轴线条饱和度,画面简洁干净;
- 支持自定义坐标轴范围、自定义Y轴文本标签。
4.5 高清出图相关配置
画布使用厘米作为单位,避免像素缩放失真;默认锁定300DPI出版级分辨率。可以修改打印指令-dpng/-dpdf,切换位图输出或者矢量图输出,满足论文投稿要求。
4.6 参数调优与使用限制
- 数据点位稀疏:适当调大MarkerSize,消除图片空白缝隙;
- 数据点位密集:减小标记尺寸,防止标记重叠糊图;
- 数据量级提醒:不建议处理十万以上海量采样点,渲染速度缓慢;大数据集优先网格化后使用传统热图;
- 可自由修改画布长宽、坐标上下限、色板色彩范围。
4.7 完整主运行脚本 main.m
matlab
% Matlab进阶绘图-散点投影线型热图(SCI学术版)
clear,clc,close all
%% 数据准备
load XYZdata.mat % 300*15网格数据
x = X;
y = Y;
z = Z;
%% 固化SCI科学配色(无TheColor工具箱依赖)
map = [
0.0353 0.1569 0.2353
0.0392 0.1686 0.2431
0.0431 0.1765 0.2510
0.0431 0.1882 0.2588
0.0471 0.1961 0.2667
0.0510 0.2078 0.2745
0.0549 0.2157 0.2824
0.0588 0.2275 0.2902
0.0588 0.2353 0.3020
0.0627 0.2471 0.3098
0.0667 0.2549 0.3176
0.0706 0.2667 0.3255
0.0745 0.2745 0.3333
0.0745 0.2863 0.3412
0.0784 0.2941 0.3490
0.0824 0.3059 0.3569
0.0863 0.3137 0.3647
0.0902 0.3255 0.3725
0.0902 0.3333 0.3804
0.0941 0.3451 0.3882
0.0980 0.3529 0.3961
0.1020 0.3647 0.4039
0.1059 0.3725 0.4157
0.1059 0.3843 0.4235
0.1098 0.3922 0.4314
0.1137 0.4039 0.4392
0.1176 0.4118 0.4471
0.1216 0.4235 0.4549
0.1216 0.4314 0.4627
0.1255 0.4431 0.4706
0.1294 0.4510 0.4784
0.1333 0.4627 0.4863
0.1373 0.4706 0.4941
0.1373 0.4824 0.5020
0.1412 0.4902 0.5098
0.1451 0.5020 0.5176
0.1490 0.5098 0.5294
0.1529 0.5216 0.5373
0.1529 0.5294 0.5451
0.1569 0.5412 0.5529
0.1608 0.5490 0.5608
0.1647 0.5608 0.5686
0.1686 0.5686 0.5765
0.1686 0.5804 0.5843
0.1725 0.5882 0.5922
0.1765 0.6000 0.6000
0.1804 0.6078 0.6078
0.1843 0.6196 0.6157
0.1843 0.6275 0.6235
0.1882 0.6392 0.6314
0.1922 0.6471 0.6431
0.1961 0.6588 0.6510
0.2000 0.6706 0.6588
0.2000 0.6784 0.6667
0.2039 0.6902 0.6745
0.2078 0.6980 0.6824
0.2118 0.7098 0.6902
0.2157 0.7176 0.6980
0.2157 0.7294 0.7059
0.2196 0.7373 0.7137
0.2235 0.7490 0.7216
0.2275 0.7569 0.7294
0.2314 0.7686 0.7373
0.2314 0.7765 0.7451
0.2392 0.7843 0.7529
0.2510 0.7882 0.7529
0.2588 0.7882 0.7529
0.2706 0.7922 0.7529
0.2824 0.7922 0.7529
0.2941 0.7961 0.7529
0.3059 0.7961 0.7529
0.3176 0.8000 0.7490
0.3294 0.8039 0.7490
0.3373 0.8039 0.7490
0.3490 0.8078 0.7490
0.3608 0.8078 0.7490
0.3725 0.8118 0.7490
0.3843 0.8118 0.7490
0.3961 0.8157 0.7490
0.4078 0.8157 0.7490
0.4157 0.8196 0.7490
0.4275 0.8196 0.7490
0.4392 0.8235 0.7490
0.4510 0.8275 0.7451
0.4627 0.8275 0.7451
0.4745 0.8314 0.7451
0.4863 0.8314 0.7451
0.4941 0.8353 0.7451
0.5059 0.8353 0.7451
0.5176 0.8392 0.7451
0.5294 0.8392 0.7451
0.5412 0.8431 0.7451
0.5529 0.8471 0.7451
0.5647 0.8471 0.7451
0.5725 0.8510 0.7451
0.5843 0.8510 0.7451
0.5961 0.8549 0.7412
0.6078 0.8549 0.7412
0.6196 0.8588 0.7412
0.6314 0.8588 0.7412
0.6392 0.8627 0.7412
0.6510 0.8627 0.7412
0.6627 0.8667 0.7412
0.6745 0.8706 0.7412
0.6863 0.8706 0.7412
0.6980 0.8745 0.7412
0.7098 0.8745 0.7412
0.7176 0.8784 0.7412
0.7294 0.8784 0.7412
0.7412 0.8824 0.7373
0.7529 0.8824 0.7373
0.7647 0.8863 0.7373
0.7765 0.8863 0.7373
0.7882 0.8902 0.7373
0.7961 0.8941 0.7373
0.8078 0.8941 0.7373
0.8196 0.8980 0.7373
0.8314 0.8980 0.7373
0.8431 0.9020 0.7373
0.8549 0.9020 0.7373
0.8667 0.9059 0.7373
0.8745 0.9059 0.7373
0.8863 0.9098 0.7333
0.8980 0.9137 0.7333
0.9098 0.9137 0.7333
0.9216 0.9176 0.7333
0.9333 0.9176 0.7333
0.9451 0.9216 0.7333
0.9490 0.9176 0.7294
0.9490 0.9137 0.7176
0.9490 0.9059 0.7059
0.9490 0.9020 0.6941
0.9490 0.8941 0.6824
0.9490 0.8902 0.6706
0.9490 0.8824 0.6588
0.9490 0.8784 0.6471
0.9490 0.8706 0.6353
0.9490 0.8667 0.6235
0.9490 0.8588 0.6118
0.9490 0.8549 0.6000
0.9490 0.8471 0.5882
0.9490 0.8431 0.5765
0.9490 0.8353 0.5647
0.9490 0.8314 0.5569
0.9490 0.8235 0.5451
0.9490 0.8196 0.5333
0.9490 0.8118 0.5216
0.9490 0.8078 0.5098
0.9490 0.8000 0.4980
0.9490 0.7961 0.4863
0.9490 0.7882 0.4745
0.9490 0.7843 0.4627
0.9490 0.7765 0.4510
0.9490 0.7725 0.4392
0.9490 0.7647 0.4275
0.9490 0.7608 0.4157
0.9490 0.7529 0.4039
0.9490 0.7490 0.3922
0.9490 0.7412 0.3843
0.9451 0.7294 0.3608
0.9451 0.7255 0.3490
0.9451 0.7176 0.3373
0.9451 0.7137 0.3255
0.9451 0.7059 0.3137
0.9451 0.7020 0.3020
0.9451 0.6941 0.2902
0.9451 0.6902 0.2784
0.9451 0.6824 0.2667
0.9451 0.6784 0.2549
0.9451 0.6706 0.2431
0.9451 0.6627 0.2314
0.9451 0.6588 0.2196
0.9451 0.6510 0.2118
0.9451 0.6471 0.2000
0.9451 0.6392 0.1882
0.9451 0.6353 0.1765
0.9451 0.6275 0.1647
0.9451 0.6235 0.1529
0.9451 0.6157 0.1412
0.9451 0.6118 0.1294
0.9451 0.6039 0.1176
0.9451 0.6000 0.1059
0.9451 0.5922 0.0941
0.9451 0.5882 0.0824
0.9451 0.5804 0.0706
0.9451 0.5765 0.0588
0.9451 0.5686 0.0471
0.9451 0.5647 0.0392
0.9451 0.5569 0.0275
0.9451 0.5529 0.0157
0.9451 0.5451 0.0039
0.9451 0.5412 0
0.9412 0.5333 0.0039
0.9373 0.5255 0.0078
0.9373 0.5176 0.0078
0.9333 0.5098 0.0118
0.9333 0.5059 0.0118
0.9294 0.4980 0.0157
0.9255 0.4902 0.0157
0.9255 0.4824 0.0196
0.9216 0.4745 0.0235
0.9216 0.4667 0.0235
0.9176 0.4627 0.0275
0.9137 0.4549 0.0275
0.9137 0.4471 0.0314
0.9098 0.4392 0.0314
0.9098 0.4314 0.0353
0.9059 0.4275 0.0353
0.9020 0.4196 0.0392
0.9020 0.4118 0.0431
0.8980 0.4039 0.0431
0.8980 0.3961 0.0471
0.8941 0.3882 0.0471
0.8902 0.3843 0.0510
0.8902 0.3765 0.0510
0.8863 0.3686 0.0549
0.8863 0.3608 0.0588
0.8824 0.3529 0.0588
0.8784 0.3490 0.0627
0.8784 0.3412 0.0627
0.8745 0.3333 0.0667
0.8745 0.3255 0.0667
0.8706 0.3176 0.0706
0.8667 0.3098 0.0706
0.8667 0.3059 0.0745
0.8627 0.2980 0.0784
0.8627 0.2902 0.0784
0.8588 0.2824 0.0824
0.8549 0.2745 0.0824
0.8549 0.2667 0.0863
0.8510 0.2627 0.0863
0.8510 0.2549 0.0902
0.8471 0.2471 0.0941
0.8471 0.2392 0.0941
0.8431 0.2314 0.0980
0.8392 0.2275 0.0980
0.8392 0.2196 0.1020
0.8353 0.2118 0.1020
0.8353 0.2039 0.1059
0.8314 0.1961 0.1098
0.8275 0.1882 0.1098
0.8275 0.1843 0.1137
0.8235 0.1765 0.1137
0.8235 0.1686 0.1176
0.8196 0.1608 0.1176
0.8157 0.1529 0.1216
0.8157 0.1490 0.1216
0.8118 0.1412 0.1255
0.8118 0.1333 0.1294
0.8078 0.1255 0.1294
0.8039 0.1176 0.1333
0.8039 0.1098 0.1333
0.8000 0.1059 0.1373
0.8000 0.0980 0.1373
0.7961 0.0902 0.1412
];
% map = flipud(map); % 反向配色
%% 图片尺寸设置(厘米,期刊标准)
figureUnits = 'centimeters';
figureWidth = 16;
figureHeight = 9;
%% 画布初始化
figureHandle = figure;
set(gcf, 'Units', figureUnits, 'Position', [0 0 figureWidth figureHeight]);
%% 绘制线型散点热图
linearheatmap(x,y,z,50);
hTitle = title('Linear Heatmap Plot');
hXLabel = xlabel('K (w)');
hYLabel = ylabel('Samples');
view(0,90); % 垂直俯视,转为二维热图
%% 可视化细节优化
colormap(map);
colorbar;
% 坐标轴精细化设置
temp = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
ylbs = sprintfc('Samp %c',temp(1:20));
set(gca, 'Box', 'off', ...
'LineWidth',1,...
'XGrid', 'off', 'YGrid', 'off', ...
'TickDir', 'out', 'TickLength', [.01 .01], ...
'XMinorTick', 'off', 'YMinorTick', 'off', ...
'XColor', [.1 .1 .1], 'YColor', [.1 .1 .1],...
'xlim',[0 95],...
'ytick',1:15,...
'ylim',[0 16],...
'yticklabels',ylbs)
% 字体样式(学术通用)
set(gca, 'FontName', 'Arial', 'FontSize', 10)
set([hXLabel, hYLabel], 'FontSize', 11, 'FontName', 'Arial')
set(hTitle, 'FontSize', 12, 'FontWeight' , 'bold')
% 纯白背景
set(gcf,'Color',[1 1 1])
% 补齐右上边框(SCI图表必备)
xc = get(gca,'XColor');
yc = get(gca,'YColor');
unit = get(gca,'units');
ax = axes( 'Units', unit,...
'Position',get(gca,'Position'),...
'XAxisLocation','top',...
'YAxisLocation','right',...
'Color','none',...
'XColor',xc,...
'YColor',yc);
set(ax, 'linewidth',1,...
'XTick', [],...
'YTick', []);
%% 高清图片导出
figW = figureWidth;
figH = figureHeight;
set(figureHandle,'PaperUnits',figureUnits);
set(figureHandle,'PaperPosition',[0 0 figW figH]);
fileout = 'test';
print(figureHandle,[fileout,'.png'],'-r300','-dpng');
结果展示

小结
本文实现基于scatter3投影方案的线型热图,有效解决传统热图无法直接处理离散测点数据的痛点,规避插值引入的数据失真问题。
整套代码模块化程度高,无第三方工具箱依赖,配套完整SCI学术绘图美化模板。使用者只需要替换XYZ数据集,微调标记尺寸、画布大小、色板方向,就能快速生成规范科研插图。
该可视化方案适配试验测点、空间离散采样、仿真非均匀数据集,代码模板可长期复用,同时支持继续拓展透明度设置、自定义色值上下限、批量多子图绘图等功能。