|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 2535 (0x9e7)
Types: TextFile
Names: »barplot.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/stat-5.3/eu/stat/src/barplot.c«
/* Copyright 1982 Gary Perlman */
/*LINTLIBRARY*/
#include "stat.h"
FUN(barplot,horizontal histogram,5.0,1985)
#define EPSILON (.000000001)
#define scale(x,minx,maxx,width) ((int) (width*((x)-(minx))/((maxx)-(minx)+EPSILON)))
meanplot (mean, sd, minx, maxx, width)
double mean;
double sd;
double minx;
double maxx;
{
char line[BUFSIZ];
int ii;
for (ii = 0; ii < width; ii++)
line[ii] = '-';
line[width] = '\0';
line[scale (mean, minx, maxx, width)] = '|';
line[scale (mean+sd, minx, maxx, width)] = '+';
line[scale (mean-sd, minx, maxx, width)] = '+';
puts (line);
}
barplot (vec, n, style, axes, donum, width, base, interval)
float *vec;
double base;
double interval;
{
int elt;
double sum = 0.0;
double ss = 0.0;
double minx = *vec;
double maxx = *vec;
double mean;
double sd;
int w;
int midwidth;
for (elt = 0; elt < n; elt++)
{
sum += vec[elt];
ss += vec[elt] * vec[elt];
if (vec[elt] < minx) minx = vec[elt];
if (vec[elt] > maxx) maxx = vec[elt];
}
mean = sum/n;
sd = n <= 1 ? 0.0 : sqrt ((ss-sum*sum/n)/(n-1));
midwidth = scale (mean, minx, maxx, width);
if (axes)
{
nlabel (-1, donum, base, interval);
meanplot (mean, sd, minx, maxx, width);
}
for (elt = 0; elt < n; elt++)
{
w = scale (vec[elt], minx, maxx, width);
nlabel (elt, donum, base, interval);
barline (w, midwidth, style);
}
if (axes)
{
nlabel (-1, donum, base, interval);
meanplot (mean, sd, minx, maxx, width);
nlabel (-1, donum, base, interval);
numline (minx, maxx, width);
}
}
barline (n, mid, style)
{
switch (style)
{
case 2:
if (n < mid)
{
repeat ('-', n);
}
else if (n == mid)
{
repeat ('-', n);
repeat ('+', 1);
}
else
{
repeat ('-', mid);
repeat ('|', 1);
repeat ('-', n-mid);
}
break;
default:
if (n < mid)
{
repeat (' ', n);
repeat ('-', mid-n);
repeat ('|', 1);
}
else if (n == mid)
{
repeat (' ', n);
repeat ('+', 1);
}
else
{
repeat (' ', mid);
repeat ('|', 1);
repeat ('-', n-mid);
}
break;
}
putchar ('\n');
}
repeat (c, n)
{
while (n-- > 0)
putchar (c);
}
nlabel (n, donum, base, interval)
int n; /* label number */
int donum; /* should numbering be done? */
double base; /* the base label to be numbered */
double interval; /* the size of the interval between labels */
{
if (!donum) return;
if ((n >= 0) && ((n%donum) == 0))
printf ("%12.4f ", n*interval + base);
else
printf ("%12s ", "");
}