score:7

Accepted answer

the gradient direction (vertically in your case) not related directly to chart.js, but to html canvas createlineargradient() method.

createlineargradient javascript syntax:

context.createlineargradient(x0,y0,x1,y1);

https://www.w3schools.com/tags/canvas_createlineargradient.asp

example of top to bottom "vertically" gradient from w3schools:

var c = document.getelementbyid("mycanvas");
var ctx = c.getcontext("2d");
var my_gradient = ctx.createlineargradient(0, 0, 0, 170);
my_gradient.addcolorstop(0, "black");
my_gradient.addcolorstop(1, "white");
ctx.fillstyle = my_gradient;
ctx.fillrect(20, 20, 150, 100);
<div>top to bottom</div>
<canvas id="mycanvas" width="300" height="150" style="border:1px solid #d3d3d3;">

"one gradient"

docs:

an alternative option is to pass a canvaspattern or canvasgradient object instead of a string colour. https://www.chartjs.org/docs/latest/general/colors.html#patterns-and-gradients

same as one solid color but passing canvasgradient object:

var bar_ctx = document.getelementbyid('chart').getcontext('2d');

var background_1 = bar_ctx.createlineargradient(0, 0, 0, 600);
background_1.addcolorstop(0, 'red');
background_1.addcolorstop(1, 'blue');

and set background_1 under data

/* data */
var data = {
  labels: ["africa", "asia", "europe", "america"],
  datasets: [{
    /* data */
    label: "population (millions)",
    backgroundcolor: background_1,
    data: [40,60,80, 100]
  }]
};

"multiple colors for bars"

use multiple gradients objects inside backgroundcolor (object1 for item-1 and so on).

backgroundcolor: [background_1, background_2, background_3, background_4],

** my code is not dry (the best idea her is to create gradient objects by some loop throw array of data). by purpose i keep this example "simple".

var bar_ctx = document.getelementbyid('chart').getcontext('2d');

var background_1 = bar_ctx.createlineargradient(0, 0, 0, 600);
background_1.addcolorstop(0, 'red');
background_1.addcolorstop(1, 'blue');

var background_2 = bar_ctx.createlineargradient(0, 0, 0, 600);
background_2.addcolorstop(0, 'green');
background_2.addcolorstop(1, 'orange');

var background_3 = bar_ctx.createlineargradient(0, 0, 0, 600);
background_3.addcolorstop(0, 'orange');
background_3.addcolorstop(1, 'purple');

var background_4 = bar_ctx.createlineargradient(0, 0, 0, 600);
background_4.addcolorstop(0, 'green');
background_4.addcolorstop(1, 'violet');

/* data */
var data = {
  labels: ["africa", "asia", "europe", "america"],
  datasets: [{
    /* data */
    label: "population (millions)",
    backgroundcolor: [background_1, background_2, background_3, background_4],
    data: [40,60,80, 100]
  }]
};

var options = {
  responsive: true,
  title: {
    text: 'multiple colors for bars',
    display: true
  },
  scales: {
    xaxes: [{
      stacked: true,
      ticks: {

      },
    }],
    yaxes: [{
      stacked: true,
    }]
  }
};

var mychart = new chart(document.getelementbyid("chart"), {
  type: 'bar',
  data: data,
  options: options
});
  <canvas id="chart" width="800" height="600"></canvas>

<script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>

score:0

try to click one of the jsfiddle there, then change the chart type to 'bar'. you'll see it will work.

yes they are all the same color, because on their example they are only using one gradient. you can create multiple gradient with different color and apply it seperately since you are using multiple rgba already, you can change it and apply specific gradient to your bar. my english is not that good i hope you get my point.


Related Query