web-dev-qa-db-fra.com

Un moyen facile et gratuit de dessiner des graphiques et des tableaux en C ++?

Je fais un peu de simulation d'exploration et je veux montrer les graphiques pour comparer les performances parmi les algorithmes pendant l'exécution.

Quelle bibliothèque vous vient à l'esprit? Je préfère fortement ceux qui sont petits comme j'adorerais s'il est facile pour mon instructeur de compiler mon code. J'ai vérifié gdchart mais cela semble trop lourd. Je veux juste une sorte de graphique chronologique simple x-y.

Le graphique Google est bien sûr hors de question, au cas où vous auriez lu this question similaire.


Article connexe Scatter Plots in C++ .

26
syaz

Mon préféré a toujours été gnuplot . Il est très étendu, donc il pourrait être un peu trop complexe pour vos besoins. Il est multiplateforme et il y a ne API C++ .

15
marcog

Honnêtement, j'étais dans le même bateau que vous. J'ai une bibliothèque C++ que je voulais connecter à un utilitaire graphique. J'ai fini par utiliser Boost Python et matplotlib . C'était le meilleur que j'ai pu trouver.

En remarque: je me méfiais également des licences. matplotlib et les bibliothèques boost peuvent être intégrés dans des applications propriétaires.

Voici un exemple du code que j'ai utilisé:

#include <boost/python.hpp>
#include <pygtk/pygtk.h>
#include <gtkmm.h>

using namespace boost::python;
using namespace std;

// This is called in the idle loop.
bool update(object *axes, object *canvas) {
    static object random_integers = object(handle<>(PyImport_ImportModule("numpy.random"))).attr("random_integers");
    axes->attr("scatter")(random_integers(0,1000,1000), random_integers(0,1000,1000));
    axes->attr("set_xlim")(0,1000);
    axes->attr("set_ylim")(0,1000);
    canvas->attr("draw")();
    return true;
}

int main() {
    try {
        // Python startup code
        Py_Initialize();
        PyRun_SimpleString("import signal");
        PyRun_SimpleString("signal.signal(signal.SIGINT, signal.SIG_DFL)");

        // Normal Gtk startup code
        Gtk::Main kit(0,0);

        // Get the python Figure and FigureCanvas types.
        object Figure = object(handle<>(PyImport_ImportModule("matplotlib.figure"))).attr("Figure");
        object FigureCanvas = object(handle<>(PyImport_ImportModule("matplotlib.backends.backend_gtkagg"))).attr("FigureCanvasGTKAgg");

        // Instantiate a canvas
        object figure = Figure();
        object canvas = FigureCanvas(figure);
        object axes = figure.attr("add_subplot")(111);
        axes.attr("hold")(false);

        // Create our window.
        Gtk::Window window;
        window.set_title("Engineering Sample");
        window.set_default_size(1000, 600);

        // Grab the Gtk::DrawingArea from the canvas.
        Gtk::DrawingArea *plot = Glib::wrap(GTK_DRAWING_AREA(pygobject_get(canvas.ptr())));

        // Add the plot to the window.
        window.add(*plot);
        window.show_all();

        // On the idle loop, we'll call update(axes, canvas).
        Glib::signal_idle().connect(sigc::bind(&update, &axes, &canvas));

        // And start the Gtk event loop.
        Gtk::Main::run(window);

    } catch( error_already_set ) {
        PyErr_Print();
    }
}
11
Bill Lynch

J'ai utilisé ce "traceur portable". Il est très petit, multiplateforme, facile à utiliser et vous pouvez le brancher dans différentes bibliothèques graphiques. pplot

(Uniquement pour la partie parcelles)

Si vous utilisez ou prévoyez d'utiliser Qt, une autre solution multiplateforme est Qwt et Qchart

6
alvatar

Cern's [[# #]] root [~ # ~] produit des trucs assez sympas, je l'utilise pour afficher beaucoup de données de Neural Network.

5
Ed James