2009-04-19 12 views
22

Estoy haciendo una pequeña simulación de exploración y quiero mostrar los gráficos para comparar el rendimiento entre los algoritmos durante el tiempo de ejecución.¿Manera fácil y gratuita de dibujar gráficos y tablas en C++?

¿Qué biblioteca viene a su mente? Prefiero aquellos que son pequeños como me gustaría si es fácil para mi instructor compilar mi código. Revisé gdchart pero parece ser demasiado pesado. Solo quiero un tipo simple de gráfico de línea de tiempo x-y.

gráfico de Google es, por supuesto, fuera de cuestión, en caso de que haya leído this pregunta similar.


Publicación relacionada Scatter Plots in C++.

+0

Windows pero realmente prefiero multiplataforma ya que código en Linux la mayoría del tiempo, y mis instructores usan Windows. – syaz

+0

check http://stackoverflow.com/questions/215110/scatter-plots-in-c/40612951#40612951 – SAAD

Respuesta

12

Mi favorito siempre ha sido gnuplot. Es muy extenso, por lo que podría ser demasiado complejo para sus necesidades. Es multiplataforma y existe a C++ API.

+0

Gracias, ciertamente es una bestia, más fácil de usar que la trama también. – syaz

6

He usado este "plotter portátil". Es muy pequeño, multiplataforma, fácil de usar y puedes conectarlo a diferentes bibliotecas gráficas. pplot

(Sólo para la parte de las parcelas)

Si usa o planea usar Qt, otra solución multiplataforma es Qwt y Qchart

+0

Esto parece prometedor, el ejemplo que se muestra es de hecho mucho más simple que gdchart. – syaz

10

Honestamente, yo estaba en el mismo barco que tú. Tengo una biblioteca C++ que quería conectar a una utilidad de gráficos. Terminé usando Boost Python y matplotlib. Fue el mejor que pude encontrar.

Como nota al margen: también tenía dudas sobre las licencias. matplotlib y las bibliotecas de impulso pueden integrarse en aplicaciones propietarias.

He aquí un ejemplo del código que he utilizado:

#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(); 
    } 
} 
+1

¿Tendría un ejemplo simple de cómo lo hizo ?, estaría muy interesado en saberlo. –

+1

@ZamfirKerlukson: http://blog.wlynch.cx/2009/11/03/Matplotlib/ –

+0

Esta es una joya. Gracias por compartir. Ambos útiles y extraños. – nurettin

4

Cern ROOT produce algunas cosas bastante agradables, yo lo uso para mostrar mucho los datos de la red neuronal.

+1

Aunque, por supuesto, ROOT no es una adición ligera a su entorno de trabajo, ni trivial de usar. Aún así, estoy en física de partículas, así que úsala casi exclusivamente. – dmckee

Cuestiones relacionadas