javascript - 如何在自定义圆环图上画针并向针中添加数据点?

标签 javascript chart.js

我使用 Chart.js、Laravel 和 Bootstrap 3 创建了一个自定义仪表图表,现在我正在尝试绘制一根针并用针显示数据集。这是我到目前为止所做的,我可以显示仪表,但是我无法显示指针,而且我不确定如何将数据附加到指针上。提前谢谢大家。

var oilCanvas = document.getElementById("oilChart");

Chart.defaults.global.defaultFontFamily = "Lato";
Chart.defaults.global.defaultFontSize = 18;

var oilData = {
  labels: [],
  datasets: [{
    data: [35, 35, 35],
    backgroundColor: [
      'rgba(255, 99, 132, 0.2)',
      'rgba(255, 206, 86, 0.2)',
      'rgba(63, 191, 63, 0.2)'
    ],

    borderWidth: ""
  }]
};

var chartOptions = {
  rotation: -Math.PI,
  cutoutPercentage: 30,
  circumference: Math.PI,
  legend: {
    position: 'left'
  },
  animation: {
    animateRotate: false,
    animateScale: true
  }
};

function drawNeedle(radius, radianAngle) {
  var canvas = document.getElementById("oilChart");
  var ctx = canvas.getContext('2d');
  var cw = canvas.offsetWidth;
  var ch = canvas.offsetHeight;
  var cx = cw / 2;
  var cy = ch - (ch / 4);

  ctx.translate(cx, cy);
  ctx.rotate(radianAngle);
  ctx.beginPath();
  ctx.moveTo(0, -5);
  ctx.lineTo(radius, 0);
  ctx.lineTo(0, 5);
  ctx.fillStyle = 'rgba(0, 76, 0, 0.8)';
  ctx.fill();
  ctx.rotate(-radianAngle);
  ctx.translate(-cx, -cy);
  ctx.beginPath();
  ctx.arc(cx, cy, 7, 0, Math.PI * 2);
  ctx.fill();
}

var pieChart = new Chart(oilCanvas, {
  type: 'doughnut',
  data: oilData,
  options: chartOptions
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js"></script>
<div>
  <canvas id="oilChart"></canvas>
</div>

最佳答案

您可以使用 Plugin Core API它提供了一系列可用于执行自定义代码的 Hook 。 afterDraw 钩子(Hook)可用于通过 CanvasRenderingContext2D 直接在 canvas 上绘制针。 .

首先我们需要在数据集中定义属性needleValue

datasets: [{
  data: [35, 35, 35],
  needleValue: 580,
  ...
}],

解决方案基于code sampleKonstantin S. 提供.请在下面查看您修改后的代码。

new Chart('oilChart', {
  type: 'doughnut',
  plugins: [{
    afterDraw: chart => {
      var needleValue = chart.chart.config.data.datasets[0].needleValue;
      var dataTotal = chart.chart.config.data.datasets[0].data.reduce((a, b) => a + b, 0);
      var angle = Math.PI + (1 / dataTotal * needleValue * Math.PI);
      var ctx = chart.chart.ctx;
      var cw = chart.chart.canvas.offsetWidth;
      var ch = chart.chart.canvas.offsetHeight;
      var cx = cw / 2;
      var cy = ch - 6;

      ctx.translate(cx, cy);
      ctx.rotate(angle);
      ctx.beginPath();
      ctx.moveTo(0, -3);
      ctx.lineTo(ch - 20, 0);
      ctx.lineTo(0, 3);
      ctx.fillStyle = 'rgb(0, 0, 0)';
      ctx.fill();
      ctx.rotate(-angle);
      ctx.translate(-cx, -cy);
      ctx.beginPath();
      ctx.arc(cx, cy, 5, 0, Math.PI * 2);
      ctx.fill();
    }
  }],
  data: {
    labels: [],
    datasets: [{
      data: [35, 35, 35],
      needleValue: 27,
      backgroundColor: [
        'rgba(255, 99, 132, 0.2)',
        'rgba(255, 206, 86, 0.2)',
        'rgba(63, 191, 63, 0.2)'
      ]
    }]
  },
  options: {
    layout: {
      padding: {
        bottom: 3
      }
    },
    rotation: -Math.PI,
    cutoutPercentage: 30,
    circumference: Math.PI,
    legend: {
      position: 'left'
    },
    animation: {
      animateRotate: false,
      animateScale: true
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="oilChart" height="80"></canvas>

关于javascript - 如何在自定义圆环图上画针并向针中添加数据点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57218877/

相关文章:

javascript - 如何使用 Javascript 操作行和表的背景颜色

javascript - 如何将 jQuery 嵌入/导入到另一个 JavaScript 库中,而不导致与网站上部署的 jQuery/其他库发生潜在冲突?

chart.js - 从工具提示中删除零值

javascript - 如何在按下某个键时在 Canvas 上移动一个对象 (PACMAN)

javascript - 如何将页面模板拆分为单独的组件,每个组件都查询数据?

javascript - 如何有多个 d3 窗口调整大小事件

ruby-on-rails - 如何在Rails 4.0中填充activerecord时加载动画?

chart.js - 有没有办法用 Chart.js 创建 "mini"(非常小的图表)?

javascript - Chart.js - 在不使用工具提示的情况下向气泡图元素添加文本/标签?

javascript - 结合不同粒度的chart.js条形图和折线图