Напрямую использовать gnuplot из октавы? - PullRequest
1 голос
/ 18 июня 2020

Я обычно считаю Octave самым простым в использовании инструментом для оценки данных, но громоздким для визуализации данных.

С другой стороны, я считаю Gnuplot самым простым в использовании инструментом для визуализации данных из-за

  • его очень целенаправленного характера,
  • его мощная библиотека демонстрационных примеров и
  • его всеобъемлющие интерактивные функции справки.

Эти преимущества сводятся на нет путем помещения любой языковой оболочки между gnuplot и пользователем, но В чистом gnuplot (намеренно) отсутствуют возможности для выполнения какой-либо нетривиальной предварительной обработки (например, численного исчисления).

Octave может использовать gnuplot в качестве бэкэнда, но для сохранения преимуществ я бы предпочел напрямую использовать команды gnuplot, например :

dx = 0.1;
x = 0:dx:2*pi;
y = sin(x);
y2 = cumsum(y)*dx;
outputFileName = "sin.pdf"

# Contains mockup syntax:
gp set term pdfcairo size 30cm,20cm noenhanced
gp set output '${outputFileName}'
gp plot ${x,y} using 1:2 with lines title "The sin(x) function",         \
gp      ${x,y2} using 1:2 with lines title "Integrated sin(x) function", \
gp      cos(x) title "The cos(x) function"
gprun

Написать базовую c реализацию этой утилиты «gp» было бы достаточно просто, хотя интерполяцию переменных пришлось бы заменить явной gp(["set output '" outputFileName "'"]) за счет удобства чтения. Однако не так просто было бы создать файл таблицы ${x,y}.

Есть ли какой-нибудь простой способ получить аналогичную функциональность?


По иронии судьбы, некоторые много более старые версии октавы (примерно до 2005, 2006) имели эту возможность (gset, graw, ...), но понижали их до уровня внутренней реализации. В некоторых старых обсуждениях я нахожу ссылки, например, на __graw__, которого также больше не существует, а на некоторых устаревших сайтах документации упоминается gplot, который все еще существует, но с совершенно другой целью.

1 Ответ

3 голосов
/ 19 июня 2020

Честно говоря, я думаю, вы слишком много над этим думаете. Создание временного скрипта и его запуск часто бывает даже более простым и переносимым, чем громоздкие библиотеки (например, см. Мой предыдущий аналогичный ответ здесь для примера sqlite)

Использование приведенного ниже подхода хорошо работает для меня , на мой взгляд, очень удобочитаем и не приводит к появлению ненужных файлов (по крайней мере, незаметно для вашей рабочей области). сценарий (как предлагается здесь ), но если вы предпочитаете, вы можете использовать те же logi от c до fdisp их в отдельный временный файл данных и сделать ваш сценарий Gnuplot считанным из него; также вы можете обрабатывать или не обрабатывать ошибки состояния и удалять временные файлы после операции (как я сделал в связанном примере sqlite), если вы беспокоитесь о создании большого количества временных файлов и занимании места ... но на практике это обычно не имеет значения.

Я думаю, что этот подход хорош и дает вам больше контроля ... но, если вы настаиваете, должно быть тривиально обернуть эти fdisp вызовы в функцию gp и вызов system в функцию gprun ...

...