Как программно использовать оси в Gnuplot?

#bash #plot #gnuplot #axis

#bash #график #gnuplot #ось

Вопрос:

Если вам нужно нарисовать несколько графиков по осям x1y1 или x1y2 , в зависимости от максимального значения y каждого графика, какой синтаксис был бы правильным для этого?

Мой файл данных содержит несколько столбцов. Первая содержит значения x, остальные y1, y2 и так далее. После использования команды stats я мог легко определить значение каждой оси для каждого графика:

 stats '$data_file' u 1:2 nooutput;
y1max = STATS_max_y;
if (y1max > ymax) { y1axis = 'x1y2' } else { y1axis = 'x1y1' };
stats '$data_file' u 1:3 nooutput;
y2max = STATS_max_y;
if (y2max > ymax) { y2axis = 'x1y2' } else { y2axis = 'x1y1' };
...
  

После этого я могу рисовать графики с помощью этого plot cmd

 plot '$data_file' using 1:2 axes x1y1 notitle with lines lc rgb 'black' lw 1,
               '' using 1:3 axes x1y2 notitle with lines lc rgb 'green' lw 1;
  

который работает, но это совсем не программно.

Но это не работает

 plot '$data_file' using 1:2 axes @y1axis notitle with lines lc rgb 'black' lw 1,
               '' using 1:3 axes @y2axis notitle with lines lc rgb 'green' lw 1;
  

где я использовал Substitution of string variables as macros (Символ @ используется для инициализации подстановки текущего значения строковой переменной в
командная строка …), которая написана в документах.

eval Команда также не любит работать у меня.

Не могли бы вы, пожалуйста, привести пример для этой цели, который работает, или какой-нибудь хороший совет. СПАСИБО!

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

1. Ваша команда plot с макросами выглядит неплохо. У вас включены макросы? Это должно иметь место по умолчанию для версий > = 5.0. Проверьте show macros и включите это с помощью set macros , если это еще не сделано. В противном случае: вы получаете сообщение об ошибке или неправильно выбраны оси?

2. Здесь работают команды, которые вы показываете с подстановкой макросов, протестированные как в 5.2.8, так и в 5.4.0. Есть ли в этом что-то еще, чего вы не показываете? Например, это не сработало бы, если бы команды macro и plot находились внутри предложения iteration в фигурных скобках do for [i=1:10] { macro=foo; plot baz axes @macro ... } . Это потому, что подстановка макроса выполняется перед выполнением цикла, поэтому назначение переопределения макроса внутри цикла не имеет эффекта.

3. @Christoph: Если я использую show macros , возвращаемое значение будет просто пустой строкой. Каким должно быть ожидаемое значение?

4. @Ethan: Спасибо за объяснение. Я не использую цикл.

5. Я использовал приведенный выше синтаксис в скрипте bash. При копировании в строку gnuplot cmd появляется та же ошибка или предупреждение: warning: y3axis is not a string variable и, следовательно axes must be x1y1, x1y2, x2y1 or x2y2 . Но после того, как вы оба сказали, что cmd работает, спасибо большое, я обнаружил ошибку при чтении потока ( sourceforge.net/p/gnuplot/mailman/gnuplot-beta/thread /… ). Я использовал код в качестве oneliner, но это могло работать не так, как написано в документах ( … поскольку макрос определен в той же строке и не будет расширен со временем …), но я пропустил это. Теперь все работает! СПАСИБО!

Ответ №1:

Я получил две ошибки / предупреждения при использовании приведенного выше кода в скрипте bash в качестве oneliner следующим образом

 echo "gnuplot cmds;plot ..." | gnuplot
  
  • предупреждение: y3axis не является строковой переменной
  • оси должны быть x1y1, x1y2, x2y1 или x2y2

Как написано в документации, макрос не удалось развернуть одновременно с его определением, что происходит, если он написан в той же строке.

Чтобы избежать вышеупомянутой ошибки, мы должны использовать только

echo -e "gnuplot cmds; n plot ..." | gnuplot

и это работает так, как должно.

Спасибо @Christoph и @Ethan, которые наставили меня на правильный путь.