пакет для построения с ++ - PullRequest
       20

пакет для построения с ++

6 голосов
/ 26 ноября 2010

У меня есть вопрос о создании пакета для c ++.Последние несколько лет я использовал python и matplotlib, сейчас я использую c ++, и я хотел бы найти что-то похожее на matplotlib (http://matplotlib.sourceforge.net/gallery.html), например, 2D, 3D-графики, гистограммы и т. Д. И т. Д. Я просто хочу знать,Ваша рекомендация.

С уважением, nykon

Ответы [ 6 ]

6 голосов
/ 26 ноября 2010

Я бы снова порекомендовал gnuplot.

Если вы не хотите использовать его, мне понравился plplot, когда я его использовал: http://plplot.sourceforge.net/. Canvas to plplot также можно поместить в рамку gtk +, если вы хотите добавить кнопки на ваш график.

Тем не менее, я вернулся в gnuplot слишком скоро.

5 голосов
/ 26 ноября 2010

Вы пробовали использовать Gnuplot ? Интерфейс C ++ также доступен.

3 голосов
/ 31 мая 2011

Есть библиотека GPL MathGL , которая написана на C ++ и имеет интерфейсы к Python / C / Fortran и так далее.Он также может создавать множество 3D-графиков.

1 голос
/ 09 мая 2019

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

Построение графиков - это немного сложная задача в C ++, так как в любой IDE C ++ нет библиотеки для печати графиков по умолчанию. Тем не менее, есть много библиотек, доступных онлайн для возможности построения графиков в C ++. Некоторые инструменты построения графиков, такие как Gnuplot, PPlot и т. Д., Уже упоминались в приведенных выше ответах, однако я перечислил один за другим соответствующие примеры:

  1. Koolplot простой, элегантный и простой в использовании инструмент для 2D-черчения и может быть недостаточно для вашего требования. Пример выдержки из веб-сайта приведен ниже, вы можете найти больше примеров и процесс связывания его с C ++ IDE здесь .

    #include "koolplot.h"
    int main()
    {
       plotdata x(-6.0, 6.0);    
       plotdata y = sin(x) + x/5;
       plot(x, y);
       return 0;
    }
    
  2. GNUPlot , очень надежный инструмент с открытым исходным кодом для построения графиков, с помощью интерфейса Интерфейс Gnuplot-iostream , вызывать команды gnuplot из C ++ очень легко процесс. Если кто-то уже имеет опыт построения графиков в gnuplot и должен использовать C ++ для своего программирования, тогда этот интерфейс очень полезен. или если вы хотите создать свой собственный интерфейс, эта информация, предоставленная в здесь , будет очень полезна. Процесс связывания этого интерфейса очень прост, просто установите gnuplot в вашей системе, а затем свяжите каталог include и каталог lib gnuplot с C ++ IDE, и тогда вы готовы к работе. Примеры того, как использовать Gnuplot из C ++ с использованием интерфейса gnuplot-iostream, приведены здесь , выдержка из примера примера приведена ниже.

    #include <vector>
    #include <cmath>
    #include <boost/tuple/tuple.hpp>
    #include "gnuplot-iostream.h"
    int main() {
        Gnuplot gp;
        std::vector<boost::tuple<double, double, double, double> > pts_A;
        std::vector<double> pts_B_x;
        std::vector<double> pts_B_y;
        std::vector<double> pts_B_dx;
        std::vector<double> pts_B_dy;
        for(double alpha=0; alpha<1; alpha+=1.0/24.0) {
            double theta = alpha*2.0*3.14159;
            pts_A.push_back(boost::make_tuple(
                 cos(theta),
                 sin(theta),
                -cos(theta)*0.1,
                -sin(theta)*0.1
            ));
    
            pts_B_x .push_back( cos(theta)*0.8);
            pts_B_y .push_back( sin(theta)*0.8);
            pts_B_dx.push_back( sin(theta)*0.1);
            pts_B_dy.push_back(-cos(theta)*0.1);
        }
        gp << "set xrange [-2:2]\nset yrange [-2:2]\n";
        gp << "plot '-' with vectors title 'pts_A', '-' with vectors title 'pts_B'\n";
        gp.send1d(pts_A);
        gp.send1d(boost::make_tuple(pts_B_x, pts_B_y, pts_B_dx, pts_B_dy));
    } // very simple tool right???
    
  3. MATLAB (Да, я не шучу, MATLAB можно вызвать из C ++) Если вы знакомы с MATLAB, вы можете получить те же функциональные возможности в C ++, вызывая функции / наборы инструментов из MATLAB и наоборот. Поскольку MATLAB является коммерческим программным обеспечением, сначала вам нужно приобрести лицензию (это очень дорого). Если у вас установлено программное обеспечение MATLAB, затем используйте файл engine.h и свяжите необходимые файлы библиотеки MATLAB с C ++ IDE, тогда процесс будет простым. Подробный пошаговый процесс связывания Matlab с Visual Studio C ++ предоставляется здесь и здесь . Пример кода приведен здесь, выдержка из примера приведена ниже enter image description here ( источник )

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include "engine.h"
    #define  BUFSIZE 256
    
    int main()
    
    {
        Engine *ep;
        mxArray *T = NULL, *result = NULL;
        char buffer[BUFSIZE+1];
        double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };
        if (!(ep = engOpen(""))) {
            fprintf(stderr, "\nCan't start MATLAB engine\n");
            return EXIT_FAILURE;
        }
        T = mxCreateDoubleMatrix(1, 10, mxREAL);
        memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));
        engPutVariable(ep, "T", T);
        engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
        engEvalString(ep, "plot(T,D);");
        engEvalString(ep, "title('Position vs. Time for a falling object');");
        engEvalString(ep, "xlabel('Time (seconds)');");
        engEvalString(ep, "ylabel('Position (meters)');");
    
        printf("Hit return to continue\n\n");
        fgetc(stdin);
    
        printf("Done for Part I.\n");
        mxDestroyArray(T);
        engEvalString(ep, "close;");
    
        buffer[BUFSIZE] = '\0';
        engOutputBuffer(ep, buffer, BUFSIZE);
        while (result == NULL) {
            char str[BUFSIZE+1];
            printf("Enter a MATLAB command to evaluate.  This command should\n");
            printf("create a variable X.  This program will then determine\n");
            printf("what kind of variable you created.\n");
            printf("For example: X = 1:5\n");
            printf(">> ");
    
            fgets(str, BUFSIZE, stdin);
            engEvalString(ep, str);
            printf("%s", buffer);
            printf("\nRetrieving X...\n");
            if ((result = engGetVariable(ep,"X")) == NULL)
              printf("Oops! You didn't create a variable X.\n\n");
            else {
            printf("X is class %s\t\n", mxGetClassName(result));
            }
        }
        printf("Done!\n");
        mxDestroyArray(result);
        engClose(ep);
    
        return EXIT_SUCCESS;
    }
    
  4. Python , людям нравится спрашивать (кто знаком с инструментом matplotlib в Python). Очень элегантный интерфейс доступен для вызова Python из C ++. простой пример может выглядеть следующим образом ( source ), а matlabplotcpp.h доступно здесь .

    #include "matplotlibcpp.h"
    namespace plt = matplotlibcpp;
    int main() {
        plt::plot({1,3,2,4});
        plt::show();
    }
    

    Надеюсь, эта информация может быть полезна ...

Примечание - Если какая-либо информация не цитируется должным образом, пожалуйста, прокомментируйте, я процитирую информацию источника ...

1 голос
/ 17 января 2019

Я задавал своему профессору подобные вопросы, когда учился в школе, и он сказал, что C ++ на самом деле не используется для составления графиков данных и тому подобного.У него не было никаких предложений, но опять же он был скорее разработчиком программного обеспечения, чем использовал C ++ для более научных вычислительных приложений.Он предложил сделать все перебор данных в C ++, а затем найти способ экспортировать свой код обратно в Python или R. Другой альтернативой является то, что вы можете использовать пакет Rcpp пакета R.Это позволяет вам писать функции C ++ внутри скрипта R или уценки. пакет rcpp

1 голос
/ 26 ноября 2010

Я использовал Qwt некоторое время назад. Это библиотека поверх Qt, которая предоставляет ряд очень полезных инструментов для построения графиков. Остерегайтесь лицензионных сборов Qt, если это на самом деле коммерческий проект.

...