Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Chart.js Line-Chart with different Labels for each Dataset

Tags:

Using Chart.js you can create line charts and for that you have to privde labels and datasets. for example:

var data = {     labels: ["January", "February", "March", "April", "May", "June", "July"],     datasets: [         {             label: "My First dataset",             fill: false,             lineTension: 0.1,             backgroundColor: "rgba(75,192,192,0.4)",             borderColor: "rgba(75,192,192,1)",             borderCapStyle: 'butt',             borderDash: [],             borderDashOffset: 0.0,             borderJoinStyle: 'miter',             pointBorderColor: "rgba(75,192,192,1)",             pointBackgroundColor: "#fff",             pointBorderWidth: 1,             pointHoverRadius: 5,             pointHoverBackgroundColor: "rgba(75,192,192,1)",             pointHoverBorderColor: "rgba(220,220,220,1)",             pointHoverBorderWidth: 2,             pointRadius: 1,             pointHitRadius: 10,             data: [65, 59, 80, 81, 56, 55, 40],         }     ] }; 

The Problem here is that you have a fix amount of labels (7 in this case) and you also need to provide 7 data entries for each dataset. Now what if you have an unknown amount of labels and data entries?

What if one data entry contains a number and a time:

Entry {     number: 127     time: 10:00 } 

What if you want to show all times on the X-Axis and all Numbers on the Y-Axis sorted by the time on the X-Axis. Is that possible with Chart.js?

like image 754
Mulgard Avatar asked Jun 29 '16 13:06

Mulgard


People also ask

How do you add multiple labels in Chartjs?

Use multiple labels configuration to display 3 labels per data, one for the index , one for the label and one for the value . Move the mouse over the chart to display label ids.

What is CTX in chart js?

js convention is to call it ctx . An object literal containing the data and the configuration options that Chart. js will use to build your chart. The required properties are type and data . In our example type is 'line' because we want a line chart.

Which is better D3 or chart js?

Chart. js provides a selection of ready to go charts which can be styled and configured while D3 offers building blocks which are combined to create virtually any data visualisation.

What is the best alternative to a line chart for showing data over time?

Line charts can be a great way to show trends over time. But not always. Especially when visualising categorical data. This post has suggested six alternatives to consider: spark lines, small multiples, stacked area, ribbon chart, scatter and highlight tables.


2 Answers

I had a battle with this today too. You need to get a bit more specific with your dataset. In a line chart "datasets" is an array with each element of the array representing a line on your chart. Chart.js is actually really flexible here once you work it out. You can tie a line (a dataset element) to an x-axis and/or a y-axis, each of which you can specify in detail.

In your case if we stick with a single line on the chart and you want the "time" part of the entry to be along the bottom (the x-axis) then all your times could go into the "labels" array and your "number" would be pin-pointed on the y-axis. To keep it simple without specifying our own scales with x and y axes and given this data:

var MyData = [{time:"10:00", number: "127"},               {time:"11:00", number: "140"},               {time:"12:00", number: "135"},               {time:"13:00", number: "122"}]; 

You could set up the "data" property of your chart to be:

var data = {     labels: ["10:00", "11:00", "12:00", "13:00"],     datasets: [         {             label: "My First dataset",              // Insert styling, colors etc here              data: [{x: "10:00", y: 127},                    {x: "11:00", y: 140},                    {x: "12:00", y: 135},                    {x: "13:00", y: 122}]         }     ]}; 

Note that the data array is now a bit more specific with each element of data plotting itself on the x-axis by referencing one of the labels rather than just being a raw number. You can now put another dataset object in the datasets array following this pattern and have two lines, obviously give your lines different colours and names ("label").

Hope this helps.

like image 182
DamienB Avatar answered Sep 18 '22 14:09

DamienB


I found a really good solution here: https://github.com/chartjs/Chart.js/issues/3953

Basically, you can add in your own 'labels' property to each dataset and leverage it in the callbacks for the xAxes labels, tooltips, or whatever you like.

var ctx = $("#myChart"); var myChart = new Chart(ctx, {     type: 'doughnut',     data: {         datasets: [{             data: [1, 2, 3, 4, 5],             backgroundColor: [                 'green',                 'yellow',                 'red',                 'purple',                 'blue',             ],             labels: [                 'green',                 'yellow',                 'red',                 'purple',                 'blue',             ]         }, {             data: [6, 7, 8],             backgroundColor: [                 'black',                 'grey',                 'lightgrey'             ],             labels: [                 'black',                 'grey',                 'lightgrey'             ],         },]     },     options: {         responsive: true,         legend: {             display: false,         },         tooltips: {             callbacks: {                 label: function(tooltipItem, data) {                     var dataset = data.datasets[tooltipItem.datasetIndex];                     var index = tooltipItem.index;                     return dataset.labels[index] + ': ' + dataset.data[index];                 }             }         }     } }); 

What's important here is this piece:

        tooltips: {             callbacks: {                 label: function(tooltipItem, data) {                     var dataset = data.datasets[tooltipItem.datasetIndex];                     var index = tooltipItem.index;                     return dataset.labels[index] + ': ' + dataset.data[index];                 }             }         } 
like image 44
devaent Avatar answered Sep 18 '22 14:09

devaent