4

コンテンツを含むデータファイルがいくつかあります

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

これをgnuplotでプロットします

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

今、私はバイナリファイルを使いたいと思っています。フォーマットされていないストリーム アクセスを使用して 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

では、バイナリ ファイルからこの 4 次元データを正しくプロットするにはどうすればよいでしょうか。

編集:ありがとう、ミリソン。今では正常に動作します。記録のために:私の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

1 に答える 1

5

すばらしい質問です。投稿していただきありがとうございます。これは、これまであまり時間を割いてこなかった gnuplot のコーナーです。最初に、小さなテスト データを生成する必要があります。私は Python を使用しましたが、fortran同じように簡単に使用できます。

私の入力配列 ( b) は単なる 10x10 配列であることに注意してください。データファイルの最初の 2 つの「列」は単なるインデックス (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 個の float の長さになることがわかっているので、それがリストの最初のインデックスになりrecordます。は-1、gnuplot がファイルの終わりを見つけるまでレコードを読み続ける必要があることを示します。

于 2013-04-08T17:24:35.307 に答える