LaurVas

Особенности гнуплота под Windows

gnuplot, windows

КДПВ

Если под линуксом гнуплот работает без нареканий и сюрпризов, то под Windows могут возникнуть странности. Далее я поведаю обо всех найденных особенностях Windows-версии этой утилиты. Их не много, так что пост получился коротким.

Что мы тут установили?

В папке binary присутствуют несколько исполнимых файлов: gnuplot.exe, wgnuplot.exe, pgnuplot.exe. Первый предназначен для работы из консоли Windows:

Окно gnuplot

Второй — эмулятор консоли в более привлекательном виде — по сути то же самое, но не отпугивает чернотой:

Окно wgnuplot

Третий нужен для работы с каналами (pipeline).

Для “ручной работы” рекомендуется использовать wgnuplot. Там есть кнопочки и работает drag&drop.

В папке demo лежат скрипты примеров. Запустите wgnuplot.exe и откройте любой файл с расширением .dem. Кстати, где эти же скрипты находятся в линуксовой версии, я не знаю. Наверное /usr/share/doc.

Разумеется, не стоит забывать про папку docs. Хотя мой внутрениий голос подсказывает, что вы туда не полезете.

Что нужно сделать после установки?

Можете почитать README-Windows.txt. Я советую назначить wgnuplot программой по умолчанию для файлов с расширением .gp, .gpl, .plt или другим, как больше нравится (я использую .plot). Двойной клик по такому файлу запустит построение графика. Если картинка появляется и тут же гаснет, добавьте в конец скрипта паузу: pause -1;. Должен быть способ получше, но мне лень экспериментировать. Я пересел на линукс, там все хорошо.

Хак для C/C++ программистов

Если вы не собираетесь запускать гнуплот из C-программ, то дальше можно не читать.
Мы будем использовать старые добрые каналы (pipes) — один из инструментов ОС Unix. Windows их поддерживает, но, боюсь, никто ими не пользуется. А жаль, ибо штука удобная.

#include <stdio.h>
#include <stdlib.h>

int main()
{
   FILE *gpipe = popen("pgnuplot -persist","w");
   if(!gpipe)
      return -1;

   fprintf(gpipe, "set terminal win\n");
   fprintf(gpipe, "plot x*x\n");
   fprintf(gpipe, "pause -1 \"hit enter to exit\"\n");
   fprintf(gpipe, "exit\n");
   pclose(gpipe);

   return 0;
}

Функция popen() волшебным образом запускает гнуплот и теперь мы печатаем в него, как в обычный файл. Попробуйте скомпилировать эту программу. Возможно придётся заменить функцию popen() на _popen(), зависит от компилятора. Несмотря на правильный код, нас ждёт облом — Windows попросту не знает, где находится pgnuplot.exe, когда мы просим его открыть. Чтобы получить возможность запуска гнуплота через канал, я нашел три способа:

  1. Поселить exe-шник разрабатываемой программы вместе с содержимым папки binary в одну папку. Этот вариант выглядит наиболее убого (мало кому понравится таскать 20–30 лишних файлов вместо двух-трех), но зато всё будет работать на машинах, где гнуплот не установлен (получаем такую portable-версию).

  2. Прописать полный путь к гнуплоту, не забывая, что обратный слеш экранируется. Например команда FILE *gpipe = popen("gplt\\pgnuplot -persist","w"); заставляет ОС искать гнуплот в папке gplt в папке с проектом. Получаем ту же portable-версию, но без помойки. Не сложно догадаться как работает строка FILE *gpipe = popen("C:\\Program\ files\\gnuplot\\binary\\pgnuplot -persist","w");

  3. Самый правильный способ — добавить директорию гнуплота в переменную PATH. Вот как это сделать. Сразу может не заработать, перезагружаемся.

Остаётся один неприятный косяк — размер окна определяется автоматически (видимо в процентах от разрешения экрана) и задать в коде его нельзя. Т. е. если вы хотите получить окно квадратной формы, придется каждый раз изменять его размер вручную. В линуксе можно задать размер окна, а в винде нет.