【问题标题】:Different color for each column in angular-chartjs bar chartangular-chartjs条形图中每列的不同颜色
【发布时间】:2015-08-09 16:46:25
【问题描述】:

我在我正在处理的项目中使用 angular-chartJS,我需要为条形图中的每个条使用不同的颜色。

画布:

<canvas id="bar" class="chart chart-bar" data="medal_data" labels="medal_ticks"></canvas>

控制器:

$scope.medal_ticks = ['Gold', 'Silver', 'Bronze', 'Not passed'];
$scope.series = ['Medaljer'];
$scope.medals_colours= ['#087D76', '#B3BC3A', '#38B665', '#8B4A9D'];

$scope.medal_data = ['1', '5', '2', '0'];

我尝试将属性colours="medals_colours" 添加到我的画布中,唯一的问题是它只使用数组中的第一种颜色,而我想要的是每种颜色代表每一列。所以#087D76用来代表Gold#B3BC3A代表Silver,以此类推

【问题讨论】:

  • 我相信你想要这个plnkr.co/edit/J1cDvM90YGOAmg5CLn3T?p=preview我之后会添加解释
  • @pankajparkar 这正是我所需要的。谢谢!我会试着弄清楚我在此期间缺少什么
  • 我会在一个小时内添加一个答案。不要花时间在上面。你肯定会卡住..我会用解释更新答案
  • 请检查我添加的答案,如果您有任何疑问,请告诉我

标签: javascript angularjs bar-chart chart.js angular-chart


【解决方案1】:

由于您想为图表中的每个条形赋予不同的颜色,因此您将这些值传递到数组中。但问题是chart.js 不支持这种类型的功能。

原因

我们在bar区域看到的颜色就是fillColor选项,如果你看chart.js的源代码Line

代码

helpers.each(dataset.data, function(dataPoint, index) {
    //Add a new point for each piece of data, passing any required data to draw.
    datasetObject.bars.push(new this.BarClass({
        value: dataPoint,
        label: data.labels[index],
        datasetLabel: dataset.label,
        strokeColor: dataset.strokeColor,
        fillColor: dataset.fillColor, //<--This line responsible for filling color
        highlightFill: dataset.highlightFill || dataset.fillColor,
        highlightStroke: dataset.highlightStroke || dataset.strokeColor
    }));
}, this);

上面的代码清楚地表明fillColor 是必需的字符串。无论如何,您只能在该字符串中传递一种颜色。而且只有一种颜色会应用于条形系列。如果我们想让您的要求可行,那么我们需要在chart.js 中进行更改。

要在 chart.js 中进行的更改

我们需要将this linefillColor: dataset.fillColor, 更改为fillColor: dataset.fillColor[index],,以便我们可以传递需要应用于图表每个条形的颜色数组。 index 变量 .each 将确保颜色将按照我们在数组中给出的顺序应用到 Bar 上。我们的颜色将更改为$scope.medals_colours = [{fillColor:['#087D76', '#B3BC3A', '#38B665', '#8B4A9D']}];

更改的代码

helpers.each(dataset.data, function(dataPoint, index) {
    //Add a new point for each piece of data, passing any required data to draw.
    datasetObject.bars.push(new this.BarClass({
        value: dataPoint,
        label: data.labels[index],
        datasetLabel: dataset.label,
        strokeColor: dataset.strokeColor,
        fillColor: dataset.fillColor[index] || dataset.fillColor, //<--getting color using index
        highlightFill: dataset.highlightFill || dataset.fillColor,
        highlightStroke: dataset.highlightStroke || dataset.strokeColor
    }));
}, this);

标记

  <div class="graph-display" ng-controller="jsonServerBox">
    <canvas id="bar" class="chart chart-bar" data="medal_data" labels="medal_ticks" 
    colours="medals_colours"></canvas>
  </div>

控制器

  app.controller('jsonServerBox', function($scope) {

    $scope.medal_ticks = ['Gold', 'Silver', 'Bronze', 'Not passed'];
    $scope.series = ['Medaljer'];
    $scope.medals_colours = [{fillColor:['#087D76', '#B3BC3A', '#38B665', '#8B4A9D']}];

    $scope.medal_data = [['1', '5', '2', '0']];
  });

我知道它看起来确实很老套,但我们必须做到。

感谢@tpie this answer

Demo Plunkr

【讨论】:

  • 你是对的,我自己无法弄清楚,但感谢你的精彩解释,我已经设法使它与颜色一起工作。非常感谢大佬!!!
  • @Backer 对于基本的实现,你可以参考这个stackoverflow.com/a/28647813/2435473你的欢迎老兄..很高兴帮助你..谢谢
猜你喜欢
  • 2014-10-25
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多