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

Gnuplot与C语言实现不同符号/颜色绘图的问题排查

问题分析与解决方案

嗨,我来帮你搞定这个问题!你遇到的情况是因为没有正确结束第一个数据集的输入,导致第二个plot命令被gnuplot当成无效数据忽略了,具体原因和修复方案如下:

为什么你的代码无效?

当你向gnuplot发送plot '-' ...命令时,它会进入「数据读取模式」:只会一直读取后续的内容,直到遇到单独一行的e,才会结束当前数据集的读取并执行绘图。

你的代码逻辑存在的问题:

  1. 发送第一个plot '-'命令
  2. 输出前6个点的数据
  3. 直接发送第二个plot '-'命令——这时候gnuplot还在数据读取模式里,它会把这行命令当成无效的文本数据直接跳过,根本不会执行这个绘图命令
  4. 输出后6个点的数据
  5. 发送e结束读取

最终gnuplot会把所有有效数值行(前6个+后6个点)都当作第一个plot命令的数据集,所以所有点都用第一个命令里的蓝色、pt7样式绘制了。

修复方案

方案1:用replot添加第二个数据集

先完成第一个数据集的绘制,再用replot命令添加第二个数据集,每个数据集都要用e单独结束:

float x[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
float y[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
FILE *gnuplot = popen("gnuplot", "w");

// 绘制第一个数据集
fprintf(gnuplot, "plot '-' pt 7 pointsize 2 lc \"blue\" notitle \n");
for (int i = 0; i < 6; ++i) {
    fprintf(gnuplot,"%f %f\n", x[i], y[i]);
}
fprintf(gnuplot, "e\n"); // 必须结束第一个数据集的输入

// 用replot添加第二个数据集
fprintf(gnuplot, "replot '-' pt 5 pointsize 2 lc \"red\" notitle \n");
for (int i = 6; i < 12; ++i) {
    fprintf(gnuplot,"%f %f\n", x[i], y[i]);
}
fprintf(gnuplot, "e\n"); // 结束第二个数据集的输入

fflush(gnuplot);
getch();
fclose(gnuplot);

方案2:在同一个plot命令里指定多个数据集(推荐)

这种方式更高效,只需要一次plot命令,用逗号分隔多个数据集,然后依次发送每个数据集的数据并单独用e结束:

float x[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
float y[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
FILE *gnuplot = popen("gnuplot", "w");

// 一次声明两个数据集,逗号分隔各自的样式
fprintf(gnuplot, "plot '-' pt 7 pointsize 2 lc \"blue\" notitle, '-' pt 5 pointsize 2 lc \"red\" notitle \n");

// 发送第一个数据集
for (int i = 0; i < 6; ++i) {
    fprintf(gnuplot,"%f %f\n", x[i], y[i]);
}
fprintf(gnuplot, "e\n"); // 结束第一个数据集

// 发送第二个数据集
for (int i = 6; i < 12; ++i) {
    fprintf(gnuplot,"%f %f\n", x[i], y[i]);
}
fprintf(gnuplot, "e\n"); // 结束第二个数据集

fflush(gnuplot);
getch();
fclose(gnuplot);

注意事项

  • 每个'-'都对应一个数据集,必须用单独一行的e来结束,不能和数据行混在一起
  • 方案2减少了和gnuplot的交互次数,运行效率更高,更推荐使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:17:42