Gnuplot与C语言实现不同符号/颜色绘图的问题排查
问题分析与解决方案
嗨,我来帮你搞定这个问题!你遇到的情况是因为没有正确结束第一个数据集的输入,导致第二个plot命令被gnuplot当成无效数据忽略了,具体原因和修复方案如下:
为什么你的代码无效?
当你向gnuplot发送plot '-' ...命令时,它会进入「数据读取模式」:只会一直读取后续的内容,直到遇到单独一行的e,才会结束当前数据集的读取并执行绘图。
你的代码逻辑存在的问题:
- 发送第一个
plot '-'命令 - 输出前6个点的数据
- 直接发送第二个
plot '-'命令——这时候gnuplot还在数据读取模式里,它会把这行命令当成无效的文本数据直接跳过,根本不会执行这个绘图命令 - 输出后6个点的数据
- 发送
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
相关产品推荐
相关产品推荐

