2010-04-13 28 views
13

Quiero ser capaz de hacer un gráfico de líneas usando GTK + pero no estoy seguro de cómo acercarme a esto. ¿Alguien tiene consejos o consejos?Gráfico basado en GTK +?

Respuesta

4

Eche un vistazo a gnuplot Hay algunos C++ libraries que hacen interfaz con gnuplot, que hacen lo que está buscando y algo más. Es muy fácil de usar si alguna vez has usado gnuplot.

+4

Ante la misma pregunta que el OP hace 5,5 años, me pregunto por qué esta respuesta fue aceptada? ¡No responde la pregunta! Como mínimo, una sugerencia de una frase indica que falta el argumento (creado con gnuplot) en un widget Gtk. –

9

Solo quiero agregar algunas alternativas más a esta solicitud común.

  1. libgoffice
    Esta es la biblioteca utilizada por Gnumeric y AbiWord, por lo que se mantiene activa y bastante estable: una de las alternativas más cuerdo disponibles en la actualidad. Desafortunadamente, no hay una página de inicio oficial y carece de documentación para principiantes.
  2. GtkDatabox
    Recientemente cambió el mantenedor, por lo que hay cierta incertidumbre en el futuro. Solía ​​ser una buena solución para generar una gran cantidad de datos en gráficos de líneas.
  3. GtkExtra2
    Este era el viejo estándar de facto de gráficos de trazado en GTK +. El salto a GTK + 2 parece haber sido fatal para este proyecto.
  4. GTK+ instrumentation widgets y GLineGraph
    Un poco spartans pero bueno para cosas simples.

Aparte de eso, muchos proyectos implementan internamente algún tipo de gráficos GTK +. Aparte del citado Gnuplot, también hay Gwyddion y gretl. Y estoy bastante seguro de que me faltan toneladas de otros.

En conclusión, no existe un consenso general ni una norma de facto para la cartografía en el mundo GTK + ...

+2

Actualmente estoy viendo cómo gnome-system-monitor dibuja sus gráficos, para mí la forma en que lo implementa usando cairo parece ser una buena manera de trazar, además estoy tratando de trazar en tiempo real también. Gracias por su información, todo está incluido. – paultop6

11

Editar:

Éstos son GTK + 2 y GTK + 3 versiones de ese programa :

Respuesta original:

Aquí hay una aplicación GTK2 usando Cairo para dibujar una simple función matemática:

#include <gtk/gtk.h> 
#include <math.h> 
#include <cairo.h> 

#define WIDTH 640 
#define HEIGHT 480 

#define ZOOM_X 100.0 
#define ZOOM_Y 100.0 


gfloat f (gfloat x) 
{ 
    return 0.03 * pow (x, 3); 
} 

static gboolean 
on_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) 
{ 
    cairo_t *cr = gdk_cairo_create (widget->window); 
    GdkRectangle da;   /* GtkDrawingArea size */ 
    gdouble dx = 5.0, dy = 5.0; /* Pixels between each point */ 
    gdouble i, clip_x1 = 0.0, clip_y1 = 0.0, clip_x2 = 0.0, clip_y2 = 0.0; 
    gint unused = 0; 

    /* Define a clipping zone to improve performance */ 
    cairo_rectangle (cr, 
      event->area.x, 
      event->area.y, 
      event->area.width, 
      event->area.height); 
    cairo_clip (cr); 

    /* Determine GtkDrawingArea dimensions */ 
    gdk_window_get_geometry (widget->window, 
      &da.x, 
      &da.y, 
      &da.width, 
      &da.height, 
      &unused); 

    /* Draw on a black background */ 
    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); 
    cairo_paint (cr); 

    /* Change the transformation matrix */ 
    cairo_translate (cr, da.width/2, da.height/2); 
    cairo_scale (cr, ZOOM_X, -ZOOM_Y); 

    /* Determine the data points to calculate (ie. those in the clipping zone */ 
    cairo_device_to_user_distance (cr, &dx, &dy); 
    cairo_clip_extents (cr, &clip_x1, &clip_y1, &clip_x2, &clip_y2); 
    cairo_set_line_width (cr, dx); 

    /* Draws x and y axis */ 
    cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); 
    cairo_move_to (cr, clip_x1, 0.0); 
    cairo_line_to (cr, clip_x2, 0.0); 
    cairo_move_to (cr, 0.0, clip_y1); 
    cairo_line_to (cr, 0.0, clip_y2); 
    cairo_stroke (cr); 

    /* Link each data point */ 
    for (i = clip_x1; i < clip_x2; i += dx) 
     cairo_line_to (cr, i, f (i)); 

    /* Draw the curve */ 
    cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6); 
    cairo_stroke (cr); 

    cairo_destroy (cr); 
    return FALSE; 
} 


int 
main (int argc, char **argv) 
{ 
    GtkWidget *window; 
    GtkWidget *da; 

    gtk_init (&argc, &argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_default_size (GTK_WINDOW (window), WIDTH, HEIGHT); 
    gtk_window_set_title (GTK_WINDOW (window), "Graph drawing"); 
    g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL); 

    da = gtk_drawing_area_new(); 
    gtk_container_add (GTK_CONTAINER (window), da); 

    g_signal_connect (G_OBJECT (da), 
      "expose-event", 
      G_CALLBACK (on_expose_event), 
      NULL); 

    gtk_widget_show_all (window); 
    gtk_main(); 

    return 0; 
}