Создать блок данных Gnuplot с помощью команды Shell - PullRequest
0 голосов
/ 22 февраля 2020

У меня довольно дорогая команда оболочки, которая генерирует некоторый вывод, который должен быть нанесен на график. Вывод содержит информацию для нескольких кривых, например, такую:

echo 1 2 3; echo 4 5 6; echo 7 8 9

Они должны быть построены с использованием команды, подобной этой:

plot <something> using 1:2, \
     <something> using 1:3

Чтобы избежать повторного вызова команды оболочки ( как это довольно медленно), я хочу сохранить его результат в блоке данных, но до сих пор мои испытания не работали. Вот что я попробовал:

output = system("echo 1 2 3; echo 4 5 6; echo 7 8 9")
set print $DATA
print output
unset print

Теперь у меня кажется блок данных, содержащий то, что я хочу, потому что print $DATA теперь печатает это:

1 2 3
4 5 6
7 8 9
   

завершающая пустая строка, я надеюсь, это не проблема, но, возможно, это указывает на то, что что-то не так, я не знаю.

Когда я сейчас пытаюсь построить это с помощью plot $DATA using 1:2, я получаю только первое из три ожидаемых пункта (1 | 2), (4 | 5) и (7 | 8).

Я чувствую, что, возможно, есть более простой способ достичь моей первоначальной цели, но до сих пор я не нашел это.

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Теперь у меня , кажется, есть блок данных, содержащий то, что я хочу, потому что print $DATA теперь печатает это:

1 2 3
4 5 6 
7 8 9 

Нет, $DATA нет содержать то, что вы хотите. $DATA должен быть массивом с тремя элементами : 1-й элемент - 1 2 3, 2-й элемент - 4 5 6 и 3-й - 7 8 9. Вместо этого комбинация output = system("..."), set print $DATA и print output создает массив с только одним элементом : 1 2 3\n4 5 6\n7 8 9, печать в блоке данных не разбивает строку на отдельные строки.

Разница не видна с print $DATA. И новый элемент массива блока данных, и \n внутри элемента массива создают разрыв строки.

Вы можете использовать команду load '< XXXXX', чтобы сгенерировать полезный блок данных. Из документации gnuplot:

Команда load выполняет каждую строку указанного входного файла, как если бы он был введен в интерактивном режиме.

...

В некоторых системах, которые поддерживают функцию popen (Unix), файл загрузки можно прочитать из канала, начав имя файла с '<'. </p>

"XXXXX" может быть серия команд оболочки, которые генерируют необходимые команды gnuplot:

load '< echo "\$DATA << EOD" && echo 1 2 3; echo 4 5 6; echo 7 8 9 && echo "EOD"'
print $DATA
plot $DATA using 1:2 pt 5, $DATA using 1:3 pt 7 

(на основе gnuplot: загрузка файла данных 1: 1 в блок данных )

1 голос
/ 23 февраля 2020

Если я правильно понял вашу проблему, я вижу три версии, где должны работать версии 2 и 3. Я думаю, что версия 2 - это то, чего вы хотели избежать. Почему не работает 1-я версия, я могу только догадываться. Мое подозрение связано с символом конца строки. Кажется, есть разница, если вы пишете в блок данных (версия 1) или в файл (версия 3). Я помню дискуссию с @Ethan по этому поводу ... но я все еще не понимаю себя. Я предполагаю, что вы работаете с Linux, в Windows & используется вместо ;.

Код:

### system output to datablock
reset session

# Version 1
set title "Version 1: only plots 1st data line"
output = system("echo 1 2 3 & echo 4 5 6 & echo 7 8 9")   # in Windows "&" instead of ";"
set print $Data
    print output
set print
plot $Data u 1:2 w lp pt 7
pause -1

# Version 2
set title "Version 2: several system calls"
set print $Data
    print system("echo 1 2 3")
    print system("echo 4 5 6")
    print system("echo 7 8 9")
set print
plot $Data u 1:2 w lp pt 7
pause -1

# Version 3
set title "Version 3: writing into data file"
output = system("echo 1 2 3 & echo 4 5 6 & echo 7 8 9")   # in Windows "&" instead of ";"
set print "Data.dat"
    print output
set print
plot "Data.dat" u 1:2 w lp pt 7

### end of code
...