从 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");
}
我创建了一个函数,它成功地将数据从我的 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");
}