Published
Edited
Aug 29, 2020
Also listed in…
History
Insert cell
md`# Kings, Kingdoms and Royal Dynasties of Sri Lanka`
Insert cell
{
const sunburstData = await getKingsSunburstData();
return drawSunburst(sunburstData);
}
Insert cell
md`---
### Appendix: Code`
Insert cell
d3 = require('d3@5')
Insert cell
import { drawTable } from '@nuuuwan/table-utils'
Insert cell
import { drawSunburst } from '@nuuuwan/sunburst-chart'
Insert cell
md`---`
Insert cell
function format_year(x) {
if (x < 0) {
return String(-x) + ' BC';
}
return x;
}
Insert cell
async function getKings() {
const rawData = await d3.csv(
'https://raw.githubusercontent.com/nuuuwan/misc-sl-data/master/history.wikipedia.sl_kings.csv'
);



return rawData.map((x, i) =>
Object({
order: i + 1,
name: x.name,
ascent: x.date_ascent,
descent: x.date_descent,
kingdom: x.kingdom
.replace('Kingdom of', '')
.replace('Kingdom', '')
.trim(),
dynasty: x.dynasty.replace('House of', '').trim()
})
);
}
Insert cell
getKings()
Insert cell
async function getKingsByKingdomAndDynasty() {
const kingsData = await getKings();
return kingsData.reduce(function(byKingdomAndDynasty, datum) {
const kingdom = datum.kingdom;
const dynasty = datum.dynasty;
if (!byKingdomAndDynasty[kingdom]) {
byKingdomAndDynasty[kingdom] = {};
}
if (!byKingdomAndDynasty[kingdom][dynasty]) {
byKingdomAndDynasty[kingdom][dynasty] = [];
}
byKingdomAndDynasty[kingdom][dynasty].push(
Object({
name: datum.name,
value: datum.descent - datum.ascent,
ascent: datum.ascent,
descent: datum.descent,
subName: `${format_year(datum.ascent)} - ${format_year(datum.descent)}`
})
);
return byKingdomAndDynasty;
}, {});
}
Insert cell
async function getKingsSunburstData() {
const kingdomToDynastyToKings = await getKingsByKingdomAndDynasty();
return Object({
name: 'Kings of Sri Lanka',
subName: '543 BC - 2020',
children: Object.entries(kingdomToDynastyToKings).reduce(function(
sunburstData,
[kingdom, dynastyToKings]
) {
const kingdomChildren = Object.entries(dynastyToKings).reduce(function(
kingdomChildren,
[dynasty, dynastyChildren]
) {
const ascent = Math.min(...dynastyChildren.map(x => x.ascent));
const descent = Math.max(...dynastyChildren.map(x => x.descent));

kingdomChildren.push(
Object({
name: dynasty,
children: dynastyChildren,
ascent: ascent,
descent: descent,
subName: `${format_year(ascent)} - ${format_year(descent)}`
})
);
return kingdomChildren;
},
[]);

const ascent = Math.min(...kingdomChildren.map(x => x.ascent));
const descent = Math.max(...kingdomChildren.map(x => x.descent));

sunburstData.push(
Object({
name: kingdom,
children: kingdomChildren,
ascent: ascent,
descent: descent,
subName: `${format_year(ascent)} - ${format_year(descent)}`
})
);
return sunburstData;
},
[])
});
}
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more