X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcharts%2Fbox-whisker.c;h=8bcad4947eee31d63e09264daf960e0d0f8a1008;hb=44dab63eeb3b50a9939d58005e63b2bfae0f846f;hp=8c0160dfa1ae6a21f7742fa6bf204aa664a671ae;hpb=a19b858e0ac3c69e4a28c0ca6d8674427268a863;p=pspp-builds.git diff --git a/src/output/charts/box-whisker.c b/src/output/charts/box-whisker.c index 8c0160df..8bcad494 100644 --- a/src/output/charts/box-whisker.c +++ b/src/output/charts/box-whisker.c @@ -1,23 +1,22 @@ -/* PSPP - computes sample statistics. - Copyright (C) 2004 Free Software Foundation, Inc. - Written by John Darrington +/* PSPP - a program for statistical analysis. + Copyright (C) 2004, 2009 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program. If not, see . */ +#include + #include #include #include @@ -41,16 +40,16 @@ * If EXTREME is non zero, then consider it to be an extreme * value */ -void -draw_outlier(struct chart *ch, double centreline, - struct weighted_value **wvp, +void +draw_outlier(struct chart *ch, double centreline, + struct weighted_value **wvp, int idx, short extreme); -void -draw_outlier(struct chart *ch, double centreline, - struct weighted_value **wvp, +void +draw_outlier(struct chart *ch, double centreline, + struct weighted_value **wvp, int idx, short extreme ) @@ -62,7 +61,7 @@ draw_outlier(struct chart *ch, double centreline, pl_fmarker_r(ch->lp, centreline, - ch->data_bottom + + ch->data_bottom + (wvp[idx]->v.f - ch->y_min ) * ch->ordinate_scale, extreme?MARKER_STAR:MARKER_CIRCLE, 20); @@ -70,15 +69,15 @@ draw_outlier(struct chart *ch, double centreline, pl_moverel_r(ch->lp, 10,0); snprintf(label, 10, "%d", wvp[idx]->case_nos->num); - + pl_alabel_r(ch->lp, 'l', 'c', label); } -void +void boxplot_draw_boxplot(struct chart *ch, - double box_centre, + double box_centre, double box_width, struct metrics *m, const char *name) @@ -98,40 +97,40 @@ boxplot_draw_boxplot(struct chart *ch, const double box_right = box_centre + box_width / 2.0; - const double box_bottom = + const double box_bottom = ch->data_bottom + ( hinge[0] - ch->y_min ) * ch->ordinate_scale; - const double box_top = + const double box_top = ch->data_bottom + ( hinge[2] - ch->y_min ) * ch->ordinate_scale; assert(m); /* Can't really draw a boxplot if there's no data */ - if ( n_data == 0 ) + if ( n_data == 0 ) return ; whisker[1] = hinge[2]; whisker[0] = wvp[0]->v.f; - for ( i = 0 ; i < n_data ; ++i ) + for ( i = 0 ; i < n_data ; ++i ) { - if ( hinge[2] + step > wvp[i]->v.f) + if ( hinge[2] + step > wvp[i]->v.f) whisker[1] = wvp[i]->v.f; - if ( hinge[0] - step > wvp[i]->v.f) + if ( hinge[0] - step > wvp[i]->v.f) whisker[0] = wvp[i]->v.f; - + } - + { - const double bottom_whisker = + const double bottom_whisker = ch->data_bottom + ( whisker[0] - ch->y_min ) * ch->ordinate_scale; - const double top_whisker = + const double top_whisker = ch->data_bottom + ( whisker[1] - ch->y_min ) * ch->ordinate_scale; - + pl_savestate_r(ch->lp); @@ -139,7 +138,7 @@ boxplot_draw_boxplot(struct chart *ch, pl_savestate_r(ch->lp); pl_fillcolorname_r(ch->lp,ch->fill_colour); pl_filltype_r(ch->lp,1); - pl_fbox_r(ch->lp, + pl_fbox_r(ch->lp, box_left, box_bottom, box_right, @@ -148,63 +147,63 @@ boxplot_draw_boxplot(struct chart *ch, pl_restorestate_r(ch->lp); - + /* Draw the median */ pl_savestate_r(ch->lp); pl_linewidth_r(ch->lp,5); - pl_fline_r(ch->lp, - box_left, + pl_fline_r(ch->lp, + box_left, ch->data_bottom + ( hinge[1] - ch->y_min ) * ch->ordinate_scale, - box_right, + box_right, ch->data_bottom + ( hinge[1] - ch->y_min ) * ch->ordinate_scale); pl_restorestate_r(ch->lp); /* Draw the bottom whisker */ - pl_fline_r(ch->lp, - box_left, + pl_fline_r(ch->lp, + box_left, bottom_whisker, - box_right, + box_right, bottom_whisker); /* Draw top whisker */ - pl_fline_r(ch->lp, - box_left, + pl_fline_r(ch->lp, + box_left, top_whisker, - box_right, + box_right, top_whisker); /* Draw centre line. (bottom half) */ - pl_fline_r(ch->lp, + pl_fline_r(ch->lp, box_centre, bottom_whisker, box_centre, box_bottom); /* (top half) */ - pl_fline_r(ch->lp, + pl_fline_r(ch->lp, box_centre, top_whisker, box_centre, box_top); } /* Draw outliers */ - for ( i = 0 ; i < n_data ; ++i ) + for ( i = 0 ; i < n_data ; ++i ) { - if ( wvp[i]->v.f >= hinge[2] + step ) - draw_outlier(ch, box_centre, wvp, i, - ( wvp[i]->v.f > hinge[2] + 2 * step ) + if ( wvp[i]->v.f >= hinge[2] + step ) + draw_outlier(ch, box_centre, wvp, i, + ( wvp[i]->v.f > hinge[2] + 2 * step ) ); - if ( wvp[i]->v.f <= hinge[0] - step ) - draw_outlier(ch, box_centre, wvp, i, + if ( wvp[i]->v.f <= hinge[0] - step ) + draw_outlier(ch, box_centre, wvp, i, ( wvp[i]->v.f < hinge[0] - 2 * step ) ); } /* Draw tick mark on x axis */ - draw_tick(ch, TICK_ABSCISSA, box_centre - ch->data_left, name); + draw_tick(ch, TICK_ABSCISSA, box_centre - ch->data_left, "%s", name); pl_restorestate_r(ch->lp); @@ -218,7 +217,7 @@ boxplot_draw_yscale(struct chart *ch , double y_max, double y_min) double y_tick; double d; - if ( !ch ) + if ( !ch ) return ; ch->y_max = y_max; @@ -227,15 +226,15 @@ boxplot_draw_yscale(struct chart *ch , double y_max, double y_min) y_tick = chart_rounded_tick(fabs(ch->y_max - ch->y_min) / 5.0); ch->y_min = (ceil( ch->y_min / y_tick ) - 1.0 ) * y_tick; - + ch->y_max = ( floor( ch->y_max / y_tick ) + 1.0 ) * y_tick; - ch->ordinate_scale = fabs(ch->data_top - ch->data_bottom) + ch->ordinate_scale = fabs(ch->data_top - ch->data_bottom) / fabs(ch->y_max - ch->y_min) ; /* Move to data bottom-left */ - pl_move_r(ch->lp, + pl_move_r(ch->lp, ch->data_left, ch->data_bottom); for ( d = ch->y_min; d <= ch->y_max ; d += y_tick )