我希望能够使用 GTK+ 制作折线图,但我不确定如何处理。有没有人有任何提示或提示?
问问题
17183 次
3 回答
13
编辑:
以下是该程序的 GTK+ 2 和 GTK+ 3 版本:
https://github.com/liberforce/gtk-samples/tree/master/c/gtk2-graph
https://github.com/liberforce/gtk-samples/tree/master/c/gtk3-graph
原答案:
这是一个使用 cairo 绘制简单数学函数的 GTK2 应用程序:
#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;
}
于 2013-01-09T13:10:10.490 回答
10
我只想为这个常见请求添加更多替代方案。
- libgoffice
这是Gnumeric和AbiWord使用的库,因此它得到积极维护且相当稳定:目前可用的最明智的替代方案之一。不幸的是,没有官方主页,也缺少初学者文档。 - GtkDatabox
最近换了maintainer,所以以后有一些不确定性。它曾经是在折线图中呈现大量数据的一个很好的解决方案。 - GtkExtra2
这是在 GTK+ 中绘制图表的旧事实标准。跳到 GTK+2 似乎对这个项目来说是致命的。 - GTK+ 仪表小部件和GLineGraph
有点斯巴达,但适合简单的东西。
除此之外,许多项目在内部实现了某种 GTK+ 图表。除了尚未引用的Gnuplot之外,还有Gwyddion和gretl。而且我很确定我错过了很多其他人。
总之,在 GTK+ 世界中,没有普遍的共识,也没有事实上的图表标准……
于 2010-04-13T16:36:59.260 回答