【问题标题】:How to prevent tick labels from "jumping" when drawn with ChartJS BeforeDraw使用 ChartJS BeforeDraw 绘制时如何防止刻度标签“跳跃”
【发布时间】:2017-07-27 16:35:31
【问题描述】:

这个问题建立在上一个问题的基础上:ChartJS place y-axis labels between ticks

使用 BeforeDraw 插件绘制刻度时,每次重新绘制画布时,刻度/标签都会“跳跃”。如果您运行代码 sn-p 并在您将鼠标悬停在条形上方和上方时查看 y 轴标签,您将能够看到这种“跳跃”。

有没有办法在使用 BeforeDraw 绘制刻度的同时防止这种“跳跃”?

var barChart = new Chart(ctx, {
   type: 'bar',
   data: {
      labels: ['Jan', 'Feb', 'Mar'],
      datasets: [{
         label: 'BAR',
         data: [10, 20, 30],
         backgroundColor: 'rgba(0, 119, 204, 0.5)'
      }]
   },
   options: {
      responsive: false,
      scales: {
         yAxes: [{
            ticks: {
               beginAtZero: true,
               "userCallback" : function(t, i){
                  var mapping_function =  [ "", "Critical", "Needs Work", "Good", "Needs Work", "Getting There", "Great Choices"];
                  //return t;
                  return mapping_function[mapping_function.length - (i + 1)];
               },
            }
         }]
      }
   },
   plugins: [{
      beforeDraw: function(chart) {
         var ctx = chart.ctx;
         var yAxis = chart.scales['y-axis-0'];
         var tickGap = yAxis.getPixelForTick(1) - yAxis.getPixelForTick(0);
         yAxis.options.ticks.fontColor = 'transparent'; // hide original tick
         // loop through ticks array
         Chart.helpers.each(yAxis.ticks, function(tick, index) {
            if (index === yAxis.ticks.length - 1) return;
            var xPos = yAxis.right;
            var yPos = yAxis.getPixelForTick(index);
            var xPadding = 10;
            // draw tick
            ctx.save();
            ctx.textBaseline = 'middle';
            ctx.textAlign = 'right';
            ctx.fillStyle = 'rgba(0, 0, 0, 0.8)';
            ctx.fillText(tick, xPos - xPadding, yPos + tickGap / 2);
            ctx.restore();
         });
      }
   }]
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
<canvas id="ctx" height="200"></canvas>

【问题讨论】:

    标签: javascript charts chart.js


    【解决方案1】:

    是的!有办法。使用以下插件:

    plugins: [{
       beforeDraw: function(chart) {
          // hide original tick
          chart.scales['y-axis-0'].options.ticks.fontColor = 'transparent';
       },
       afterDraw: function(chart) {
          var ctx = chart.ctx;
          var yAxis = chart.scales['y-axis-0'];
          var tickGap = yAxis.getPixelForTick(1) - yAxis.getPixelForTick(0);
          // loop through ticks array
          Chart.helpers.each(yAxis.ticks, function(tick, index) {
             if (index === yAxis.ticks.length - 1) return;
             var xPos = yAxis.right;
             var yPos = yAxis.getPixelForTick(index);
             var xPadding = 10;
             // draw tick
             ctx.save();
             ctx.textBaseline = 'middle';
             ctx.textAlign = 'right';
             ctx.fillStyle = 'rgba(0, 0, 0, 0.8)';
             ctx.fillText(tick, xPos - xPadding, yPos + tickGap / 2);
             ctx.restore();
          });
       }
    }]
    

    演示⧩

    var barChart = new Chart(ctx, {
       type: 'bar',
       data: {
          labels: ['Jan', 'Feb', 'Mar'],
          datasets: [{
             label: 'BAR',
             data: [10, 20, 30],
             backgroundColor: 'rgba(0, 119, 204, 0.5)'
          }]
       },
       options: {
          responsive: false,
          scales: {
             yAxes: [{
                ticks: {
                   beginAtZero: true,
                   "userCallback": function(t, i) {
                      var mapping_function = ["", "Critical", "Needs Work", "Good", "Needs Work", "Getting There", "Great Choices"];
                      //return t;
                      return mapping_function[mapping_function.length - (i + 1)];
                   },
                }
             }]
          }
       },
       plugins: [{
          beforeDraw: function(chart) {
             // hide original tick
             chart.scales['y-axis-0'].options.ticks.fontColor = 'transparent';
          },
          afterDraw: function(chart) {
             var ctx = chart.ctx;
             var yAxis = chart.scales['y-axis-0'];
             var tickGap = yAxis.getPixelForTick(1) - yAxis.getPixelForTick(0);
             // loop through ticks array
             Chart.helpers.each(yAxis.ticks, function(tick, index) {
                if (index === yAxis.ticks.length - 1) return;
                var xPos = yAxis.right;
                var yPos = yAxis.getPixelForTick(index);
                var xPadding = 10;
                // draw tick
                ctx.save();
                ctx.textBaseline = 'middle';
                ctx.textAlign = 'right';
                ctx.fillStyle = 'rgba(0, 0, 0, 0.8)';
                ctx.fillText(tick, xPos - xPadding, yPos + tickGap / 2);
                ctx.restore();
             });
          }
       }]
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
    <canvas id="ctx" height="200"></canvas>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多