Chart.js-使用多个标签显示多个折线图

Chart.js-使用多个标签显示多个折线图,chart.js,labels,linechart,Chart.js,Labels,Linechart,我需要使用chart.js绘制一个有两条线的图表。 每一行都有不同的标签集。 即 图1: 1 -> 2 2 -> 4 3 -> 8 4 -> 16 图2: 1 -> 3 3 -> 4 4 -> 6 6 -> 9 以下示例显然不起作用,因为它使用了图表1中的标签。但是有可能通过Chart.js实现这一点吗 var config = { type: 'line', data: {

我需要使用chart.js绘制一个有两条线的图表。
每一行都有不同的标签集。
即 图1:

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

1 -> 3  
3 -> 4  
4 -> 6  
6 -> 9
以下示例显然不起作用,因为它使用了图表1中的标签。但是有可能通过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],
            }]
        },
其他图表库提供了一个(标签/数据)集作为参数,因此我可以简单地给出一个元组作为参数
(即[(1->2)、(2->4)、(3->8)…]
对于每个图表和库,都将匹配所有内容

谢谢

编辑:按要求提供详细样本:

var配置={
键入:“行”,
数据:{
标签:[1,2,3,4,5],
数据集:[{
标签:“图表1”,
数据:[2,4,8,16],
}, {
标签:“图表2”,
数据:[3,4,6,9],
}]
},
选项:{
斯潘:是的,
回答:是的,
标题:{
显示:对,
文本:“Chart.js折线图”
},
工具提示:{
模式:“索引”,
交集:错,
},
悬停:{
模式:“最近的”,
交集:对
},
比例:{
xAxes:[{
显示:对,
scaleLabel:{
显示:对,
标签字符串:“标签”
}
}],
雅克斯:[{
显示:对,
scaleLabel:{
显示:对,
标签字符串:“值”
},
滴答声:{
民:1,,
最高:10,
}
}]
}
}
};
window.onload=函数(){
var ctx=document.getElementById('canvas').getContext('2d');
window.myLine=新图表(ctx,配置);
};



使用
散点
类型图和
显示行:true
而不是
带标签的类型:

var ctx=document.getElementById(“myChart”);
var myChart=新图表(ctx{
键入:“散布”,
数据:{
数据集:[
{
标签:“图表1”,
数据:[{x:1,y:2},{x:2,y:4},{x:3,y:8},{x:4,y:16}],
秀行:没错,
填充:假,
边框颜色:“rgba(0,200,0,1)”
},
{
标签:“图表2”,
数据:[{x:1,y:3},{x:3,y:4},{x:4,y:6},{x:6,y:9}],
秀行:没错,
填充:假,
边框颜色:“rgba(200,0,0,1)”
}
]
},
选项:{
工具提示:{
模式:“索引”,
交集:错,
},
悬停:{
模式:“最近的”,
交集:对
},
比例:{
雅克斯:[{
滴答声:{
贝吉纳泽罗:是的
}
}]
},
}
});

这段代码的作用是,它使用chart.js显示多线图

//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; }


}
<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>
为标记x和y值创建一个类

//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; }


}
<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>
//用于序列化数据的DataContract-需要以JSON格式提供
[数据合同]
公共类标签点
{
//显式设置序列化为JSON时要使用的名称。
[DataMember(Name=“label”)]
公共字符串标签{get;set;}
公共数据点数据点{get;set;}
}
[数据合同]
公共类数据点
{
[DataMember(Name=“x”)]
公共列表X{get;set;}
//显式设置序列化为JSON时要使用的名称。
[数据成员(Name=“y”)]
公共列表Y{get;set;}
}
用于检索数据的控制器代码

  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;
<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>
List dataPoints=GetProducts.ToList()
.GroupBy(p=>p.ProductName,
(k,c)=>新的LabelPoint()
{
DataPoint=newdatapoint{X=c.Select(y=>y.Date.ToString(“dd/MM/yyyy HH:MM”)).ToList(),y=c.Select(cs=>cs.Quantity.ToList(),
标签=k
}
).ToList();
ViewBag.DataPoints=数据点;
显示图表和检索数据的cshtml代码

  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;
<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>

$(文档).ready(函数(){
//使用viewbag从控制器获取数据
//所以数据看起来像这样[{标签:“ABC”,数据点:[{X:'222',Y:60}]
var data=@Html.Raw(Json.Encode(ViewBag.DataPoints));
//声明空数组
var数据集=[];var数量=[];var日期=[];
//循环遍历数据,获取标签,并获取对象数组的创建日期和数量
对于(变量i=0;i