You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:55:20