Skip to content

Instantly share code, notes, and snippets.

@4mitch
Forked from vasturiano/.block
Created March 1, 2021 09:15
Show Gist options
  • Save 4mitch/fffdfa116aad11e80dc4a9b15cb2e37f to your computer and use it in GitHub Desktop.
Save 4mitch/fffdfa116aad11e80dc4a9b15cb2e37f to your computer and use it in GitHub Desktop.
Timelines Chart
height: 700
scrolling: yes

A parallel timelines layout (swimlanes) for representing state of time-series over time. Using the timelines-chart D3 component.

Each timeline segment can be assigned a value from a color scale, either continuous (heatmap mode) or ordinal (for categorical representation). Time-series can be grouped into logical groups, represented as distinct sections. Explore the data by zooming (drag) or using the timeline brush at the bottom.

Example is populated with randomly generated data.

<head>
<script src="//unpkg.com/timelines-chart@2"></script>
<script src="random-data.js"></script>
</head>
<body>
<div id="myPlot"></div>
<script>
TimelinesChart()
.data(getRandomData(true))
.zQualitative(true)
(document.getElementById('myPlot'));
</script>
</body>
function getRandomData(ordinal = false) {
const NGROUPS = 6,
MAXLINES = 15,
MAXSEGMENTS = 20,
MAXCATEGORIES = 20,
MINTIME = new Date(2013,2,21);
const nCategories = Math.ceil(Math.random()*MAXCATEGORIES),
categoryLabels = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
return [...Array(NGROUPS).keys()].map(i => ({
group: 'group' + (i+1),
data: getGroupData()
}));
//
function getGroupData() {
return [...Array(Math.ceil(Math.random()*MAXLINES)).keys()].map(i => ({
label: 'label' + (i+1),
data: getSegmentsData()
}));
//
function getSegmentsData() {
const nSegments = Math.ceil(Math.random()*MAXSEGMENTS),
segMaxLength = Math.round(((new Date())-MINTIME)/nSegments);
let runLength = MINTIME;
return [...Array(nSegments).keys()].map(i => {
const tDivide = [Math.random(), Math.random()].sort(),
start = new Date(runLength.getTime() + tDivide[0]*segMaxLength),
end = new Date(runLength.getTime() + tDivide[1]*segMaxLength);
runLength = new Date(runLength.getTime() + segMaxLength);
return {
timeRange: [start, end],
val: ordinal ? categoryLabels[Math.ceil(Math.random()*nCategories)] : Math.random()
//labelVal: is optional - only displayed in the labels
};
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment