从 C 到 gnuplot 的曲面绘图管道

Surface plot piping to gnuplot from C

我创建了一个函数,它成功地将数据从我的 C 程序传输到 gnuplot:

void gnuprintabs(FILE *gp,double **RE,double **IM, double x[], int N)
{     
    int i,j;

    fprintf(gp, "splot '-'\n");

    for (i=0; i<N; i++)
    {
        for(j=0; j<N; j++)
        {
            fprintf(gp, "%g %g %g\n", x[i],x[j],sqrt(RE[i][j]*RE[i][j]+IM[i][j]*IM[i][j]));
        }
    }
    fflush(gp);
    fprintf(gp, "e\n");    
}            

函数本身处于一个循环中,从而不断更新 2D RE 和 IM 数组。

我的问题是如何使此图成为实体表面而不是单个点或线?

如果我告诉 gnuplot set pm3d\n,它 returns 一个错误:

single isoline < scan > is not enough for pm3d plot

有办法解决这个问题吗?

谢谢

要获得曲面图,您必须将两个具有相同 x 值的块分隔开,但通过空行更改 y 值(反之亦然):

x1 y1 z11
x1 y2 z12
...
x1 yN z1N

x2 y1 z21
x2 y2 z22
..
x2 yN z2N

x3 y1 z31
...

即在内部 for-loop

之后打印一个换行符
void gnuprintabs(FILE *gp,double **RE,double **IM, double x[], int N)
{     
    int i,j;

    fprintf(gp, "splot '-'\n");

    for (i=0; i<N; i++)
    {
        for(j=0; j<N; j++)
        {
            fprintf(gp, "%g %g %g\n", x[i],x[j],sqrt(RE[i][j]*RE[i][j]+IM[i][j]*IM[i][j]));
        }
        fprintf(gp, "\n");
    }
    fflush(gp);
    fprintf(gp, "e\n");    
}

如果吞吐量可能是个问题,并且您的 x 步和 y 步是等距的,您也可以将数据写为矩阵格式:

void gnuprintabs(FILE *gp,double **RE,double **IM, double x[], int N)
{     
    int i,j;

    fprintf(gp, "x0 = %e; dx = %e; y0 = %e; dy = %e;\n", x[0], x[1]-x[0], y[0], y[1]-y[0]);

    fprintf(gp, "splot '-' matrix using (x0+dx*):(y0+dy*):3\n");

    for (i=0; i<N; i++)
    {
        for(j=0; j<N; j++)
        {
            fprintf(gp, "%g ", sqrt(RE[i][j]*RE[i][j]+IM[i][j]*IM[i][j]));
        }
        fprintf(gp, "\n");
    }
    fflush(gp);
    fprintf(gp, "e\n");    
}