Построение нескольких кривых

#gnuplot

#gnuplot

Вопрос:

Я начал использовать GNUPLOT из своего программного обеспечения несколько лет назад, и это было очень полезно. Мое программное обеспечение генерирует командный файл gnuplot, включающий все данные, а затем автоматически вызывает GNUPLOT для отображения этого на экране или в файле. В некоторых случаях мое программное обеспечение генерирует несколько строк как функции переменной, и в таком случае я пишу таблицу с несколькими столбцами, но мне не удалось построить все кривые из одной таблицы, поэтому решение, которое я нашел, заключалось в использовании нескольких команд построения, таких как

 plot "-" using 3:2 with lines ls  1 title "X(LIQUID,CU)",
"" using   4:2 with lines ls  2 title "X(FCC-A1,CU)",
"" using   5:2 with lines ls  3 title "X(FCC-..O#2,CU)" 
  

далее следует таблица, повторяемая столько раз, сколько у меня есть команд построения графика (каждый раз завершается буквой «e»).
Недавно я начал пытаться очистить свой код и обнаружил, что в GNUPLOT есть команда «plot for», и я попытался использовать это. Например:

 plot for [i=3:5] './table1.dat' using i:2 with lines ls i columnhead(i)
  

работает очень хорошо, за исключением того, что я хотел бы иметь таблицу в том же файле, что и команды GNUPLOT. Не получается заменить «. / table1.dat» на «-«, а затем записать таблицу (включая 3 «e» в конце), потому что тогда я получаю только первую строку. Это работает, если я повторяю таблицу, как и раньше (с «e» между ними), но затем я возвращаюсь к решению, которое у меня уже есть.
Я пытался добавить «repeat» после «e», но безуспешно.
Ранее я пробовал multiplot, но потом у меня возникли проблемы с масштабированием.

Построение графика работает нормально, просто я хотел бы избежать длительного и довольно запутанного повторения (также в моем потоковом коде) одной и той же таблицы для каждой строки, которую я хочу построить. Я уверен, что должен быть какой-то тонкий способ сделать то, что я хочу, но я не могу найти его в руководстве.

Бо Сандман

Ответ №1:

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

 $Table <<EOD
1 11 111
2 22 222
3 33 333
EOD
plot for [i=2:3] $Table using 1:i with lines
  

Комментарии:

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

Ответ №2:

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

Вы могли бы сначала записать свои данные в какой-нибудь временный файл, а затем отобразить его:

 F=system("mktemp /tmp/gnuplot-XXXXXXXX")
TITLES="A B C D"
set table F
plot "-" u 1:2:3:4:5 w table
0 1 2 3 4 
1 6 7 8 9 
e 
plot for [i=2:5] F u 1:i tit word(TITLES,i-1)
  

Проблема в том, что set table не поддерживает экспорт заголовков столбцов AFAIK, отсюда и хитрость со списком слов.