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
相关产品推荐
相关产品推荐

