Показаны сообщения с ярлыком gnuplot. Показать все сообщения
Показаны сообщения с ярлыком gnuplot. Показать все сообщения

среда, 23 октября 2019 г.

Вызов команд Gnuplot из программы С++

    Gnuplot, как известно, интерактивная программа. Также в ней существует возможность создавать скрипты, которые можно запускать с командного интепретатора операционной системы. Иногда бывает удобно "заворачивать" эти команды в программу с/с++. Далее в тексте приведены две таких программы. Кто умеет пользоваться Gnuplot-ом без труда сможет изменить их текст для своих нужд. Первая програма выполняет стандартную задачу постройки 2D-графиков, а вторая строит "карту" из данных, представленых матрицей. В обоих случаях вывод происходит не окно, а в отдельный jpeg файл.
#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
using namespace std;

int main(){
    FILE* gnuplotpipe;
    string command;
    gnuplotpipe = popen("gnuplot -persist","w");
    if(!gnuplotpipe)
        cerr<<("there are no gnuplot");

command =
    "set terminal jpeg size 3400,2300 font 'Times New Roman-bold,48';"
    "set output 'graphic.jpg';"
    "plot "
    "'data1.dat' u 1:2 w l t '1', "
    "'data2.dat' u 1:2 w l t '2', "
    "'data3.dat' u 1:2 w l t '3'; ";

    fprintf(gnuplotpipe,"%s",command.c_str());
    fflush(gnuplotpipe);


    fprintf(gnuplotpipe, "exit\n");
    pclose(gnuplotpipe);
    return 0;
}


#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
using namespace std;
int main(){
    FILE* gnuplotpipe;
    string command;
    gnuplotpipe = popen("gnuplot -persist","w");
    if(!gnuplotpipe)
        cerr<<("there are no gnuplot");

command =
    "set terminal jpeg size 3400,2300 font 'Times New Roman-bold,48';"
    "set output 'graphic.jpg';"

    "set pm3d map;"
    "set pm3d at b;"
    "set pm3d interpolate 0,1;"
    "set pm3d corners2color c1;"
    "set palette defined (0 \"blue\", 10 \"cyan\", 30 \"green\", 45 \"yellow\", 70 \"orange\", 100 \"red\");"
    "set cbrange [0:1];"
    "set ticslevel 0;"
    "splot \"matrixData.dat\" matrix;";

    fprintf(gnuplotpipe,"%s",command.c_str());
    fflush(gnuplotpipe);


    fprintf(gnuplotpipe, "exit\n");
    pclose(gnuplotpipe);
    return 0;
}



среда, 9 января 2013 г.

Gnuplot: линейная аппроксимация

Пусть у нас имеется текстовый файл myData.dat состоящий из двух колонок цифр и мы хотим нарисовать два графика: первый, изображенный символами (точками), собственно данные; второй, представленный линией, которая и является линейной аппроксимацией этих данных. Создадим файл myApproximation.plt следующего содержания:
my_linear_fit(x)=a*x+b
fit my_linear_fit(x) 'myData.dat' via a,b
plot 'myData.dat'     title 'my data', my_linear_fit(x) title 'approximation of my data' 
И запустим gnuplot из директории, в которой создали этот файл и введем команду:
>load 'myApproximation.plt'
Для задания диапазонов абсциссы и ординаты пользуем такие команды:
>set xrange [0:100]
>set yrange[0:]
Цифры даны для примера.

Gnuplot: вывод в несколько окон

Если мы делаем графики в Gnuplot, то по умолчанию вывод этих графиков делается в окно с заголовком "Gnuplot(window id:0)". В других операционных системах заголовок, возможно, другой. Я использую Debian GNU/Linux 7.0 (wheezy). Но суть не в этом. Итак. Если мы дадим команду replot или plot, но с другими чем в предыдущем plot опциями, то наш предыдущий график будет затираться новым. Но что, если я хочу нарисовать еще один график не уничтожая предыдущего? Можно рисовать следующие графики в новом окне. Делается это командой:
>set terminal wxt n
где n - это некое число: 1,2,3 и т.д. Соответственно новое окно будет выводиться с заголовком "Gnuplot(window id:n)".

вторник, 15 декабря 2009 г.

Пример минимального сеанса работы с gnuplot

Рассмотрим создание двухмерного графика.
Пусть у нас текстовый файл из трех колонок чисел output.dat. В первой и второй колонках - аргументы функции, в третей - ее значение. Визуализируем эти данные. Есть тонкость - колонки "разделены" пустыми строками на блоки, в которых один из аргументов должен иметь постоянное значение. Рассматриваем случай, когда аргументы есть равномерная сетка точек на поверхности.
Заходим из командной оболочки в каталог с этим файлом. Привожу минимальный список команд - пополнять и редактировать можно на любой вкус:
#gnuplot
gnuplot> splot 'output.dat' using 1:2:3 w l
gnuplot> set grid
gnuplot> set contour base
gnuplot> set pm
gnuplot> set cntrparam levels 100
gnuplot> set cntrparam levels discret -100,100,150
gnuplot> set xrange [100: 200]
gnuplot> set yrange [200: 300]
gnuplot> key outside
gnuplot> set key off

Цифры даны для примера.
Вывод можно делать и в файл. Возьмем тип postscript:
gnuplot> set term postscript
gnuplot> set out 'picture.ps'
Вернем вывод на консоль:
gnuplot> set out x11
gnuplot> set term x11

Еще немного полезных команд:
gnuplot> set view map
gnuplot> set surface no
gnuplot> unset surface

Хорошая ссылка по теме на русском языке.