2013-04-08 3 views
3

У меня есть некоторые файлы данных с содержаниемpm3d в Gnuplot с двоичными данными

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 

Так как можно построить эти четыре размерных данные из двоичного файла правильно?

Редактировать: Спасибо, 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 должен вести чтение записей до тех пор, пока не найдет конец файла.

Смежные вопросы