Chart.js:条形图多种颜色

问题描述 投票:1回答:1

是否可以有多种颜色?

示例:“示例”

谢谢!

javascript chart.js
1个回答
2
投票

新答案:

我最初的回答使我感到困扰,我认为必须有一种更好的方式来实现这种风格。因此,这是一个使用radial gradient的更好的解决方案。

请注意,此实现非常幼稚,因为它仅支持单个数据集!

const colours = [
  { primary: '#fec1c6', shadow: '#e8b0b5' },
  { primary: '#bdeeed', shadow: '#aad2d0' },
  { primary: '#e4da84', shadow: '#d3ca76' }
];

new Chart(document.getElementById('chart'), {
  type: 'doughnut',
  data: {
    datasets: [{
      data: [3, 2, 2]
    }]
  },
  options: {
    cutoutPercentage: 65
  },
  plugins: [{
    beforeDatasetsUpdate: c => {
      const x = (c.chartArea.right + c.chartArea.left) / 2,
        y = (c.chartArea.bottom + c.chartArea.top) / 2,
        bgc = [];

      for (let i = 0; i < colours.length; i++) {
        const gradient = c.ctx.createRadialGradient(x, y, c.innerRadius, x, y, c.outerRadius);

        gradient.addColorStop(0, colours[i].shadow);
        gradient.addColorStop(.4, colours[i].shadow);
        gradient.addColorStop(.45, colours[i].primary);
        gradient.addColorStop(1, colours[i].primary);

        bgc.push(gradient);
      }
      c.config.data.datasets[0].backgroundColor = bgc;
    }
  }]
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="chart" height="75"></canvas>

原始答案:

如果您不介意“肮脏”的解决方案,则可以通过复制数据集来获得类似的视觉效果,例如:

const values = [3, 2, 2],
  primaryColours = ['#fec1c6', '#bdeeed', '#e4da84'],
  secondaryColours = ['#e8b0b5', '#aad2d0', '#d3ca76'];

new Chart(document.getElementById('chart'), {
  type: 'doughnut',
  data: {
    datasets: [{
      data: values,
      weight: 2,
      backgroundColor: primaryColours,
      borderColor: primaryColours
    }, {
      data: values,
      weight: 1,
      backgroundColor: secondaryColours,
      borderColor: secondaryColours
    }]
  },
  options: {
    cutoutPercentage: 65
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js"></script>
<canvas id="chart" height="75"></canvas>
© www.soinside.com 2019 - 2024. All rights reserved.