Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GTK+-based graph?

Tags:

c++

gtk

gtk2

I want to be able to make a line graph using GTK+ but I'm unsure how to approach this. Has anyone got any hints or tips?

like image 438
paultop6 Avatar asked Apr 13 '10 11:04

paultop6


People also ask

How can I graphing with GTK?

There are a number of options for graphing with GTK. Here are a couple. Gnuplot and Plplot will work with GTK. I haven’t tried Plplot but there is a simple setup for gnuplot at /* Use gnuplot to output to a file and then open the file in an image widget. This uses GSubprocess to start gnuplot.

What is GTK and how to use it?

GTK provides, directly or through various dependencies, a full platform for application development. You can browse the latest available documentation online. You can find guides and tutorials on the GNOME developer documentation website. ATK — Accessibility toolkit to implement support for screen readers and other tools (GTK3 only)

What do you use GTK+3 for application development?

I am using GTK+3 for application development in a embedded microprocessor (Toradex Colibri iMX6DL) and thanks for the user-friendly application development with GTK. I am using Eclipse neon 3 as IDE to debug and i almost completed the application. But the main part of my application is to plot a graph with the set of data from two sensors.

Is there a way to use gnuplot with GTK?

Gnuplot and Plplot will work with GTK. I haven’t tried Plplot but there is a simple setup for gnuplot at /* Use gnuplot to output to a file and then open the file in an image widget. This uses GSubprocess to start gnuplot.


1 Answers

Edit:

Here are GTK+ 2 and GTK+ 3 versions of that program:

  • https://github.com/liberforce/gtk-samples/tree/master/c/gtk2-graph

  • https://github.com/liberforce/gtk-samples/tree/master/c/gtk3-graph

Original answer:

Here's a GTK2 application using cairo to draw a simple math function:

#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;
}
like image 103
liberforce Avatar answered Sep 19 '22 00:09

liberforce