Chart.js折线图:每个数据集使用不同标签

27

使用Chart.js,您可以创建线图,但需要提供标签和数据集。例如:

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],
        }
    ]
};

问题在于您有固定数量的标签(在本例中为7),并且您还需要为每个数据集提供7个数据条目。那么,如果您有未知数量的标签和数据条目会怎样呢?

如果一个数据条目包含数字和时间呢:

Entry {
    number: 127
    time: 10:00
}

如果您想在X轴上显示所有时间,并在Y轴上显示所有数字,按照X轴上的时间排序。使用Chart.js能实现吗?

你找到解决方案了吗? - Anmol Gupta
4
还没有任何消息吗?看起来我们漏了些什么,这是一个常见的用户情况。 - SJFJ
尝试将缺失数据条目的值设为null。 - MarMat
3个回答

27

今天我也遇到了这个问题。你需要更加具体地指定数据集。在折线图中,“datasets”是一个数组,数组的每个元素都代表着图表上的一条线。一旦你理解它,Chart.js实际上非常灵活。你可以将一条线(即数据集元素)绑定到x轴和/或y轴,每个轴都可以详细指定。

在你的情况下,如果我们坚持在图表上只显示单条线,并且你希望“时间”部分出现在底部(即x轴),那么所有的时间都可以放入“labels”数组中,而“数值”则可以在y轴上被准确地定位。为了保持简单,不使用自定义的x和y轴刻度,假设有以下数据:

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

您可以将图表的"data"属性设置为:

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

请注意,数据数组现在更加具体化,每个数据元素通过引用标签之一来将自己绘制在x轴上,而不仅仅是一个原始数字。您现在可以按照这种模式在datasets数组中放入另一个数据集对象,并拥有两条线,显然为您的线条赋予不同的颜色和名称(“标签”)。

希望这可以帮助您。


2
我认为这里应该使用花括号而不是方括号。[x: "10:00", y: 127] 不是有效的 JavaScript 代码。 - Trevor Merrifield
我无法让它为我工作...使用了空值。 - MarMat
2
我无法理解这个回答如何回答问题。这里有一个“标签”东西,它不代表多个数据集,而只代表第一个数据集。如果数据集1具有标签[1..10],而数据集2具有标签[2..10],那么如何绘制图表?MpAndroidCharts和danielgindi/Charts可以解决此问题。 - Odys

14

我在这里找到了一个非常好的解决方案:https://github.com/chartjs/Chart.js/issues/3953

基本上,你可以为每个数据集添加自己的“labels”属性,并在xAxes标签、工具提示或其他任何你喜欢的回调函数中利用它。

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];
                }
            }
        }
    }
});

重要的是这一段:

        tooltips: {
            callbacks: {
                label: function(tooltipItem, data) {
                    var dataset = data.datasets[tooltipItem.datasetIndex];
                    var index = tooltipItem.index;
                    return dataset.labels[index] + ': ' + dataset.data[index];
                }
            }
        }

谢谢,这对我很有帮助。我可以在选项中使用工具提示,并将标签添加到其中! - Floww

4

由于您的帖子中有许多问题,我将尝试至少解决其中一些。对于您的条目模型,其中包含数字和时间,您应该创建一个分散图。在这里,您可以像下面我的示例那样定义具有x和y值的数据对象。它要求每个条目x都有相应的y。 请查看分散图表。 http://www.chartjs.org/docs/#line-chart-scatter-line-charts

var d = new Date();
var scatterChart = new Chart(ctx, {
    type: 'line',
    data: {
        datasets: [{
            label: 'Scatter Dataset',
            data: [{
                x: new Date().setDate(d.getDate()-5),
                y: 0
            }, {
                x: new Date(),
                y: 10
            }, {
                x: new Date().setDate(d.getDate()5),
                y: 5
            }]
        }]
    },
    options: {
        scales: {
            xAxes: [{
                    type: "time",
                    time: {
                        format: "HH:mm",
                        unit: 'hour',
                        unitStepSize: 2,
                        displayFormats: {
                            'minute': 'HH:mm', 
                            'hour': 'HH:mm'
                        },
                        tooltipFormat: 'HH:mm'
                    },
                    gridLines: {
                        display: false
                    }
                }],
        }
    }
});

3
把英语翻译成中文。这个回答只返回翻译后的文本。 - lockstock
1
请查看答案中提供的散点线图链接。 - Saeid
6
这个回答类似于“使用谷歌”类型的回答。它没有回答问题。 - Playdome.io
3
未回答问题。 - hertopnerd
6
这个回答完全解答了我的问题,即如何添加具有独立标签的数据集。只需阅读代码,答案就会呈现在你眼前。 - dev1223
它确实完美地回答了这个问题! - DyingSoul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接