4
votes

I need to draw a chart with 2 lines using Chart.js.
Each of this line has a different label set.
i.e. Chart 1:

1 -> 2  
2 -> 4   
3 -> 8  
4 -> 16

Chart 2:

1 -> 3  
3 -> 4  
4 -> 6  
6 -> 9

This following sample obviously does not work as it uses the labels from chart1. But is it possible to realize this with Chart.js?

    var config = {
        type: 'line',
        data: {
            labels: [1,2,3,4,5],
            datasets: [{
                label: 'Chart 1',
                data: [2,4,8,16],
            }, {
                label: 'Chart 2',
                data: [3,4,6,9],
            }]
        },

Other charting libs offers a (label/data) set as parameter so I could simply give a tupel as parameter
(ie. [(1->2),(2->4),(3->8)...]
for each chart and the lib will match everything.

Thanks

Edit: Detailed sample as requested:

var config = {
  type: 'line',
  data: {
    labels: [1, 2, 3, 4, 5],
    datasets: [{
      label: 'Chart 1',
      data: [2, 4, 8, 16],
    }, {
      label: 'Chart 2',
      data: [3, 4, 6, 9],
    }]
  },
  options: {
    spanGaps: true,
    responsive: true,
    title: {
      display: true,
      text: 'Chart.js Line Chart'
    },
    tooltips: {
      mode: 'index',
      intersect: false,
    },
    hover: {
      mode: 'nearest',
      intersect: true
    },
    scales: {
      xAxes: [{
        display: true,
        scaleLabel: {
          display: true,
          labelString: 'Labels'
        }
      }],
      yAxes: [{
        display: true,
        scaleLabel: {
          display: true,
          labelString: 'Values'
        },
        ticks: {
          min: 1,
          max: 10,

        }
      }]
    }
  }
};

window.onload = function() {
  var ctx = document.getElementById('canvas').getContext('2d');
  window.myLine = new Chart(ctx, config);
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js"></script>

<div style="width:90%;" class="container">
  <canvas id="canvas"></canvas><br>
</div>
2
Please provide a working example. Have you seen the exampe about multiaxis in ChartJS?andreas
I've added a complete html sample. As mentioned, this chart does not represent the required data as it uses the same labels. Multiaxes sample shows a sample for multi-Y axis but not multi data on X axisMike Nathas
@MikeNathas, have you seen my answer?beaver

2 Answers

10
votes

Use scatter type chart and showLine: true instead of line type with labels:

var ctx = document.getElementById("myChart");

var myChart = new Chart(ctx, {
  type: 'scatter',
  data: {
    datasets: [
    	{
        label: 'Chart 1',
        data: [{x: 1, y: 2}, {x: 2, y: 4}, {x: 3, y: 8},{x: 4, y: 16}],
        showLine: true,
        fill: false,
        borderColor: 'rgba(0, 200, 0, 1)'
    	},
      {
        label: 'Chart 2',
        data: [{x: 1, y: 3}, {x: 3, y: 4}, {x: 4, y: 6}, {x: 6, y: 9}],
        showLine: true,
        fill: false,
        borderColor: 'rgba(200, 0, 0, 1)'
    	}
    ]
  },
  options: {
    tooltips: {
      mode: 'index',
      intersect: false,
    },
    hover: {
      mode: 'nearest',
      intersect: true
    },
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero:true
        }
      }]
    },
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
<canvas id="myChart"></canvas>
0
votes

What this code does is, it displays multi line graph using chart.js

Create a class for your labeling x and y values

//DataContract for Serializing Data - required to serve in JSON format

[DataContract]
public class LabelPoint
{
    //Explicitly setting the name to be used while serializing to JSON.
    [DataMember(Name = "label")]
    public string Label { get; set; }

    public DataPoint DataPoint { get; set; }
}
[DataContract]
public class DataPoint
{
    [DataMember(Name = "x")]
    public List<string> X { get; set; }

    //Explicitly setting the name to be used while serializing to JSON.
    [DataMember(Name = "y")]
    public List<string> Y { get; set; }


}

Controller code to retrieve data

  List<LabelPoint> dataPoints = GetProducts.ToList()
             .GroupBy(p => p.ProductName,
            (k, c) => new LabelPoint()
            {
                DataPoint = new DataPoint { X = c.Select(y => y.Date.ToString("dd/MM/yyyy HH:mm")).ToList(), Y = c.Select(cs => cs.Quantity).ToList() },
                Label = k
            }
           ).ToList();

        ViewBag.DataPoints = dataPoints;

cshtml code to display chart and retrieve data

<canvas id="myChart"></canvas>




<script>
    $(document).ready(function () {
        // Get the data from the controller using viewbag
        // so the data looks something like this   [ { Label : "ABC" , DataPoint :[ { X: '222' , Y :60 } ] } ]
        var data = @Html.Raw(Json.Encode(ViewBag.DataPoints));
        // declare empty array
        var dataSet = [];  var qty= []; var dates= [];
        // loop through the data and get the Label as well as get the created dates and qty for the array of object
        for (var i = 0; i < data.length; i++) {

            qty.push(data[i].DataPoint.Y);
            for (var d = 0; d < data[i].DataPoint.X.length; d++) {
                // we're setting this on the X- axis as the  label so we need to make sure that we get all the dates between searched dates
                dates.push(data[i].DataPoint.X[d]);
            }
             // we create an array of object, set the Lable which will display LocationName, The data here is the Quantity
                dataSet.push(
                {
                    label: data[i].Label,
                    data: data[i].DataPoint.Y,
                    fill: false,
                    borderColor: poolColors(qtyInLocations.length),
                    pointBorderColor: "black",
                    pointBackgroundColor: "white",
                    lineTension: 0.1
                }
            );  
        }
        // this is the options to set the Actual label like Date And Quantity
        var options = {
            scales: {
                 xAxes: [{
                 scaleLabel: {
                 display: true,
                 labelString: "Date",
                 fontSize: 20
                  },
                  }],

            yAxes: [{
                ticks: {
                    beginAtZero:true
                },
                scaleLabel: {
                     display: true,
                     labelString: 'Quantity',
                     fontSize: 20
                 }
            }]
            }
        };
        // we need to remove all duplicate values from the CreatedDate array
        var uniq = [ ...new Set(dates) ];
        // get the canvas
        var ctx = document.getElementById("myChart").getContext('2d');
        // build the chart 
        var myChart = new Chart(ctx, {
            type: 'line',
            data: {
                labels: uniq,
                datasets:dataSet
            },
             options: options
        });

    });

    /// will get get random colors each time
    function dynamicColors() {
    var r = Math.floor(Math.random() * 255);
    var g = Math.floor(Math.random() * 255);
    var b = Math.floor(Math.random() * 255);
    return "rgba(" + r + "," + g + "," + b + ", 0.5)";
    }

    /// will display random colors each time
    function poolColors(a) {
    var pool = [];
    for(i = 0; i < a; i++) {
        pool.push(dynamicColors());
    }
    return pool;
}

</script>