X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Ffrequencies.q;h=b5ad8c47793eef15064a887023eead28732c8845;hb=dc3765ea5122dfc403a39b08b8f61cc1a6c89d05;hp=01247f518cdff07bea16ff1de5d24e14b1777a0b;hpb=fe8dc2171009e90d2335f159d05f7e6660e24780;p=pspp diff --git a/src/language/stats/frequencies.q b/src/language/stats/frequencies.q index 01247f518c..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" @@ -497,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) @@ -699,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; } } @@ -1114,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. */ @@ -1137,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];