Chart.js 始终在所有数据集上显示最后一个工具提示,是否将其余工具提示保留为悬停显示?ChartJS

Chart.js 始终在所有数据集上显示最后一个工具提示,是否将其余工具提示保留为悬停显示?ChartJS,chart.js,Chart.js,我有点执着于如何实现这一点,因为它与插件的功能相比有点非正统 我试图让每个数据集始终保持最后一个工具提示处于打开状态,而让其余的工具提示显示在悬停状态 目前,我正在使用此选项来保持它们全部显示: Chart.plugins.register({ beforeRender: function (chart) { if (chart.config.options.showAllTooltips) { chart.plug

我有点执着于如何实现这一点,因为它与插件的功能相比有点非正统

我试图让每个数据集始终保持最后一个工具提示处于打开状态,而让其余的工具提示显示在悬停状态

目前,我正在使用此选项来保持它们全部显示:

    Chart.plugins.register({
        beforeRender: function (chart) {
            if (chart.config.options.showAllTooltips) {
                chart.pluginTooltips = [];
                chart.config.data.datasets.forEach(function (dataset, i) {
                    console.log(chart);
                    chart.getDatasetMeta(i).data.forEach(function (sector, j) {
                        console.log(sector);
                        chart.pluginTooltips.push(new Chart.Tooltip({
                            _chart: chart.chart,
                            _chartInstance: chart,
                            _data: chart.data,
                            _options: chart.options.tooltips,
                            _active: [sector]
                        }, chart));
                    });
                });

                chart.options.tooltips.enabled = false;
            }
        },
        afterDraw: function (chart, easing) {
            if (chart.config.options.showAllTooltips) {
                if (!chart.allTooltipsOnce) {
                    if (easing !== 1) {
                        return;
                    }
                    chart.allTooltipsOnce = true;
                }

                chart.options.tooltips.enabled = true;
                Chart.helpers.each(chart.pluginTooltips, function (tooltip) {
                    tooltip.initialize();
                    tooltip.update();
                    tooltip.pivot();
                    tooltip.transition(easing).draw();
                });
                chart.options.tooltips.enabled = false;
            }
        }
    }); 
是否有方法仅对每个数据集中的最后一个工具提示执行此操作

我发现了一种隐藏工具提示的方法:

filter: function (tooltipItem, data) {
    var label = data.labels[tooltipItem.index];
    if (label === labels[labels.length - 1]) {
        console.log(tooltipItem);
    } else {
        return true;
    }
}
但这根本不显示它们,因为它返回
false

最终,它将如下所示,在相应节点的悬停位置显示其他工具提示:

非常感谢您的帮助。

我将尝试使用它来完成这项任务

你可以直接在他们的网页上试用-

设置 设置一些随机数据:

var DATA_COUNT = 8;
var labels = [];

Utils.srand(100);

for (var i = 0; i < DATA_COUNT; ++i) {
  labels.push('' + i);
}

var DATA_COUNT = 8;
var labels = [];

Utils.srand(100);

for (var i = 0; i < DATA_COUNT; ++i) {
  labels.push('' + i);
}
这里的主要部分是:

formatter: function(value, context) {
          value = Math.round(value * 100) / 100;
          if (context.dataIndex === context.dataset.data.length - 1) {
            return context.dataset.label + '\n' + value + '%';
          } else {
            return context.active
              ? context.dataset.label + '\n' + value + '%'
              : ''
          }
        },
格式化程序:
其中我仅为
context.dataIndex===context.dataset.data.length-1永久显示标签

在其他情况下,如果它处于非活动状态,我只显示空框;在其他情况下(悬停),我显示信息

看起来怎么样?
  • 禁止悬停

  • 鼠标悬停

所以这是整个hmtl文件以及所有相关代码。正如我所说,我不是程序员。这项工作来自大量的尝试和错误,包括stackoverflow问题中的几位代码

<script>
    $(document).ready(function () {
        showtempGraph();
    });

    function showtempGraph()
    {
        {
            $.post("temperaturedata.php",
            function (data)
            {
                console.log(data);
                var temptime = [];
                var temp = [];

                for (var i in data) {
                    temptime.push(data[i].timestamp);
                    temp.push(data[i].temperature);
                }
                
                var tempmin = Math.min(...temp);
                var tempmax = Math.max(...temp);

                var charttempdata = {
                    labels: temptime,
                    datasets: [
                        {
                            label: 'Temperatur',
                            pointRadius: 3,
                            backgroundColor: 'rgba(26, 137, 245, 0.2)',
                            borderColor: 'rgba(26, 137, 245, 1)',
                            hoverBackgroundColor: 'rgba(255, 255, 255, 1)',
                            hoverBorderColor: 'rgba(255, 255, 255, 1)',
                            pointBackgroundColor: 'rgba(12, 68, 122, 1)',
                            pointHoverBorderColor: "rgba(255, 255, 255, 0.8)",
                            data: temp
                        }
                    ]
                };

                var graphtempTarget = $("#tempgraphCanvas");

                var linetempGraph = new Chart(graphtempTarget, {
                    type: 'line',
                    data: charttempdata,
                    options: {
                        maintainAspectRatio: false,
                        tooltips: {
                            enabled: true,
                            custom: function(tooltip) {
                                if (!tooltip) return;
                                tooltip.displayColors = false;
                            },
                            callbacks: {
                                title: function(tooltipItems, tempdata) {
                                return 'Klokken: ' + tooltipItems[0].xLabel;    
                                },
                                label: function(tooltipItem, tempdata) {
                                return 'Temperatur: ' + Number(tooltipItem.yLabel).toFixed(2) + '°C';
                                }
                            }

                        },
                        legend: {
                            display: false,
                        },
                        responsive: true,
                        scales: {
                          xAxes: [{
                            type: 'time',
                            time: {
                                displayFormats: {
                                    hour: 'HH:mm'
                                },
                                tooltipFormat: 'HH:mm',
                            },
                            unit : 'day',
                            gridLines: {
                              color: '#999999',
                              lineWidth: 1
                            },
                            ticks: {
                                fontColor: "#fff",
                                }                               
                          }],
                          yAxes: [
                          { 
                            type: 'linear',
                            position: 'left',
                            gridLines: {
                              color: '#999999',
                              lineWidth: 1
                            },
                            ticks: {
                                fontColor: "#fff",
                                }
                          }, {
                            type: 'linear',
                            position: "right",
                            afterUpdate: function(scaleInstance) {
                              console.dir(scaleInstance);
                            },
                            gridLines: {
                              color: '#999999)',
                              lineWidth: 0.5
                            },
                            ticks: {
                                stepSize: tempmax - tempmin,
                                min: tempmin,
                                max: tempmax,
                                mirror: true,
                                padding: -10,
                                fontColor: "#fff",
                                fontSize: 18,
                                callback: function(value) {
                                    return value + '°C';
                                }
                            },
                            scaleLabel: {
                                display: true,
                                labelString: '°C',
                                fontColor: "#fff",
                                fontSize: 14
                            }                               
                          }]
                        },
                    }
                });
            });
        }
    }
    </script>

$(文档).ready(函数(){
showtempGraph();
});
函数showtempGraph()
{
{
$.post(“temperaturedata.php”,
功能(数据)
{
控制台日志(数据);
var testime=[];
var-temp=[];
用于(数据中的var i){
push(数据[i].时间戳);
温度推送(数据[i]。温度);
}
var tempmin=Math.min(…temp);
var tempmax=数学最大值(…temp);
var charttempdata={
标签:TENTIME,
数据集:[
{
标签:“温度”,
点半径:3,
背景颜色:“rgba(26,137,245,0.2)”,
边框颜色:“rgba(26,137,245,1)”,
hoverBackgroundColor:'rgba(255,255,255,1)',
hoverBorderColor:'rgba(255,255,255,1)',
pointBackgroundColor:“rgba(12,68,122,1)”,
pointHoverBorderColor:“rgba(255,255,255,0.8)”,
数据:临时
}
]
};
var graphtempTarget=$(“临时GraphCanvas”);
var linetempGraph=新图表(graphtempTarget{
键入:“行”,
数据:图表数据,
选项:{
MaintaintAspectRatio:false,
工具提示:{
启用:对,
自定义:函数(工具提示){
如果(!工具提示)返回;
tooltip.displayColor=false;
},
回调:{
标题:函数(工具提示项、tempdata){
返回'Klokken:'+工具提示项[0].xLabel;
},
标签:函数(工具提示项、tempdata){
返回'temperature:'+数字(tooltipItem.yLabel).toFixed(2)+'°C';
}
}
},
图例:{
显示:假,
},
回答:是的,
比例:{
xAxes:[{
键入:“时间”,
时间:{
显示格式:{
小时:“HH:mm”
},
tooltipFormat:'HH:mm',
},
单位:'天',
网格线:{
颜色:“#999999”,
线宽:1
},
滴答声:{
fontColor:#fff“,
}                               
}],
雅克斯:[
{ 
类型:'线性',
位置:'左',
网格线:{
颜色:“#999999”,
线宽:1
},
滴答声:{
fontColor:#fff“,
}
}, {
类型:'线性',
位置:“对”,
更新后:函数(scaleInstance){
console.dir(scaleInstance);
},
网格线:{
颜色:‘#999999’,
线宽:0.5
},
滴答声:{
步长:tempmax-tempmin,
敏:坦普敏,
麦克斯:麦克斯,
镜子:是的,
填充:-10,
<script>
    $(document).ready(function () {
        showtempGraph();
    });

    function showtempGraph()
    {
        {
            $.post("temperaturedata.php",
            function (data)
            {
                console.log(data);
                var temptime = [];
                var temp = [];

                for (var i in data) {
                    temptime.push(data[i].timestamp);
                    temp.push(data[i].temperature);
                }
                
                var tempmin = Math.min(...temp);
                var tempmax = Math.max(...temp);

                var charttempdata = {
                    labels: temptime,
                    datasets: [
                        {
                            label: 'Temperatur',
                            pointRadius: 3,
                            backgroundColor: 'rgba(26, 137, 245, 0.2)',
                            borderColor: 'rgba(26, 137, 245, 1)',
                            hoverBackgroundColor: 'rgba(255, 255, 255, 1)',
                            hoverBorderColor: 'rgba(255, 255, 255, 1)',
                            pointBackgroundColor: 'rgba(12, 68, 122, 1)',
                            pointHoverBorderColor: "rgba(255, 255, 255, 0.8)",
                            data: temp
                        }
                    ]
                };

                var graphtempTarget = $("#tempgraphCanvas");

                var linetempGraph = new Chart(graphtempTarget, {
                    type: 'line',
                    data: charttempdata,
                    options: {
                        maintainAspectRatio: false,
                        tooltips: {
                            enabled: true,
                            custom: function(tooltip) {
                                if (!tooltip) return;
                                tooltip.displayColors = false;
                            },
                            callbacks: {
                                title: function(tooltipItems, tempdata) {
                                return 'Klokken: ' + tooltipItems[0].xLabel;    
                                },
                                label: function(tooltipItem, tempdata) {
                                return 'Temperatur: ' + Number(tooltipItem.yLabel).toFixed(2) + '°C';
                                }
                            }

                        },
                        legend: {
                            display: false,
                        },
                        responsive: true,
                        scales: {
                          xAxes: [{
                            type: 'time',
                            time: {
                                displayFormats: {
                                    hour: 'HH:mm'
                                },
                                tooltipFormat: 'HH:mm',
                            },
                            unit : 'day',
                            gridLines: {
                              color: '#999999',
                              lineWidth: 1
                            },
                            ticks: {
                                fontColor: "#fff",
                                }                               
                          }],
                          yAxes: [
                          { 
                            type: 'linear',
                            position: 'left',
                            gridLines: {
                              color: '#999999',
                              lineWidth: 1
                            },
                            ticks: {
                                fontColor: "#fff",
                                }
                          }, {
                            type: 'linear',
                            position: "right",
                            afterUpdate: function(scaleInstance) {
                              console.dir(scaleInstance);
                            },
                            gridLines: {
                              color: '#999999)',
                              lineWidth: 0.5
                            },
                            ticks: {
                                stepSize: tempmax - tempmin,
                                min: tempmin,
                                max: tempmax,
                                mirror: true,
                                padding: -10,
                                fontColor: "#fff",
                                fontSize: 18,
                                callback: function(value) {
                                    return value + '°C';
                                }
                            },
                            scaleLabel: {
                                display: true,
                                labelString: '°C',
                                fontColor: "#fff",
                                fontSize: 14
                            }                               
                          }]
                        },
                    }
                });
            });
        }
    }
    </script>