在C++14(VS2022)中用GNUPlot绘制无插值空白等高线图
解决GNUPlot等高线图无数据区域不插值的问题
dgrid3d自动填充无数据区域的问题确实头疼,给你几个实用的解决办法:
1. 给dgrid3d加noclip参数(GNUPlot 5.2+可用)
如果你的GNUPlot版本够新,直接给dgrid3d加noclip选项,它就只会在原始数据的凸包范围内插值,凸包外的区域直接留白,不会瞎补:
// C++代码里给GNUPlot发命令 gp << "set dgrid3d 20,20 noclip\n"; gp << "splot 'your_data.txt' with linescontour\n";
这里的20,20是网格密度,根据你的数据规模调整就行。
2. 手动给无数据点赋值NaN
GNUPlot会自动忽略NaN值,所以你可以提前处理数据:
- 先生成覆盖目标范围的规则网格
- 对每个网格点,判断它是否在原始数据的有效覆盖范围内(比如用距离阈值或者凸包判断)
- 不在范围内的点直接设为
NaN,在范围内的点按需做插值(比如线性插值) - 最后把处理好的网格数据传给GNUPlot,不用dgrid3d:
// 假设x、y、z是处理后的网格数据,包含NaN gp << "splot '-' with linescontour\n"; for (size_t i = 0; i < x.size(); ++i) { gp << x[i] << " " << y[i] << " " << z[i] << "\n"; } gp << "e\n";
这种方法兼容性最好,不管新老版本都能用。
3. 换用pm3d+contour组合
pm3d默认不会对无数据区域插值,再叠加等高线就能达到效果:
gp << "set pm3d at b\n"; // 把pm3d图层放在底部 gp << "set contour base\n"; // 等高线画在pm3d的基底上 gp << "set cntrparam levels auto 10\n"; // 设置自动生成10条等高线 gp << "unset dgrid3d\n"; // 一定要关掉自动插值 gp << "splot 'your_data.txt' with pm3d, '' with linescontour\n";
这样无数据的地方会直接留白,等高线也只会出现在有数据的区域。
小提示
- 先在GNUPlot命令行里测试命令效果,没问题再移植到C++代码里,省得来回调试
- 如果用旧版GNUPlot,优先用手动加NaN的方法,
noclip可能不支持
内容的提问来源于stack exchange,提问作者Runsva
相关产品推荐
相关产品推荐

