Histograms: Rotate labels when there are lots of bins
authorJohn Darrington <john@darrington.wattle.id.au>
Wed, 9 May 2012 09:11:50 +0000 (11:11 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 9 May 2012 14:23:37 +0000 (16:23 +0200)
src/output/cairo-chart.c
src/output/cairo-chart.h
src/output/charts/boxplot-cairo.c
src/output/charts/plot-hist-cairo.c

index 56b35290a6572a2098620cf12a4fd8270843f709..78f5fabab7249ae2fdfff448be9891f120cb40f1 100644 (file)
@@ -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);
     }
 }
index f415d1b9152d24a0ec8ca9ead02824e138c05aa8..0864d7e0142e00b45c95b2cec86c5d9b74ddd95b 100644 (file)
@@ -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*/
index dfc8399d4618ac8088c2c7d4a533a9d627621b19..946b7d443c7e8abfa1008c136aebd734857a7d0a 100644 (file)
@@ -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
index 87409b1a90937bd76a62c668e033df74bbc80aea..a9a5d44f58b475aef164f8fe9077008d4264ece8 100644 (file)
@@ -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);
 }