2

我正在尝试使用 gnuplot 绘制通过 FreeFEM++ 获得的数据。

在 FreeFEM 中,我使用以下代码保存了数据:

{ ofstream ff("sol.dat");
    for (int i=0;i<Th.nt;i++){
            for ( int j=0; j<3; j++){
                    ff<<Th[i][j].x << "\t" << Th[i][j].y << "\t" << u[][Vh(i,j)] << endl;
            }
            ff<<Th[i][0].x << "\t" << Th[i][0].y << "\t" << u[][Vh(i,0)] << "\n\n\n";
    }

}

第一行数据的示例是:

0.635787    -0.0440338  0.0056924
0.65234 -0.063181   0.00797757
0.655369    -0.0412323  0.00795786
0.635787    -0.0440338  0.0056924


0.597634    -0.0376 3.06323e-33
0.613904    -0.0585366  0.0030425
0.616879    -0.0388107  0.0030295
0.597634    -0.0376 3.06323e-33

出于某种我不知道的原因,每个“包”中有一个重复两次的数据点。但这就是他们在 FreeFem 手册中告诉您这样做的方式。显然 GNUPLOT 出于某种原因需要“数据包”之间的空格。

我正在尝试使用 gnuplot 脚本绘制数据:

set pm3d at b
set palette rgbformulae 30,31,32
set hidden3d
splot "sol.dat" with lines palette

它的情节很好,但我认为 pm3d 没有做任何事情。我认为 pm3d 会在图的底部包含热强度的彩色图案。此外,我找不到用纯色填充图中线条之间的间隙的方法。

输出样本

谢谢你。

4

1 回答 1

1

要回答这个问题,首先需要正确解释组织数据的不同可能性:

  1. 两个空行分隔两个不同的数据集。这些根本没有连接,它们之间没有画线。在您的情况下,这是必需的,因为gnuplot不支持单个表面的网格类型。

  2. pm3d仅适用于单个数据集,并且需要常规网格(请参阅pm3d 演示)。单个曲面的两条线(等值线)必须仅由一个空行分隔。

仍然有一个不规则的网格,pm3d无法处理。在内部gnuplot,您可以使用dgrid3d对输入数据进行重新采样以获得常规网格并使用pm3d.

dgrid3d会影响一个splot命令的所有数据文件。所以你还需要multiplot使用两个splot命令。

以下脚本显示了它是如何工作的,但由于我没有完整的数据集,也不知道如何dgrid3d处理这么多数据集(参见上面的 1.),这只是一个非常粗略的指南:

set multiplot

set pm3d at b
set dgrid3d 200,200
unset key
splot 'sol.dat' nosurface

unset dgrid3d
unset pm3d
splot 'sol.dat' with lines palette

unset multiplot

这应该可以,但您可能需要调整dgrid3d呼叫。此外,可能需要一些其他增强功能(仅绘制一次边框、抽动和颜色框等)

于 2013-10-25T18:52:41.790 回答