bug #62189: Fixed clipped numbers in histogram legend
[pspp] / src / output / charts / plot-hist-cairo.c
index d196b1572373ed71758f4d7edbda23b398caed56..c8f604af695e8d48c1b408de4e987da83e276b7f 100644 (file)
@@ -35,30 +35,40 @@ static void
 histogram_write_legend (cairo_t *cr, const struct xrchart_geometry *geom,
                         double n, double mean, double stddev)
 {
-  double y = geom->axis[SCALE_ORDINATE].data_min;
+  double y = geom->axis[SCALE_ORDINATE].data_max - geom->font_size;
   cairo_save (cr);
 
-  if (n != SYSMIS)
+  if (mean != SYSMIS)
     {
-      char *buf = xasprintf (_("N = %.2f"), n);
-      cairo_move_to (cr, geom->legend_left, y);
+      char *buf = xasprintf (_("Mean"));
+      cairo_move_to (cr,geom->legend_left, y);
       xrchart_label (cr, 'l', 'b', geom->font_size, buf);
-      y += geom->font_size * 1.5;
+      y -= geom->font_size * 1.5;
+      free (buf);
+      buf = xasprintf ("%g", mean);
+      cairo_move_to (cr,geom->legend_left, y);
+      xrchart_label (cr, 'l', 'b', geom->font_size, buf);
+      y -= geom->font_size * 2.0;
       free (buf);
     }
 
-  if (mean != SYSMIS)
+  if (stddev != SYSMIS)
     {
-      char *buf = xasprintf (_("Mean = %.1f"), mean);
-      cairo_move_to (cr,geom->legend_left, y);
+      char *buf = xasprintf (_("Std Dev"));
+      cairo_move_to (cr, geom->legend_left, y);
+      xrchart_label (cr, 'l', 'b', geom->font_size, buf);
+      free (buf);
+      y -= geom->font_size * 1.5;
+      buf = xasprintf ("%g", stddev);
+      cairo_move_to (cr, geom->legend_left, y);
       xrchart_label (cr, 'l', 'b', geom->font_size, buf);
-      y += geom->font_size * 1.5;
       free (buf);
+      y -= geom->font_size * 2.0;
     }
 
-  if (stddev != SYSMIS)
+  if (n != SYSMIS)
     {
-      char *buf = xasprintf (_("Std. Dev = %.2f"), stddev);
+      char *buf = xasprintf (_("N = %.0f"), n);
       cairo_move_to (cr, geom->legend_left, y);
       xrchart_label (cr, 'l', 'b', geom->font_size, buf);
       free (buf);
@@ -75,8 +85,8 @@ hist_draw_bar (cairo_t *cr, const struct xrchart_geometry *geom,
   double lower;
   double height;
 
-  assert ( 0 == gsl_histogram_get_range (h, bar, &lower, &upper));
-  assert ( upper >= lower);
+  assert (0 == gsl_histogram_get_range (h, bar, &lower, &upper));
+  assert (upper >= lower);
 
   const double x_pos =
     (lower - geom->axis[SCALE_ABSCISSA].min) * geom->axis[SCALE_ABSCISSA].scale
@@ -100,17 +110,17 @@ hist_draw_bar (cairo_t *cr, const struct xrchart_geometry *geom,
 }
 
 void
-xrchart_draw_histogram (const struct chart_item *chart_item, cairo_t *cr,
+xrchart_draw_histogram (const struct chart *chart, cairo_t *cr,
                         struct xrchart_geometry *geom)
 {
-  struct histogram_chart *h = to_histogram_chart (chart_item);
+  struct histogram_chart *h = to_histogram_chart (chart);
   int i;
   int bins;
 
   xrchart_write_title (cr, geom, _("HISTOGRAM"));
 
   xrchart_write_ylabel (cr, geom, _("Frequency"));
-  xrchart_write_xlabel (cr, geom, chart_item_get_title (chart_item));
+  xrchart_write_xlabel (cr, geom, chart_get_title (chart));
 
   if (h->gsl_hist == NULL)
     {
@@ -118,9 +128,11 @@ xrchart_draw_histogram (const struct chart_item *chart_item, cairo_t *cr,
       return;
     }
 
-  xrchart_write_yscale (cr, geom, 0, gsl_histogram_max_val (h->gsl_hist));
-  xrchart_write_xscale (cr, geom, gsl_histogram_min (h->gsl_hist),
-                       gsl_histogram_max (h->gsl_hist));
+  if (! xrchart_write_yscale (cr, geom, 0, gsl_histogram_max_val (h->gsl_hist)))
+    return;
+  if (! xrchart_write_xscale (cr, geom, gsl_histogram_min (h->gsl_hist),
+                              gsl_histogram_max (h->gsl_hist)))
+    return;
 
 
   /* Draw the ticks and compute if the rendered tick text is wider than the bin */