I am trying to develop a stacked bar graph based on time series data. The data is representing the running of a machine logged to Influx.
Looking about I have not seen this done and cannot seem to get my data to line up correctly to make the stacked bar chart. Essentially I want to show one color for running and one for not running. This isn’t an issue as this can be changed programmatically.
However, the issue I seem to be facing is possible more of a configuration issue. I would expect the time series adaptor to automatically align my data up with how it would correspond in my dataset.
See my example so far. To clarify, I am using the latest Chart.js at time of writing 3.7
const data = {
labels: ["Label 1"],
datasets: [{
label: "Testing",
data: [{
x: moment().valueOf(),
y: moment().valueOf()
}],
backgroundColor: "red"
},
{
label: "Testing",
data: [{
x: moment().add(1, 'day').valueOf(),
y: moment().add(1, 'day').valueOf()
}],
backgroundColor: "blue"
}]
};
const config = {
type: 'bar',
data,
options: {
indexAxis: 'y',
scales: {
x: {
ticks: {
beginAtZero: true
},
stacked: true,
type: 'time',
time: {
unit: 'day',
unitStepSize: 6
}
},
y: {
stacked: true
}
}
}
};
new Chart("myChart", config)
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.0/chart.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@^2"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment@^1"></script>
<canvas id="myChart"></canvas>
Any point in the correct direction would be most beneficial. I will also answer any queries to clarify my though process on the config also.
Advertisement
Answer
The problem is that Date
represents milliseconds since 1 January 1970 UTC. Therefore you need to define the start date to see only the period of interest. This can be done by adding the min
option to the x-axis as follows:
min: moment().startOf('day').subtract(1, 'day')
You should also use
moment().startOf('day')
when defining yourdata
. That way, the ticks on the x-axis will be correctly positioned.
Please take a look at your amended code below and see how it works.
const data = {
datasets: [{
label: "Testing",
data: [{
x: moment().startOf('day'),
y: 0
}],
backgroundColor: "red"
},
{
label: "Testing",
data: [{
x: moment().startOf('day').add(1, 'day'),
y: 0
}],
backgroundColor: "blue"
}
]
};
const config = {
type: 'bar',
data,
options: {
plugins: {
tooltip: {
callbacks: {
title: () => ''
}
}
},
indexAxis: 'y',
scales: {
x: {
stacked: true,
type: 'time',
time: {
unit: 'day'
},
min: moment().startOf('day').subtract(1, 'day')
},
y: {
stacked: true
}
}
}
};
new Chart("myChart", config)
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.0/chart.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@^2"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-moment@^1"></script>
<canvas id="myChart" height="90"></canvas>