C++通过popen()调用gnuplot实时绘图出现平坦曲线的问题求助及解决反馈
C++通过popen()调用gnuplot实时绘图出现平坦曲线的问题求助及解决反馈
我最近在做一个需求:想在C++代码里通过popen()调用gnuplot,实现从管道获取数据时实时更新图形,希望能把计算出来的数据逐点绘制出来。
我用y=2*x这个简单函数做测试,但遇到了问题:gnuplot只画出了一条平坦的线,显示的是最后一个点的y值(所有x对应的y都是同一个常量)。每次刷新绘图时,这条线的“高度”会变化——因为管道的输入在更新,但就是没法正确画出y随x变化的曲线。
我的原代码如下:
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> int main (int argc, char **argv) { FILE *fp = NULL; fp = popen ("gnuplot-x11 -persist", "w"); int i =0; unsigned char x_data[100000], y_data[100000]; for (i=0; i<=100; i++) { x_data[i]=i; y_data[i]=2*i; printf("%0u\t %0u\n", x_data[i], y_data[i]); } printf("end of init\n"); fprintf(fp, "plot '-'\n"); for (i=0; i<=100; i++) { printf ("%0u\t %0u\n", x_data[i], y_data[i]); // 用来检查x、y的值 fprintf(fp,"set xrange[0:100]\n"); // 也试过fprintf(fp, "set xrange[0:%0u]\n", i); fprintf(fp, "set yrange[0:255]\n"); fprintf(fp, "plot %0u, %0u", x_data[i], y_data[i]); fprintf(fp, " with points\n"); fflush(fp); } pclose(fp); return 0; }
我尝试过很多方法,但都没解决:
- 原本以为像从文本文件读数据那样,gnuplot会自动把第一列当x、第二列当y,但在代码里它却把两个变量都当成了y轴数据,画出两条平坦的线;
- 我试过在
plot命令里加上using 1:2,结果gnuplot报错“unexpected or unrecognized token”; - 也尝试过用
'-'的方式传递数据,但收到“Bad data on line 1 of file”的错误; - 还把
fflush(fp)移到for循环外面,结果还是一样的平坦曲线。
补充一下环境:我是在树莓派4的Debian系统上用Geany写的代码,不管调用gnuplot-x11还是gnuplot,结果都没区别。我知道可以把数据存到临时文件里实现绘图,但想先把管道的方式搞通再退而求其次,所以来求助大家!
编辑:
感谢大家的思路启发,我修改了代码,把数据直接跟在plot命令后面发送,修改后的代码片段如下:
fprintf(fp, "plot '-' using 2:1 \t"); for (i=0; i<=1000; i++) { fprintf(fp, "%0u, %0u\t", x_data[i], y_data[i]); fprintf(fp, "with points\n"); }
现在已经能按照我想要的方式工作了!
备注:内容来源于stack exchange,提问作者sTadek
相关产品推荐
相关产品推荐

