среда, 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;
}