Вопрос по gnuplot, variables – gnuplot сохраняет одно число из файла данных в переменную

9

OSX v10.6.8 и Gnuplot v4.4

У меня есть файл данных с 8 столбцами. Я хотел бы взять первое значение из 6-го столбца и сделать его заголовком. Вот что я имею до сих пор:

#m1 m2 q taua taue K avgPeriodRatio time
#1  2  3   4   5   6        7        8

K = #read in data here
graph(n) = sprintf("K=%.2e",n) 
set term aqua enhanced font "Times-Roman,18"

plot file using 1:3 title graph(K)

А вот как выглядят первые несколько строк моего файла данных:

1.00e-07 1.00e-07 1.00e+00 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00
1.11e-06 1.00e-07 9.02e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00
2.12e-06 1.00e-07 4.72e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12070.00
3.13e-06 1.00e-07 3.20e-02 1.00e+05 1.00e+04 1.00e+01 1.310 12090.00

Я не знаю, как правильно читать данные или даже это правильный путь.

EDIT #1

Хорошо, благодаря mgilson у меня теперь есть

#m1 m2 q taua taue K avgPeriodRatio time
#1  2  3   4   5   6        7        8

set term aqua enhanced font "Times-Roman,18"
K = "`head -1 datafile | awk '{print $6}'`"
print K+0
graph(n) = sprintf("K=%.2e",n) 

plot file using 1:3 title graph(K)

но я получаю сообщение об ошибке: не числовая строка найдена там, где ожидалось числовое выражение

EDIT #2

file = "testPlot.txt"
K = "`head -1 file | awk '{print $6}'`"
K=K+0  #Cast K to a floating point number  #this is line 9
graph(n) = sprintf("K=%.2e",n)
plot file using 1:3 title graph(K)

Это дает ошибку - & gt; head: file: нет такого файла или каталога          & quot; testPlot.gnu & quot ;, строка 9: обнаружена нечисловая строка, в которой ожидалось числовое выражение

Ваш Ответ

3   ответа
4

но вот хороший способ получить доступ к одному значению в любом месте вашего файла данных и сохранить его как переменную, доступную для gnuplot:

set term unknown #This terminal will not attempt to plot anything
plot 'myfile.dat' index 0 every 1:1:0:0:0:0 u (var=$1):1

Theindex number позволяет вам обращаться к определенному набору данных (разделенному двумя возвратами каретки), аevery позволяет указать конкретную строку.

Числа, разделенные двоеточиями, послеevery должен иметь форму1:1:<line_number>:<block_number>:<line_number>:<block_number>, где номер строки - это строка с блоком (начиная с 0), а номер блока - это номер блока (разделенный одиночным возвратом каретки, снова начиная с 0). Первое и второе числа говорят, что наносят на график каждые 1 строки и каждый блок данных, а третье и четвертое говорят, что начинаются со строки<line_number> и блок<block_number>. Пятый и шестой говорят, где остановиться. Это позволяет вам выбрать одну строку в любом месте вашего файла данных.

Последняя часть команды plot назначает значение в определенном столбце (в данном случае, столбце 1) вашей переменной var). В команде plot должно быть два значения, поэтому я выбрал столбец 1 для сопоставления с моим оператором присваивания переменной.

13

ПЕРВЫЙ ВАРИАНТ:

usecolumnheader

plot file using 1:3 title columnheader(6)

Я не проверял это, но это может помешать построению первого ряда.

ВТОРОЙ ВАРИАНТ:

использовать внешнюю утилиту для получения заголовка:

TITLE="`head -1 datafile | awk '{print $6}'`"
plot 'datafile' using 1:3 title TITLE

Если переменная числовая и вы хотите переформатировать ее, в gnuplot вы можете привести строки к числовому типу (целое число / число с плавающей запятой), добавив к ним 0 (например,).

print "36.5"+0

Затем вы можете отформатировать его с помощьюsprintf илиgprintf как ты уже делаешь.

Странно, что нетfloat функция. int будет работать, если вы хотите привести к целому числу).

РЕДАКТИРОВАТ

