Skip to content

Instantly share code, notes, and snippets.

@matsuby
Created November 29, 2018 09:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matsuby/28cc116a46326005dc29d5806098b80f to your computer and use it in GitHub Desktop.
Save matsuby/28cc116a46326005dc29d5806098b80f to your computer and use it in GitHub Desktop.
JavaScript calculation pie chart values.
{
const calcPieChartValues = (values, numDegits = null) => {
const totalValue = values.reduce((a, c) => a + c);
const deg2rad = (deg) => deg * Math.PI / 180;
return values.map((value, i) => {
const data = {};
data.index = i;
data.value = value;
data.rate = value / totalValue;
data.percent = value / totalValue * 100;
// degrees
data.angle_deg = 360 * value / totalValue;
data.strat_deg = values.slice(0, i).reduce((a, c) => a + 360 * c / totalValue, 0);
data.mid_deg = data.strat_deg + data.angle_deg / 2;
data.end_deg = data.strat_deg + data.angle_deg;
// radian
data.angle_rad = deg2rad(data.angle_deg);
data.start_rad = deg2rad(data.strat_deg);
data.mid_rad = deg2rad(data.mid_deg);
data.end_rad = deg2rad(data.end_deg);
// other info
data.quadrant = Math.floor(data.mid_deg / 90) + 1;
if (typeof numDegits === "number" && numDegits >= 0) {
tmpMultiple = 10 ** numDegits;
for (key in data) {
if (key === "value" || key === "quadrant") continue;
data[key] = Math.round(data[key] * tmpMultiple) / tmpMultiple;
}
}
return data;
});
};
const testData = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
console.log(JSON.stringify(calcPieChartValues(testData, 4), null, 2));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment