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

C调用gnuplot绘制多折线图被识别为单数据块的代码问题排查

问题原因

你的代码存在两个核心语法错误,不符合gnuplot内联数据('-'数据源)的解析规则:

  • plot命令的系列声明不完整:gnuplot的plot语句中,每一个用'-'标记的内联数据源对应一个独立的数据系列,多个系列需要在同一条plot命令中用逗号分隔,分别声明属性和数据源。你只在开头写了一个'-',相当于只告诉gnuplot要读1个系列的数据,后续插在数据流里的t 'data2' lt 2不会被识别为plot命令的一部分,只会被当成格式错误的数值行跳过。
  • 数据块结束标记缺失:每个'-'对应的内联数据块,必须单独用一行仅包含e的内容标记结束。你只在所有数据最后加了一个e,gnuplot会把两次循环输出的所有数值都归到第一个声明的系列里,自然会出现两个数据集被合并绘制的问题。
修正后的实现代码
FILE *gnuplot = popen("gnuplot", "w");
// 此处可添加gnuplot初始化配置,比如终端类型、坐标轴范围、网格开关等
// plot命令提前声明两个内联数据源,分别配置两个系列的绘制属性
fprintf(gnuplot, "plot '-' u 1:2 t 'data1' w lp lt 0, '-' u 1:2 t 'data2' w lp lt 2\n");

// 写入第一个系列数据
for (int i = 0; i < lines; ++i) {
    fprintf(gnuplot, "%f %f\n", x[i] - x[0], y[i]);
}
fprintf(gnuplot, "e\n"); // 第一个数据块结束标记,不可省略

// 写入第二个系列数据
for (int i = 0; i < lines; ++i) {
    fprintf(gnuplot, "%f %f\n", x[i] - x[0], 0.4*(x[i] - c0)/c1);
}
fprintf(gnuplot, "e\n"); // 第二个数据块结束标记
fflush(gnuplot);

// 如果使用交互式终端(如qt、x11),注意不要立刻调用pclose,避免绘图窗口闪退
补充说明

如果需要绘制更多系列,按照相同规则在plot命令后追加逗号分隔的'-'系列声明,每个系列数据写完后单独加e标记即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:36:07