javascript - ChartJS 圆环图渐变填充

标签 javascript canvas gradient chart.js

所以我尝试为 ChartJS 圆环图制作渐变填充,但这只能在水平方向上使用,而不是在圆形中使用。

这是我正在使用的代码:

   var ctx = document.getElementById("chart-area").getContext("2d");

   var gradient1 = ctx.createLinearGradient(0, 0, 0, 175);
   gradient1.addColorStop(0.0, '#ACE1DB');
   gradient1.addColorStop(1.0, '#7FBDB9');


   var gradient2 = ctx.createLinearGradient(0, 0, 400, 400);
   gradient2.addColorStop(0, '#B5D57B');
   gradient2.addColorStop(1, '#98AF6E');

   var gradient3 = ctx.createLinearGradient(0, 0, 0, 175);
   gradient3.addColorStop(0, '#E36392');
   gradient3.addColorStop(1, '#FE92BD');

   var gradient4 = ctx.createLinearGradient(0, 0, 0, 175);
   gradient4.addColorStop(1, '#FAD35E');
   gradient4.addColorStop(0, '#F4AD4F');

   /* ADD DATA TO THE DOUGHNUT CHART */
   var doughnutData = [
    {
      value: 80,
      color: gradient1,
      highlight: "#E6E6E6",
      label: "NUTRIENTS"
    },
    {
      value: 20,
      color:"#E6F1EE"

    },
    {
      value:50,
      color: gradient2,
      highlight: "#E6E6E6",
      label: "PROTEINE"
    },
    {
      value: 50,
      color:"#E6F1EE"
    },
    {
      value: 75,
      color: gradient3,
      highlight: "#E6E6E6",
      label: "FETTE"
    },
    {
      value:25,
      color:"#E6F1EE"
    },
    {
      value: 77,
      color: gradient4,
      highlight: "#E6E6E6",
      label: "CARBS"
    }
    {
      value: 23,
      color:"#E6F1EE"
    },
   ];

是否可以在半径上实现渐变,如本设计所示?

http://i.stack.imgur.com/oItxw.png

谢谢!

最佳答案

ChartJS 在像圆环图这样的非线性路径上绘制线性渐变时,不会(正确地)使用渐变填充颜色。线性渐变不会弯曲。

可能性 #1 -- 使用径向渐变

您可以尝试径向渐变,看看结果是否满足您的设计需求。

可能性 #2 -- 使用渐变笔触(DIY 项目)

此外,canvas 的笔划会围绕一个圆圈弯曲。

如果您想“自己制作”渐变圆环图,这里有示例代码和一个在圆形路径上使用渐变 strokeStyle 的演示(请在此处查看我之前的回答:Angle gradient in canvas):

enter image description here

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");

function drawMultiRadiantCircle(xc, yc, r, radientColors) {
  var partLength = (2 * Math.PI) / radientColors.length;
  var start = 0;
  var gradient = null;
  var startColor = null,
      endColor = null;

  for (var i = 0; i < radientColors.length; i++) {
    startColor = radientColors[i];
    endColor = radientColors[(i + 1) % radientColors.length];

    // x start / end of the next arc to draw
    var xStart = xc + Math.cos(start) * r;
    var xEnd = xc + Math.cos(start + partLength) * r;
    // y start / end of the next arc to draw
    var yStart = yc + Math.sin(start) * r;
    var yEnd = yc + Math.sin(start + partLength) * r;

    ctx.beginPath();

    gradient = ctx.createLinearGradient(xStart, yStart, xEnd, yEnd);
    gradient.addColorStop(0, startColor);
    gradient.addColorStop(1.0, endColor);

    ctx.strokeStyle = gradient;
    ctx.arc(xc, yc, r, start, start + partLength);
    ctx.lineWidth = 30;
    ctx.stroke();
    ctx.closePath();

    start += partLength;
  }
}

var someColors = [];
someColors.push('#0F0');
someColors.push('#0FF');
someColors.push('#F00');
someColors.push('#FF0');
someColors.push('#F0F');

drawMultiRadiantCircle(150, 150, 120, someColors);
body{ background-color: ivory; }
#canvas{border:1px solid red;}
<canvas id="canvas" width=300 height=300></canvas>

关于javascript - ChartJS 圆环图渐变填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30186461/

相关文章:

java - 在 Spring MVC 中从 JS/jQuery/Ajax 进行 ActionRequest 调用

javascript - 如何动态添加 ng-click 到 span?

javascript - 更改 Image() 对象尺寸(宽度和高度)

MATLAB "gradient"函数交换 x 和 y 维度?

html - 具有不同渐变颜色的可重用 SVG

JavaScript 获取网络摄像头分辨率

TypeScript 文件中的 JavaScript 引用

canvas - 尝试安装 Canvas 时找不到 cario install 命令的 Gulp 问题

javascript - Canvas:逐像素绘制图像和requestAnimationFrame时序

CSS 将渐变作为 mask 应用于 DIV