From: John Darrington Date: Wed, 9 May 2012 09:11:50 +0000 (+0200) Subject: Histograms: Rotate labels when there are lots of bins X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp;a=commitdiff_plain;h=5d489646dd5b0c4255c608691a91e639dd8c2ece Histograms: Rotate labels when there are lots of bins --- diff --git a/src/output/cairo-chart.c b/src/output/cairo-chart.c index 56b35290a6..78f5fabab7 100644 --- a/src/output/cairo-chart.c +++ b/src/output/cairo-chart.c @@ -151,8 +151,8 @@ xrchart_draw_marker (cairo_t *cr, double x, double y, } void -xrchart_label (cairo_t *cr, int horz_justify, int vert_justify, - double font_size, const char *string) +xrchart_label_rotate (cairo_t *cr, int horz_justify, int vert_justify, + double font_size, const char *string, double angle) { PangoFontDescription *desc; PangoLayout *layout; @@ -167,6 +167,7 @@ xrchart_label (cairo_t *cr, int horz_justify, int vert_justify, pango_font_description_set_absolute_size (desc, font_size * PANGO_SCALE); cairo_save (cr); + cairo_rotate (cr, angle); cairo_get_current_point (cr, &x, &y); cairo_translate (cr, x, y); cairo_move_to (cr, 0, 0); @@ -215,18 +216,28 @@ xrchart_label (cairo_t *cr, int horz_justify, int vert_justify, pango_font_description_free (desc); } +void +xrchart_label (cairo_t *cr, int horz_justify, int vert_justify, + double font_size, const char *string) +{ + xrchart_label_rotate (cr, horz_justify, vert_justify, font_size, string, 0); +} + + /* Draw a tick mark at position If label is non null, then print it at the tick mark */ static void draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom, enum tick_orientation orientation, + bool rotated, double position, const char *s); void draw_tick (cairo_t *cr, const struct xrchart_geometry *geom, enum tick_orientation orientation, + bool rotated, double position, const char *label, ...) { @@ -238,7 +249,7 @@ draw_tick (cairo_t *cr, const struct xrchart_geometry *geom, if (fabs (position) < DBL_EPSILON) position = 0; - draw_tick_internal (cr, geom, orientation, position, s); + draw_tick_internal (cr, geom, orientation, rotated, position, s); free (s); va_end (ap); } @@ -247,6 +258,7 @@ draw_tick (cairo_t *cr, const struct xrchart_geometry *geom, static void draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom, enum tick_orientation orientation, + bool rotated, double position, const char *s) { @@ -276,7 +288,12 @@ draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom, cairo_move_to (cr, x, y); if (orientation == SCALE_ABSCISSA) - xrchart_label (cr, 'c', 't', geom->font_size, s); + { + if ( rotated) + xrchart_label_rotate (cr, 'l', 'c', geom->font_size, s, -G_PI_4); + else + xrchart_label (cr, 'c', 't', geom->font_size, s); + } else if (orientation == SCALE_ORDINATE) { if (fabs (position) < DBL_EPSILON) @@ -330,7 +347,7 @@ xrchart_write_scale (cairo_t *cr, struct xrchart_geometry *geom, for (s = 0 ; s < upper - lower; ++s) { double pos = (s + lower) * tick_interval; - draw_tick (cr, geom, orient, + draw_tick (cr, geom, orient, false, s * tick_interval * geom->axis[orient].scale, "%g", pos); } } diff --git a/src/output/cairo-chart.h b/src/output/cairo-chart.h index f415d1b915..0864d7e014 100644 --- a/src/output/cairo-chart.h +++ b/src/output/cairo-chart.h @@ -96,13 +96,19 @@ void xrchart_draw_marker (cairo_t *, double x, double y, enum xrmarker_type, void xrchart_label (cairo_t *, int horz_justify, int vert_justify, double font_size, const char *); +void xrchart_label_rotate (cairo_t *cr, int horz_justify, int vert_justify, + double font_size, const char *string, double angle); + + /* Draw a tick mark at position If label is non zero, then print it at the tick mark */ void draw_tick (cairo_t *, const struct xrchart_geometry *, - enum tick_orientation orientation, double position, + enum tick_orientation orientation, + bool rotated, + double position, const char *label, ...) - PRINTF_FORMAT (5, 6); + PRINTF_FORMAT (6, 7); /* Write the title on a chart*/ diff --git a/src/output/charts/boxplot-cairo.c b/src/output/charts/boxplot-cairo.c index dfc8399d46..946b7d443c 100644 --- a/src/output/charts/boxplot-cairo.c +++ b/src/output/charts/boxplot-cairo.c @@ -131,7 +131,8 @@ boxplot_draw_box (cairo_t *cr, const struct xrchart_geometry *geom, } /* Draw tick mark on x axis */ - draw_tick(cr, geom, SCALE_ABSCISSA, box_centre - geom->axis[SCALE_ABSCISSA].data_min, "%s", name); + draw_tick (cr, geom, SCALE_ABSCISSA, false, + box_centre - geom->axis[SCALE_ABSCISSA].data_min, "%s", name); } void diff --git a/src/output/charts/plot-hist-cairo.c b/src/output/charts/plot-hist-cairo.c index 87409b1a90..a9a5d44f58 100644 --- a/src/output/charts/plot-hist-cairo.c +++ b/src/output/charts/plot-hist-cairo.c @@ -102,7 +102,7 @@ hist_draw_bar (cairo_t *cr, const struct xrchart_geometry *geom, cairo_stroke (cr); if (label) - draw_tick (cr, geom, SCALE_ABSCISSA, + draw_tick (cr, geom, SCALE_ABSCISSA, bins > 10, x_pos + width / 2.0, "%g", (upper + lower) / 2.0); }