Bell curve
by Umair Rafiq
HTML
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/histogram-bellcurve.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script src="https://code.highcharts.com/modules/export-data.js"></script>
<script src="https://code.highcharts.com/modules/accessibility.js"></script>
<figure class="highcharts-figure">
<div id="container"></div>
</figure>
CSS
#container {
height: 400px;
}
.highcharts-figure,
.highcharts-data-table table {
min-width: 310px;
max-width: 800px;
margin: 1em auto;
}
.highcharts-data-table table {
font-family: Verdana, sans-serif;
border-collapse: collapse;
border: 1px solid #ebebeb;
margin: 10px auto;
text-align: center;
width: 100%;
max-width: 500px;
}
.highcharts-data-table caption {
padding: 1em 0;
font-size: 1.2em;
color: #555;
}
.highcharts-data-table th {
font-weight: 600;
padding: 0.5em;
}
.highcharts-data-table td,
.highcharts-data-table th,
.highcharts-data-table caption {
padding: 0.5em;
}
.highcharts-data-table thead tr,
.highcharts-data-table tr:nth-child(even) {
background: #f8f8f8;
}
.highcharts-data-table tr:hover {
background: #f1f7ff;
}
JavaScript
function randomList(n, a, b) {
// create a list of n numbers between a and b
var list = [],
i;
for (i = 0; i < n; i++) {
list[i] = Math.random() * (b - a) + a;
}
return list;
}
function descriptives(list) {
// compute mean, sd and the interval range: [min, max]
var mean,
sd,
i,
len = list.length,
sum,
a = Infinity,
b = -a;
for (sum = i = 0; i < len; i++) {
sum += list[i];
a = Math.min(a, list[i]);
b = Math.max(b, list[i]);
}
mean = sum / len;
for (sum = i = 0; i < len; i++) {
sum += (list[i] - mean) * (list[i] - mean);
}
sd = Math.sqrt(sum / (len - 1));
return {
mean: mean,
sd: sd,
range: [a, b]
};
}
function forceDescriptives(list, mean, sd) {
// transfom a list to have an exact mean and sd
var oldDescriptives = descriptives(list),
oldMean = oldDescriptives.mean,
oldSD = oldDescriptives.sd,
newList = [],
len = list.length,
i;
for (i = 0; i < len; i++) {
newList[i] = sd * (list[i] - oldMean) / oldSD + mean;
}
return newList;
}
// Set your mean, deviation, and volatility values
const mean = 2.0483; // Mean value
const deviation = 0.858; // Standard deviation
const pointsInInterval = 5;
const sscore = -3.5355;
const sdelta = -0.0136;
const s = (sscore * deviation) + mean;
const sd = ((sscore + sdelta) * deviation) + mean;
// create a list of 5 random numbers between 1 and 10
var list = randomList(100, -10 + mean , 10 + mean);
//list[100] = s;
// transform the list to have an exact mean of 5 and sd of 2
var newList = forceDescriptives(list, mean, deviation);
const labels = ['-4σ', '-3σ', '-2σ', '-1σ', 'μ', '1σ', '2σ', '3', '4'];
const labelsS = [(-4 * deviation).toString(), (-3*deviation).toString(), (-2*deviation).toString(), (-1*deviation).toString(), mean.toString() , (deviation).toString(), (2*deviation).toString(), (3*deviation).toString(), (4*deviation).toString()];
const fakedata =...