Сценарий ниже работал для меня (когда я вставил данные вашего примера в файл с именем «datafile»):

K = "`head -1 datafile | awk '{print $6}'`"
K=K+0  #Cast K to a floating point number
graph(n) = sprintf("K=%.2e",n)
plot "datafile" using 1:3 title graph(K)

EDIT 2 (адрес комментариев ниже)

Чтобы развернуть переменную в backtics, вам понадобятся макросы:

set macro
file="mydatafile.txt"
#THE ORDER OF QUOTES (' and ") IS CRUCIAL HERE.
cmd='"`head -1 ' . file . ' | awk ''{print $6}''`"'
# . is string concatenation.  (this string has 3 pieces)
# to get a single quote inside a single quoted string
#   you need to double.  e.g. 'a''b' yields the string a'b 
[email protected]

Чтобы ответить на ваш вопрос 2, неплохо бы ознакомиться с утилитами оболочки - sed и awk могут это сделать. Я покажу комбинацию голова / хвост:

cmd='"`head -2 ' . file . ' | tail -1 | awk ''{print $6}''`"'

должно сработать

EDIT 3

Я недавно узнал, что в gnuplot,system - это функция, а также команда. Чтобы сделать вышеупомянутое без всей задней гимнастики,

data=system("head -1 " . file . " | awk '{print $6}'")

Ух ты, намного лучше.

Хорошо, я исправил это сейчас. Просто чтобы быть уверенным, должны быть двойные кавычка такж backtics, это правильно? Когда я запускаю его, он по-прежнему выдает ошибку: обнаружена нечисловая строка, где ожидается числовое выражение, относящееся к строке 6 (выведите K + 0). Это будет означать, что он не позволит мне привести строку к числовому типу таким образом? whatsherface
Большое спасибо! Я пробовал метод заголовка столбца, но, как вы сказали, он не позволяет построить первую строку. Сейчас я работаю над вторым методом, который вы упомянули, и я думаю, что смогу заставить его работать, но я думаю, что запутался в том, как привести строку к числовому типу. Я добавил выше, что я изменил. whatsherface
@ whatsherface - вы используете двойные кавычки" где вы должны использовать backtic (расположен на той же кнопке, что и ~ на американской клавиатуре) mgilson
И при дальнейшей проверке - я заметил, что мне не хватает моих двойных кавычек ... mgilson
@ whatsherface - это работает для меня (см. мои правки для точного кода, который я использовал). (gnuplot 4.4.2, OS X) mgilson
2

которое присваивает значение из первой строки и 6-го столбца файла «Data.txt» переменной x16.

set table
# Syntax: u 0:($0==RowIndex?(VariableName=$ColumnIndex):$ColumnIndex)
# RowIndex starts with 0, ColumnIndex starts with 1
# 'u' is an abbreviation for the 'using' modifier 
plot 'Data.txt' u 0:($0==0?(x16=$6):$6)
unset table

Более общий пример для хранения нескольких значений приведен ниже:

# Load data from file to variable
# Gnuplot can only access the data via the "plot" command
set table
# Syntax: u 0:($0==RowIndex?(VariableName=$ColumnIndex):$ColumnIndex)
# RowIndex starts with 0, ColumnIndex starts with 1
# 'u' is an abbreviation for the 'using' modifier 
# Example: Assign all values according to: xij = Data33[i,j]; i,j = 1,2,3
plot 'Data33.txt' u 0:($0==0?(x11=$1):$1),\
                '' u 0:($0==0?(x12=$2):$2),\
                '' u 0:($0==0?(x13=$3):$3),\
                '' u 0:($0==1?(x21=$1):$1),\
                '' u 0:($0==1?(x22=$2):$2),\
                '' u 0:($0==1?(x23=$3):$3),\
                '' u 0:($0==2?(x31=$1):$1),\
                '' u 0:($0==2?(x32=$2):$2),\
                '' u 0:($0==2?(x33=$3):$3)
unset table
print x11, x12, x13     # Data from first row
print x21, x22, x23     # Data from second row
print x31, x32, x33     # Data from third row

Похожие вопросы