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
Solo quiero agregar algunas alternativas más a esta solicitud común.
- 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. - 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. - 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. - 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 + ...
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
Editar:
Éstos son GTK + 2 y GTK + 3 versiones de ese programa :
https://github.com/liberforce/gtk-samples/tree/master/c/gtk2-graph
https://github.com/liberforce/gtk-samples/tree/master/c/gtk3-graph
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;
}
- 1. Creación de gráficos en Gtk/Gtk #
- 2. gráfico de relación de tareas basado en JIRA
- 3. Cómo truncar un NSString basado en el ancho gráfico?
- 4. Desplazamiento por arrastre en una aplicación GTK +
- 5. Implementar aplicaciones GTK Sharp en Windows sin instalar GTK #
- 6. GTK detailed_signal
- 7. Declarativo GTK
- 8. ¿Cómo instalar gtk en python2.7?
- 9. GTK # en Visual Studio 2010
- 10. Escalar una imagen en GTK
- 11. comenzando con GTK + en Ubuntu
- 12. GObject Gtk, Gnome, Gtk +, Gl, Gtk2, Gtk3 ... ¿No entiendo?
- 13. ¿Cuál es la relación entre GTK, GTK + y GTK2?
- 14. cómo aplicar basado en la condición segue costumbre en guión gráfico
- 15. GTK # + WebKit + Windows
- 16. Mostrar imagen sin gtk
- 17. tamaño mínimo de gtk
- 18. Qt vs GTK + rendimiento
- 19. Cerrar programáticamente ventana gtk
- 20. Javascript enlaces GTK
- 21. Deshacer con GTK TextView
- 22. Gtk Terminal Widget
- 23. instalando gtk y glib
- 24. Hacer una etiqueta en negrita en GTK +
- 25. Diferencia entre gráfico, gráfico y gráfico
- 26. Atajos múltiples para una acción en GTK
- 27. Estáticamente vinculando bibliotecas GTK + en Windows
- 28. Uso de GTK + en Visual C++
- 29. ¿Es posible usar GTK + en Android?
- 30. Python + WebKit + GTK en las ventanas
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. –