X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Ffrequencies.q;h=b5ad8c47793eef15064a887023eead28732c8845;hb=14e2a2db7534bfd419871984657cadfe8e846799;hp=9bc2f73e8c57603810a253490841897721a6a9d7;hpb=fe8b4cd515f1a3e91240901a4f6546c655df348f;p=pspp diff --git a/src/language/stats/frequencies.q b/src/language/stats/frequencies.q index 9bc2f73e8c..b5ad8c4779 100644 --- a/src/language/stats/frequencies.q +++ b/src/language/stats/frequencies.q @@ -43,6 +43,8 @@ #include "libpspp/str.h" #include "math/histogram.h" #include "math/moments.h" +#include "math/chart-geometry.h" + #include "output/chart-item.h" #include "output/charts/piechart.h" #include "output/charts/plot-hist.h" @@ -188,7 +190,6 @@ struct var_freqs /* Variable attributes. */ int width; - struct fmt_spec print; }; struct frq_proc @@ -498,14 +499,17 @@ postcalc (struct frq_proc *frq, const struct dataset *ds) histogram = freq_tab_to_hist (frq, &vf->tab, vf->var); - chart_item_submit (histogram_chart_create ( + if ( histogram) + { + chart_item_submit (histogram_chart_create ( histogram->gsl_hist, var_to_string(vf->var), vf->tab.valid_cases, d[FRQ_MEAN], d[FRQ_STDDEV], frq->hist->draw_normal)); - statistic_destroy (&histogram->parent); + statistic_destroy (&histogram->parent); + } } if (frq->pie) @@ -646,7 +650,6 @@ frq_custom_variables (struct lexer *lexer, struct dataset *ds, vf->n_groups = 0; vf->groups = NULL; vf->width = var_get_width (var); - vf->print = *var_get_print_format (var); } frq->n_vars = n_vars; @@ -701,7 +704,7 @@ frq_custom_grouped (struct lexer *lexer, struct dataset *ds, struct cmd_frequenc if (!lex_match (lexer, T_RPAREN)) { free (v); - msg (SE, _("`)' expected after GROUPED interval list.")); + lex_error_expecting (lexer, "`)'", NULL_SENTINEL); return 0; } } @@ -850,7 +853,7 @@ dump_freq_table (const struct var_freqs *vf, const struct variable *wv) if (label != NULL) tab_text (t, 0, r, TAB_LEFT, label); - tab_value (t, 1, r, TAB_NONE, &f->value, ft->dict, &vf->print); + tab_value (t, 1, r, TAB_NONE, &f->value, vf->var, NULL); tab_double (t, 2, r, TAB_NONE, f->count, wfmt); tab_double (t, 3, r, TAB_NONE, percent, NULL); tab_double (t, 4, r, TAB_NONE, valid_percent, NULL); @@ -867,7 +870,7 @@ dump_freq_table (const struct var_freqs *vf, const struct variable *wv) if (label != NULL) tab_text (t, 0, r, TAB_LEFT, label); - tab_value (t, 1, r, TAB_NONE, &f->value, ft->dict, &vf->print); + tab_value (t, 1, r, TAB_NONE, &f->value, vf->var, NULL); tab_double (t, 2, r, TAB_NONE, f->count, wfmt); tab_double (t, 3, r, TAB_NONE, f->count / ft->total_cases * 100.0, NULL); @@ -1116,10 +1119,9 @@ freq_tab_to_hist (const struct frq_proc *frq, const struct freq_tab *ft, { double x_min, x_max, valid_freq; int i; - + double bin_width; struct histogram *histogram; double iqr; - int bins; /* Find out the extremes of the x value, within the range to be included in the histogram, and sum the total frequency of those values. */ @@ -1139,19 +1141,13 @@ freq_tab_to_hist (const struct frq_proc *frq, const struct freq_tab *ft, /* Freedman-Diaconis' choice of bin width. */ iqr = calculate_iqr (frq); - if (iqr != SYSMIS) - { - double bin_width = 2 * iqr / pow (valid_freq, 1.0 / 3.0); - bins = (x_max - x_min) / bin_width; - if (bins < 5) - bins = 5; - else if (bins > 400) - bins = 400; - } - else - bins = 5; + bin_width = 2 * iqr / pow (valid_freq, 1.0 / 3.0); + + histogram = histogram_create (bin_width, x_min, x_max); + + if ( histogram == NULL) + return NULL; - histogram = histogram_create (bins, x_min, x_max); for (i = 0; i < ft->n_valid; i++) { const struct freq *f = &ft->valid[i];