Added an optional --without-libplot flag to configure
[pspp-builds.git] / src / frequencies.q
index 1484776acb9b40ab4ea983d3c61eb12c2293f753..b5da79bde62b83545e563e5bbd0fde8a5bde8171 100644 (file)
@@ -279,7 +279,9 @@ static hsh_compare_func compare_freq_numeric_d, compare_freq_alpha_d;
 static void do_piechart(const struct variable *var,
                        const struct freq_tab *frq_tab);
 
-void freq_tab_to_hist(const struct freq_tab *ft, gsl_histogram *hist);
+gsl_histogram * 
+freq_tab_to_hist(const struct freq_tab *ft, const struct variable *var);
+
 
 \f
 /* Parser and outline. */
@@ -625,20 +627,21 @@ postcalc (void *aux UNUSED)
        dump_statistics (v, !dumped_freq_tab);
 
 
+#ifndef NO_CHARTS
       if ( chart == GFT_HIST) 
        {
          double d[frq_n_stats];
          struct normal_curve norm;
+         gsl_histogram *hist ;
 
-         gsl_histogram *hist = gsl_histogram_alloc(7);
 
-         norm.N = vf->tab.total_cases;
+         norm.N = vf->tab.valid_cases;
 
          calc_stats(v,d);
          norm.mean = d[frq_mean];
          norm.stddev = d[frq_stddev];
 
-         freq_tab_to_hist(ft, hist);
+         hist = freq_tab_to_hist(ft,v);
 
          histogram_plot(hist, var_to_string(v), &norm, normal);
 
@@ -650,6 +653,7 @@ postcalc (void *aux UNUSED)
        {
          do_piechart(v_variables[i], ft);
        }
+#endif
 
 
       cleanup_freq_tab (v);
@@ -1537,33 +1541,32 @@ dump_statistics (struct variable *v, int show_varname)
 }
 
 
-
-/* Populate a gsl_histogram from a freq_tab */
-void
-freq_tab_to_hist(const struct freq_tab *ft, gsl_histogram *hist)
+/* Create a gsl_histogram from a freq_tab */
+gsl_histogram *
+freq_tab_to_hist(const struct freq_tab *ft, const struct variable *var)
 {
   int i;
   double x_min = DBL_MAX;
   double x_max = -DBL_MAX;
-  
+
+  gsl_histogram *hist;
+  const double bins = 11;
+
   struct hsh_iterator hi;
   struct hsh_table *fh = ft->data;
   struct freq *frq;
 
-  gsl_histogram_reset(hist);
-
   /* Find out the extremes of the x value */
-
-  for ( frq = hsh_first(fh, &hi); 
-       frq != 0; 
-       frq = hsh_next(fh, &hi) ) 
+  for ( frq = hsh_first(fh, &hi); frq != 0; frq = hsh_next(fh, &hi) ) 
     {
+      if ( is_missing(&frq->v, var))
+       continue;
+
       if ( frq->v.f < x_min ) x_min = frq->v.f ;
       if ( frq->v.f > x_max ) x_max = frq->v.f ;
     }
 
-
-  gsl_histogram_set_ranges_uniform(hist, x_min, x_max);
+  hist = histogram_create(bins, x_min, x_max);
 
   for( i = 0 ; i < ft->n_valid ; ++i ) 
     {
@@ -1571,8 +1574,10 @@ freq_tab_to_hist(const struct freq_tab *ft, gsl_histogram *hist)
       gsl_histogram_accumulate(hist, frq->v.f, frq->c);
     }
 
+  return hist;
 }
 
+
 static struct slice *
 freq_tab_to_slice_array(const struct freq_tab *frq_tab, 
                        const struct variable *var,
@@ -1602,15 +1607,14 @@ freq_tab_to_slice_array(const struct freq_tab *frq_tab,
       slices[i].label = value_to_string(&frq->v, var);
 
       slices[i].magnetude = frq->c;
-
     }
 
-
   return slices;
 }
 
 
 
+#ifndef NO_CHARTS
 static void
 do_piechart(const struct variable *var, const struct freq_tab *frq_tab)
 {
@@ -1622,10 +1626,8 @@ do_piechart(const struct variable *var, const struct freq_tab *frq_tab)
   piechart_plot(var_to_string(var), slices, n_slices);
 
   free(slices);
-  
 }
-
-
+#endif
 
 /* 
    Local Variables: