#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, которые наставили меня на правильный путь.