JavaScript-Chart.js工具提示显示错误的x轴值

JavaScript-Chart.js工具提示显示错误的x轴值,javascript,jquery,canvas,chart.js,Javascript,Jquery,Canvas,Chart.js,我有一张包含两个不同数据集的图表,但有时它们有相同的x,y坐标。但当我将鼠标悬停在共享点上时,它有时会显示错误的日期。y值正确,但x值显示不正确 尝试悬停共享点 在下图中,您可以看到我正在盘旋{y:56.04,x:April 05,2014},但显示的是58.28的xLabel值,即2012年4月15日。此外,您可以在图表中看到57.05和58.28都将2012年4月15日作为x值,但它们不在同一y位置 代码太长,无法在stackoverflow上共享,但我制作了,以便您可以在那里查看、分叉和编

我有一张包含两个不同数据集的图表,但有时它们有相同的x,y坐标。但当我将鼠标悬停在共享点上时,它有时会显示错误的日期。y值正确,但x值显示不正确

尝试悬停共享点

在下图中,您可以看到我正在盘旋{y:56.04,x:April 05,2014},但显示的是
58.28
的xLabel值,即2012年4月15日。此外,您可以在图表中看到
57.05
58.28
都将
2012年4月15日
作为x值,但它们不在同一y位置

代码太长,无法在stackoverflow上共享,但我制作了,以便您可以在那里查看、分叉和编辑它


更新 我更新了具有相同日期的笔和固定点。我还添加了
类型:“时间”
,这要感谢


但是现在,x轴上的日期很奇怪。他们不再说2011年3月6日,而是说2011年第一季度。工具提示仍然存在错误。

您在图表配置中为类别笛卡尔坐标轴定义了自定义比例。将XAX的类型设置为“类别”。这可能不是必需的,因为ChartJS默认选择此选项

options: {
    scales: {
        xAxes: [{
            type: 'category',
            ....
另外,第二个数据集的格式不正确。您应该以
{x:xval,y:yval}
格式提供数据点

参考资料:

我相信你需要传递标签

labels: ["09:00", "09:30", "09:50", "10:10", "10:30", "10:50", "11:10"],
//////////////////////////////////////////////

var chartPluginLineaHorizontal = {
        afterDraw: function (chartobj, chartobjDos) {
            if (chartobj.options.lineaHorizontal) {
                var ctx = chartobj.chart.ctx;
                var valorY = chartobj.scales["y-axis-0"].getPixelForValue(chartobj.options.lineaHorizontal);
                ctx.beginPath();
                ctx.moveTo(0, valorY);
                ctx.lineTo(chartobj.chart.width, valorY);
                ctx.strokeStyle = "red";
                ctx.stroke();

            }
        }
    }
    Chart.pluginService.register(chartPluginLineaHorizontal);

    var chartPluginLineaHorizontalDos = {
        afterDraw: function (chartobj) {
            if (chartobj.options.lineaHorizontal) {
                var ctx = chartobj.chart.ctx;
                var valorY = chartobj.scales["y-axis-0"].getPixelForValue(chartobj.options.lineaHorizontalDos);
                ctx.beginPath();
                ctx.moveTo(0, valorY);
                ctx.lineTo(chartobj.chart.width, valorY);
                ctx.strokeStyle = "red";
                ctx.stroke();
            }
        }
    }
    Chart.pluginService.register(chartPluginLineaHorizontalDos);

    // Define a plugin to provide data labels
    Chart.plugins.register({
        afterDatasetsDraw: function (chartobj) {
            var ctx = chartobj.chart.ctx;

            chartobj.data.datasets.forEach(function (dataset, i) {
                //debugger
                var meta = chartobj.getDatasetMeta(i);
                if (!meta.hidden) {
                    meta.data.forEach(function (element, index) {
                        // Draw the text in black, with the specified font
                        ctx.fillStyle = 'rgb(0, 0, 0)';

                        var fontSize = 16;
                        var fontStyle = 'inherit';
                        var fontFamily = 'sans-serif';
                        ctx.font = Chart.helpers.fontString(fontSize, fontStyle, fontFamily);

                        // Just naively convert to string for now
                        var dataString = dataset.data[index].y.toString();

                        // Make sure alignment settings are correct
                        ctx.textAlign = 'center';
                        ctx.textBaseline = 'middle';

                        var padding = 5;
                        var position = element.tooltipPosition();
                        ctx.fillText(dataString, position.x, position.y - (fontSize / 2) - padding);
                    });
                }
            });
        }
    });

                var ctx = document.getElementById('myChart').getContext('2d');
                var myChart = new Chart(ctx, {
                    type: 'line',
                    data: {
                        labels: ["09:00", "09:30", "09:50", "10:10", "10:30", "10:50", "11:10"],
                        datasets: [{
                            label: "My First dataset",
                            data: [
                                    {
                                        x: "09:30",
                                        y: 127
                                    },
                                   {
                                       x: "09:30",
                                       y: 140
                                   },
                                   {
                                       x: "09:50",
                                       y: 135
                                   },
                                   {
                                       x: "10:10",
                                       y: 122
                                   }, {
                                       x: "10:30",
                                       y: 135
                                   }, {
                                       x: "10:50",
                                       y: 135
                                   }],
                            backgroundColor: "rgba(0,255,51,0.5)",
                                        borderColor: "rgba(0,255,51,0.5)",
                                        fill: false
                        },
                                {
                                    label: "My second dataset",
                                    data: [
                                        {
                                            x: "09:50",
                                            y: 95
                                        },
                                   {
                                       x: "10:10",
                                       y: 140
                                   },
                                   {
                                       x: "10:30",
                                       y: 130
                                   },
                                   {
                                       x: "10:50", 
                                       y: 150
                                   },
                                   {
                                       x: "11:10",
                                       y: 143
                                   }],
                                                backgroundColor: "rgba(0,98,31,0.5)",
                                                borderColor: "rgba(0,98,31,0.5)",
                                                fill: false
                                }]
                    },
                    options: {
                        lineaHorizontal: 140,
                        lineaHorizontalDos: 100,
                        elements: {
                            line: {
                                tension: 0
                            }
                        }

                    }


                })

我使用工具提示回调解决了我的问题,如下所示:

options: {
    tooltips: {
        callbacks: {
            title: function(tooltipItems, data) {
                return data.datasets[tooltipItems[0].datasetIndex].data[tooltipItems[0].index].x;
            }
        }
    }
}
现在,我的工具提示直接从相应的
数据集获取标题


Chartjs版本:
2.9.3

第二个数据集:我问了这个问题后发现,这确实是我的小问题。我现在就试试“时间”这个词!我添加了
类型:“时间”
,但是现在日期格式很奇怪。。。。您可以设置displayFormatsOkay,以及如何在
displayFormats
中使用
moment.format()
函数?或者我可以定位日期字符串?要继续使用在
xLabels
中设置的标签,请将类型设置为
category
。请同时删除您添加的显示格式。我错过了这个细节。要回答有关设置标签格式和本地化的问题,您只需以显示格式传递该时间单位的格式字符串,例如季度:
MMMM-DD,YYYY
。我将更新我的答案以反映这一变化。这并不能解决我随问题提供的图像中显示的视觉悬停错误。为数据点提供一个x和y值(如@oluwafemiSule在他的回答中所述)是解决我问题的方法。