2013-04-08 218 views
3

我使用pm3d在gnuplot的二进制数据

splot 'file' u 1:2:3:4 w pm3d. 

现在,我想用一个二进制文件与内容

a1 b1 c1 d1 
a1 b2 c2 d2 
... 
[blank line] 
a2 b1 c1 d1 
a2 b2 c2 d2 
... 

一些数据文件,我这个阴谋与gnuplot的。我用Fortran使用无格式的流访问创建了文件(直接或顺序访问不直接工作)。通过使用gnuplot与

splot 'file' binary format='%float%float%float%float' u 1:2:3 

我得到一个正常的3D图。但是,pm3d命令不起作用,因为我在二进制文件中没有空白行。我得到的错误信息:

>splot 'file' binary format='%float%float%float%float' u 1:2:3:4 w pm3d 
Warning: Single isoline (scan) is not enough for a pm3d plot. 
Hint: Missing blank lines in the data file? See 'help pm3d' and FAQ. 

根据演示脚本http://gnuplot.sourceforge.net/demo/image2.html,我必须指定记录长度(我仍然不明白的权利)。但是,使用此脚本从演示页面,并与pm3d命令得到同样的错误信息:

splot 'scatter2.bin' binary record=30:30:29:26 u 1:2:3 w pm3d 

那么怎么可能从正确的二进制文件绘制这个四维数据?

编辑:谢谢,mgilson。现在它工作正常。只是为了记录:我的Fortran代码 - 摘录:

open(unit=83,file=fname,action='write',status='replace',access='stream',form='unformatted') 
a= 0.d0 
b= 0.d0 
do i=1,200 
    do j=1,100 
     write(83)real(a),real(b),c(i,j),d(i,j) 
     b = b + db 
    end do 
    a = a + da 
    b = 0.d0 
end do 
close(83) 

的gnuplot的命令:

set pm3d map 
set contour 
set cntrparam levels 20 
set cntrparam bspline 
unset clabel 
splot 'fname' binary record=(100,-1) format='%float' u 1:2:3:4 t 'd as pm3d-projection, c as contour' 

回答

4

大的问题,并感谢张贴。这是gnuplot的一个角落,我以前没有花太多时间。首先,我需要生成一些测试数据 - 我使用python,但您可以使用fortran

请注意,我的输入数组(b)只是一个10x10阵列。数据文件中的前两个“列”只是索引(i,j),但您可以使用任何东西。

>>> import numpy as np 
>>> a = np.arange(10) 
>>> b = a[None,:]+a[:,None] 
>>> b 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
     [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
     [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
     [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
     [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
     [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
     [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
     [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
     [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]]) 
>>> with open('foo.dat','wb') as foo: 
...  for (i,j),dat in np.ndenumerate(b): 
...   s = struct.pack('4f',i,j,dat,dat) 
...   foo.write(s) 
... 

因此,在这里我只是为每个数据点写入4浮点值到文件。再次,这是您已经使用fortran完成的工作。现在绘制它:

splot 'foo.dat' binary record=(10,-1) format='%float' u 1:2:3:4 w pm3d 

我相信这指定每个“扫描”是一个“记录”。由于我知道每次扫描都是10次浮动,因此这将成为record列表中的第一个索引。 -1表示gnuplot应该保持读取记录,直到找到文件的结尾。