PAD Charts
All charts/Distributions

Exam scores per class

violin: the shape of each class, quartiles and median inside - a split class shows its two humps.

1 The data distribution/scores.php php
<?php

  // The exam scores of four classes of 30, from a fixed seed: a strong class, a weak one,
  // one with a wide spread and one split in two - shapes a box plot would draw alike.

  mt_srand ( 23 );

  $bell = fn ( $mean, $sd ) => $mean + $sd * sqrt ( -2 * log ( max ( 1e-9, mt_rand () / mt_getrandmax () ) ) ) * cos ( 2 * M_PI * mt_rand () / mt_getrandmax () );

  $classes = [ '3A' => fn ( $i ) => $bell ( 78, 7 ),
               '3B' => fn ( $i ) => $bell ( 61, 8 ),
               '3C' => fn ( $i ) => $bell ( 68, 15 ),
               '3D' => fn ( $i ) => $i % 2 ? $bell ( 52, 6 ) : $bell ( 84, 6 ) ];

  $scores = [];

  foreach ( $classes as $class => $score )
    for ( $i = 0; $i < 30; $i++ )
      $scores [] = [ 'class' => $class, 'score' => max ( 10, min ( 100, round ( $score ( $i ) ) ) ) ];

?>
2 The chart tag distribution/scores.pad pad
{chart 'violin', data='scores', label='class', value='score', title='Exam scores per class, out of 100', width=640, height=360}
3 The result inline SVG · no JavaScript
Exam scores per class, out of 100 3A: 30 values, median 79, quartiles 70.5 – 81, range 64 – 92; 3B: 30 values, median 64.5, quartiles 59 – 67.5, range 45 – 77; 3C: 30 values, median 64, quartiles 55.25 – 78, range 36 – 94; 3D: 30 values, median 71, quartiles 52 – 81.5, range 44 – 95 20 40 60 80 100 3A: 30 values, median 79, quartiles 70.5 – 81, range 64 – 92 3A: quartiles 70.5 – 81 3A: median 79 3A 3B: 30 values, median 64.5, quartiles 59 – 67.5, range 45 – 77 3B: quartiles 59 – 67.5 3B: median 64.5 3B 3C: 30 values, median 64, quartiles 55.25 – 78, range 36 – 94 3C: quartiles 55.25 – 78 3C: median 64 3C 3D: 30 values, median 71, quartiles 52 – 81.5, range 44 – 95 3D: quartiles 52 – 81.5 3D: median 71 3D