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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 12:29:38