【问题标题】:ChartJS Doughnut Charts Gradient FillChartJS 甜甜圈图表渐变填充
【发布时间】:2015-05-12 09:11:28
【问题描述】:

所以我尝试为 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"
    },
   ];

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

谢谢!

【问题讨论】:

  • 这个解决方法有效,它填充了一个渐变,但问题是渐变的角度,因为它是一个圆!
  • 我已经发布了一个答案,其中包含几个可能的选项来创建渐变圆环图。

标签: javascript canvas gradient chart.js


【解决方案1】:

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

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

您可以尝试使用径向渐变,看看结果是否符合您的设计需求。

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

此外,画布的笔触会围绕一个圆圈弯曲。

如果你想“自己滚动”渐变圆环图,这里有示例代码和一个在圆形路径上使用渐变 strokeStyle 的演示(请参阅我之前的回答:Angle gradient in canvas):

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;}
&lt;canvas id="canvas" width=300 height=300&gt;&lt;/canvas&gt;

【讨论】:

    【解决方案2】:

    是的,我最后做的是这个。

    第 1 步 - 获取图表。

      @ViewChild('slideDoughnutChart') slideDoughnutChart: BaseChartDirective;
    

    第 2 步 - 声明一个 const 渐变并分配它。

    const gradient = this.slideDoughnutChart.chart.ctx.createLinearGradient(0, 0, 0, 220);
    

    第 3 步 - 将您希望看到的颜色推送为渐变。

    const colors = [];
    for (let i = 0; i < 4; i++) {
      gradient.addColorStop(0, 'rgb(37, 77, 180)');
      gradient.addColorStop(1, 'rgb(123, 98, 221)');
      colors.push(gradient);
    }
    

    这里我推了同一个颜色。

    第 4 步 - 将圆环图颜色变量设置为颜色数组。

    this.slideDoughnutChartColors = [{ backgroundColor: colors }];
    

    第 5 步 - 将 slideDoughnutChartColors variable 分配给画布中的 colors 绑定。

    <canvas class="chartjs canvasResponsive" baseChart #slideDoughnutChart="base-chart" [colors]="slideDoughnutChartColors" ></canvas>
    

    如果你按照正确的步骤,你会以这个结束。

    对于 4 种不同的颜色,您需要创建 4 个不同的变量。 比如这样的。

    const gradientOne = this.slideDoughnutChart.chart.ctx.createLinearGradient(0, 0, 0, 400);
    const gradientTwo = this.slideDoughnutChart.chart.ctx.createLinearGradient(0, 0, 100, 400);
    const gradientThree = this.slideDoughnutChart.chart.ctx.createLinearGradient(0, 0, 0, 400);
    const gradientFour = this.slideDoughnutChart.chart.ctx.createLinearGradient(0, 0, 0, 400);
    

    然后做这样的事情。

     for (let i = 0; i < this.slideDoughnutChartData.length; i++) {
          switch (i) {
            case 0:
              gradientOne.addColorStop(0, 'rgb(223, 43, 100)');
              gradientOne.addColorStop(1, 'rgb(224, 105, 84)');
              colors.push(gradientOne);
              break;
            case 1:
              gradientTwo.addColorStop(0, 'rgb(248, 188, 80)');
              gradientTwo.addColorStop(1, 'rgb(243, 217, 53)');
              colors.push(gradientTwo);
              break;
            case 2:
              gradientThree.addColorStop(0, 'rgb(147, 229, 151)');
              gradientThree.addColorStop(1, 'rgb(3, 220, 179)');
              colors.push(gradientThree);
              break;
            case 3:
              gradientFour.addColorStop(0, 'rgb(123, 98, 221)');
              gradientFour.addColorStop(1, 'rgb(37, 77, 180)');
              colors.push(gradientFour);
              break;
          }
        }
    

    最终你会得到。

    这是我的图表数据。

    this.slideDoughnutChartData = [25, 35, 20, 25, 2];
    

    【讨论】:

    • 对于 4 种不同的颜色,您需要创建四个不同的变量。
    • 谢谢!看起来您对此进行了一些思考......一个jsfiddle将是完美的答案。
    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多