Chartjs v4饼图,径向位移(偏移)

gblwokeq  于 2023-03-18  发布在  Chart.js
关注(0)|答案(1)|浏览(189)

基本上,我试图实现与此问题完全相同的目标,但在V4中:Chartjs饼图,径向位移(偏移)_
这个代码答案在v2.6中工作,有人能指导我使用v4的格式吗?

  1. Chart.defaults.cutOutPie = Chart.helpers.clone(Chart.defaults.pie);
  2. Chart.controllers.cutOutPie = Chart.controllers.pie.extend({
  3. updateElement: function(arc, index, reset) {
  4. Chart.controllers.pie.prototype.updateElement.call(this, arc, index, reset);
  5. var displacement = this.getDataset().displacements[index]||0;
  6. var model = arc._model;
  7. var angle = model.startAngle + model.circumference/2;
  8. model.x += Math.cos(angle) * displacement;
  9. model.y += Math.sin(angle) * displacement;
  10. }
  11. });
  12. new Chart('chart', {
  13. type: 'cutOutPie',
  14. data: {
  15. labels: ['a', 'b', 'c', 'd', 'e', 'f'],
  16. datasets: [{
  17. data: [1, 7, 2, 8, 3, 9],
  18. backgroundColor: ['red', 'orange', 'green', 'gold', 'pink', 'blue'],
  19. displacements: [0, 0, 40, 0, 0, 16],
  20. }],
  21. },
  22. });
  1. <script src="//cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>
  2. <canvas id="chart" width="400" height="300"></canvas>

我知道如何做到这一点,如果我 Package 建设的React或vue,但不知道如何做同样的事情在浏览。
文档似乎只讨论了导入和类。

pes8fvy9

pes8fvy91#

javascript v4使用ecmascript类,因此自定义控制器应该是现有控制器的子类,覆盖相关方法,如"New Charts" section of the docs中概述的那样。
因此,与旧代码类似的代码是:

  1. const PieController = Chart.controllers.pie;
  2. class CutOutPie extends PieController{
  3. static id = 'cutOutPie';
  4. updateElement(arc, index, properties, mode) {
  5. const displacement = this.getDataset().displacements?.[index] || 0;
  6. if(displacement && properties.circumference){
  7. const angle = properties.startAngle + properties.circumference/2;
  8. properties.x += displacement * Math.cos(angle);
  9. properties.y += displacement * Math.sin(angle);
  10. }
  11. if(properties.outerRadius){
  12. properties.outerRadius -= Math.max(...this.chart.data.datasets[0].displacements);
  13. }
  14. super.updateElement(arc, index, properties, mode);
  15. }
  16. }
  17. Chart.register(CutOutPie);
  18. new Chart('chart', {
  19. type: 'cutOutPie',
  20. data: {
  21. labels: ['a', 'b', 'c', 'd', 'e', 'f'],
  22. datasets: [{
  23. data: [1, 7, 2, 8, 3, 9],
  24. backgroundColor: ['red', 'orange', 'green', 'gold', 'pink', 'blue'],
  25. displacements: [0, 0, 40, 0, 0, 26],
  26. }]
  27. },
  28. options:{
  29. responsive: true,
  30. animation:{
  31. duration: 500,
  32. animateRotate: true,
  33. animateScale: true
  34. }
  35. }
  36. });
  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.1.2/chart.umd.js"
  2. integrity="sha512-t41WshQCxr9T3SWH3DBZoDnAT9gfVLtQS+NKO60fdAwScoB37rXtdxT/oKe986G0BFnP4mtGzXxuYpHrMoMJLA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  3. <body>
  4. <div style="height:500px; width: 500px">
  5. <canvas id="chart" style="border: 1px solid #999"></canvas>
  6. </div>

切片的半径必须按比例缩小,以避免移位的切片延伸到画布之外或与图例或其他元素重叠。
下面是一个稍微复杂一些的版本,它预先计算位移并考虑标准动画:
一个二个一个一个

展开查看全部

相关问题