【问题标题】:How to reformat tooltip in Chart.js?如何在 Chart.js 中重新格式化工具提示?
【发布时间】:2016-05-23 14:26:10
【问题描述】:

如何在 Chart.js 中重新格式化工具提示?该图表的 x 轴为时间,y 轴为销售额,工具提示显示 x 和 y 的数据值。到目前为止,工具提示可以默认工作,但我想更改我们在工具提示中看到的值。我可以通过重新定义“时间”中的 tooltipFormat 字段来重新格式化工具提示中的时间。但是对于 y 轴数据,我没有找到类似的东西。例如,显示“$1600”而不是“Daily Ticket Sales:1600”。
example tooltip format image

谁能告诉我这种变化应该发生在哪里?

“自定义”回调函数可以解决这里的问题吗?这是代码,谢谢!

    var dates=data.linechart.dates;
    var times=[];
    for (var i=0; i<dates.length; i++) {
        times.push(moment(dates[i],'YYYY/MM/DD'));
    }
    // console.log(dates);
    // console.log(times);

    var salesData = {
    labels: times,

    datasets: [
        {
            label: "Daily Ticket Sales",
            fill: false,
            lineTension: 0,
            backgroundColor: "#fff",
            borderColor: "rgba(255,88,20,0.4)",
            borderCapStyle: 'butt',
            borderDash: [],
            borderDashOffset: 0.0,
            borderJoinStyle: 'miter',
            pointBorderColor: "rgba(255,88,20,0.4)",
            pointBackgroundColor: "#fff",
            pointBorderWidth: 1,
            pointHoverRadius: 5,
            pointHoverBackgroundColor: "rgba(255,88,20,0.4)",
            pointHoverBorderColor: "rgba(220,220,220,1)",
            pointHoverBorderWidth: 2,
            pointRadius: 3,
            pointHitRadius: 10,
            data: data.linechart.sales,
        }
        ]
    };


    var ctx = document.getElementById("daily_sale").getContext("2d");
    var myLineChart = new Chart(ctx, {
        type: 'line',
        data: salesData,        
        options: {

            showLines: true,
            responsive: true,
            legend:{display:false},
            tooltips:{ 
                // backgroundColor:'rgba(0,255,0,0.8)',
                custom: function(tooltip) {

                    // tooltip will be false if tooltip is not visible or should be hidden
                    if (!tooltip) { 
                        return;
                    }
                    else{
                    console.log(tooltip);
                    }   
                }
            },
            scales: 
            {
                xAxes: [{
                    type: "time",
                    time: {
                        displayFormat:'MM/DD/YY',
                        tooltipFormat: 'MM/DD/YY',
                    //     unit: 'day',
                    }
                }],
                yAxes: [{
                    ticks:{ userCallback: function(value, index, values) {
                                                // $ sign and thousand seperators
                                                return  '$'+value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
                                            },  
                    },
                }],
            },
        }
    });

【问题讨论】:

    标签: javascript chart.js


    【解决方案1】:
    scales: {
        xAxes: [{
          type: 'time',
          time: {
              tooltipFormat:'MM/DD/YYYY', // <- HERE
              displayFormats: {
                 'millisecond':'HH:mm:ss',
                 'second': 'HH:mm:ss',
                 'minute': 'HH:mm:ss',
                 'hour': 'HH:mm:ss',
                 'day': 'HH:mm:ss',
                 'week': 'HH:mm:ss',
                 'month': 'HH:mm:ss',
                 'quarter': 'HH:mm:ss',
                 'year': 'HH:mm:ss',
              }
            }
        }]
    }
    

    【讨论】:

    • 点评来源: 您好,请不要只回答源代码。尝试对您的解决方案如何工作提供一个很好的描述。请参阅:How do I write a good answer?。谢谢
    【解决方案2】:

    您可以在回调函数中自定义标签。

    tooltips: { 
              callbacks: {
                            label: function(tooltipItem, data) {
                                return "Daily Ticket Sales: $ " + tooltipItem.yLabel;
                            },
                        }
                }
    

    【讨论】:

      【解决方案3】:

      有点晚了,但也许@LeonF 的回答效果很好,因为我处理了许多数据集和大量数字,所以没有做到完全,所以如果有人需要它,我把我的代码使标签具有正确的标签和格式化的值(我希望这对某人有所帮助):

      var myChart = new Chart(ctx, {
          type: 'line',
          data: {
              labels: _labels,
              datasets: [...]
          },
          options: {
              scales: {
                  yAxes: [{
                      ticks: {
                          beginAtZero: true,
                          stacked: false,
                          callback: function (label, index, labels) {
                              return '$' + label / 1000000;
                          }
                      },
                      scaleLabel: {
                          display: true,
                          labelString: 'Millones de pesos'
                      }
                  }]
              },
              tooltips: {
                  callbacks: {
                      label: function (tti, data) {
                          // Here is the trick: the second argument has the dataset label
                          return '{0}: {1}'.Format(data.datasets[tti.datasetIndex].label, formatMoney(tti.yLabel));
                      }
                  }
              },
              title: {
                  display: true,
                  text: 'Avance global'
              }
          }
      });
      

      我还为String.Format留下了我的功能:

      String.prototype.format = String.prototype.Format = function () {
          var args = arguments;
          return this.replace(/{(\d+)}/g, function (match, number) {
              return typeof args[number] != 'undefined' ? args[number] : match;
          });
      };
      

      对于formatMoney

      function formatNumber(num) {
          if (num == 'NaN') return '-';
          if (num == 'Infinity') return '&#x221e;';
          num = num.toString().replace(/\$|\,/g, '');
          if (isNaN(num))
              num = "0";
          sign = (num == (num = Math.abs(num)));
          num = Math.floor(num * 100 + 0.50000000001);
          cents = num % 100;
          num = Math.floor(num / 100).toString();
          if (cents < 10)
              cents = "0" + cents;
          for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3) ; i++)
              num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
          return (((sign) ? '' : '-') + num + '.' + cents);
      }
      function formatMoney(num) {
          return '$' + formatNumber(num);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        相关资源
        最近更新 更多