X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Ffrequencies.q;h=b5ad8c47793eef15064a887023eead28732c8845;hb=80788c833f111c2e9aef3e25bdb44d6a56423313;hp=ef4b7f9589d3a770fc9650a1a93b5581e9a2e33e;hpb=9ade26c8349b4434008c46cf09bc7473ec743972;p=pspp diff --git a/src/language/stats/frequencies.q b/src/language/stats/frequencies.q index ef4b7f9589..b5ad8c4779 100644 --- a/src/language/stats/frequencies.q +++ b/src/language/stats/frequencies.q @@ -23,9 +23,9 @@ #include "data/case.h" #include "data/casegrouper.h" #include "data/casereader.h" +#include "data/dataset.h" #include "data/dictionary.h" #include "data/format.h" -#include "data/procedure.h" #include "data/settings.h" #include "data/value-labels.h" #include "data/variable.h" @@ -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); @@ -1047,7 +1050,7 @@ dump_statistics (const struct frq_proc *frq, const struct var_freqs *vf, tab_double (t, 2, 0, TAB_NONE, ft->valid_cases, wfmt); tab_double (t, 2, 1, TAB_NONE, ft->total_cases - ft->valid_cases, wfmt); - for (i = 0; i < frq->n_percentiles; i++, r++) + for (i = 0; i < frq->n_percentiles; i++) { struct percentile *pc = &frq->percentiles[i]; @@ -1065,6 +1068,7 @@ dump_statistics (const struct frq_proc *frq, const struct var_freqs *vf, tab_fixed (t, 1, r, TAB_LEFT, pc->p * 100, 3, 0); tab_double (t, 2, r, TAB_NONE, pc->value, var_get_print_format (vf->var)); + r++; } tab_title (t, "%s", var_to_string (vf->var)); @@ -1115,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. */ @@ -1138,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];