表面绘制从C到gnuplot的管道

时间:2015-05-07 15:01:55

标签: c 2d gnuplot surface piping

我已经成功地将数据从我的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,它会返回错误:

  

单一等值线&lt;扫描&gt;对于pm3d情节来说还不够

有没有办法解决这个问题?

由于

1 个答案:

答案 0 :(得分:2)

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

if __name__ == "__main__":
    ui.enableBox(Interface, ui.path(Interface))

即。在内部for循环之后打印换行符

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

x2 y1 z21
x2 y2 z22
..
x2 yN z2N

x3 y1 z31
...

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

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");    
}