当前位置: 首页 > 知识库问答 >
问题:

如何在angular-chart.js?中为每个条设置不同的颜色

巢海
2023-03-14

我已经研究了如何更改Angulal-Chart.js的颜色,但它涉及整个(数据集)的颜色,而不是特定的条。

我要寻找的是一种在条形图中为每个条形应用不同颜色的方法;从图表到角度。

所以,我有一个条形图:

<canvas id="locationBar" class="chart chart-bar" data="chartParams.votes" labels="chartParams.listOfLocations" series="chartParams.series" colours="chartParams.colours" options="chartParams.options"></canvas> 

使用以下角度代码(当然是在控制器中)

$scope.chartParams = {
    listOfLocations: ['Trenzalore','Earth','Caprica','Sol','Tau Ceti'],
    votes: [[5,10,6,7,2]],
    series: ["Nice Places"],
    colours: [{fillColor:getRandomColour()}],
    options: {barShowStroke : false}
};

其中getrandomColor()将返回随机颜色。

现在,colors字段将此颜色应用于所有条:

当我真的想为每个酒吧不同的颜色:

柱塞

共有3个答案

柯河
2023-03-14

图表库的一个更大的问题是迟早你会碰壁,这只能通过黑客攻击或扩展库来突破。知道你碰壁了,这个问题的答案是什么。

即使可以创建自定义的chart.js图,也可以使用d3.js解决。我举了一个基本的angular d3.js条形图示例,并添加了您想要的行为:

var colors = d3.scale.category10();

// ...

bars.enter().append('rect')
    .classed('bar', true)
    .attr({x: chartW,
           width: barW,
           y: function(d, i) { return y1(d); },
           height: function(d, i) { return chartH - y1(d); },
           fill: function(d,i) { return colors(i) }
    })
// ...

http://plnkr.co/edit/9RCYAPCEj9iRsxkkYPaV?p=preview

以任何方式自定义图表,如更改填充、笔划或其他任何方式都可以实现。当然,尽管代码要多得多,但如果您想在库支持之外进行自定义,代码总是多得多。

空夕
2023-03-14

普朗克演示

最简单的方法是修改chart.js源文件以接受fillColor的颜色数组,而不是单个颜色字符串。

如果你能让其他提议的解决方案中的一个发挥作用,我认为最终将不得不以一种非角度的方式来完成。

有些人可能不喜欢调整源代码,但这是因为它是多么简单和容易,它实现了预期的结果,而且它的解决方案中的“角度”并没有减少……让我们称之为对chart.js的改进。

请注意,我只修改了“条形图”以接受颜色数组,因为它似乎chart.js在每种图表类型中单独引用fillColor。因此,您应该能够对任何图表类型进行此修改。

您需要修改的地方:

            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],   // <- added [index] here
                    highlightFill : dataset.highlightFill || dataset.fillColor,
                    highlightStroke : dataset.highlightStroke || dataset.strokeColor
                }));
            },this);

这段代码可以在条形图的Chart.type.extend函数中找到。只要看看这个:

Chart.Type.extend({
        name: "Bar",

再往下看函数内部,它将fillColor推送到datasetObject.bar的位置。

现在只需像以前一样设置图表,只需为fillColor提供一个数组:

function($scope){
          $scope.chartParams = {
        listOfLocations: ['Trenzalore','Earth','Caprica','Sol','Tau Ceti'],
        votes: [[5,10,6,7,2]],
        series: ["Nice Places"],
        colours: [{fillColor:["#FF0000", "#00FF00", "#0000FF", "#00FFFF", "#FFFF00"]}],
        options: {barShowStroke : false}
      };
        }
夔学智
2023-03-14

使用最新版本的angular-chart.js,这里有一个基于条件更改颜色的示例,而不修改库本身。取而代之的是,它使用图表数据集覆盖功能。

诀窍是使用只有一个数据集的序列。

<div ng-controller="chartControl">
  <canvas id="bar" class="chart chart-bar" 
    chart-data="goal.data" 
    chart-labels="goal.labels" 
    chart-options="goal.options" 
    chart-series="goal.series" 
    chart-dataset-override="goal.datasetOverride"></canvas>
</div>

将以下代码添加到控制器:

  var exceeded = '#27ae60';
  var achieved = '#bdc3c7';
  var defeated = '#e74c3c';

  $scope.goal = [];
  $scope.goal.goal = 3;

  $scope.goal.series = [ 'Visits' ];
  $scope.goal.labels = [
    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep'
  ];
  $scope.goal.data = [
    [5, 2, 3, 3, 3, 4, 2, 3, 4],
  ];

  var backgroundColours = [];

  // Assign the background colour based on whether the goal was achieved.
  for( var i = 0; i < $scope.goal.data[0].length; i++ ) {
    var v = $scope.goal.data[0][i];

    if( v > $scope.goal.goal ) {
      backgroundColours[i] = exceeded;
    }
    else if( v < $scope.goal.goal ) {
      backgroundColours[i] = defeated;
    }
    else {
      backgroundColours[i] = achieved;
    }
  } 

  // Create a place to hold the background colours.
  $scope.goal.datasetOverride = [{ backgroundColor: [] }];

  // Assign the colours to the pre-populated array.
  $scope.goal.datasetOverride[0].backgroundColor = backgroundColours;

  $scope.goal.options = {
    barShowStroke: false,
    scales: {
      yAxes: [{
        ticks: {
          min: 0,
          max: 7,
          stepSize: 1
        }
      }]
    }
  };

生产:

  • http://jtblin.github.io/angular-chart.js/examples/dataset-override.html
 类似资料:
  • 因此,我有一段代码,它以我需要的格式愉快地显示了一个图形: 我想让图表中的一个条显示为不同于上面代码中设置的颜色。

  • 问题内容: 我使用Angular-Chart.js(AngularJS Chart.js版本)创建条形图。图表使用颜色以外的选项。 即使我在文档中进行了设置,它们仍保持灰色。 实际上,这些选项有效,但颜色无效。难道我做错了什么? 问题答案: 您应该将对象声明为数组 plnkr

  • 我希望这个图中的条形图有我自己选择的不同颜色。我不想使用随机的颜色为酒吧(或一组酒吧)。

  • 在自定义图表上工作,可以根据数据提供的值确定条形图或水平条形图中的条形图的厚度,而不是使用barThickness或barPer百分比/类别百分比的预设宽度。 目标:我可以用包含值和

  • 假设我有三个数据集: 我可以分散绘制这个: 10套怎么做得到? 我搜索了这个,可以找到任何关于我所问问题的参考资料。 编辑:澄清(希望)我的问题 如果我多次调用散点,我只能在每个散点上设置相同的颜色。此外,我知道我可以手动设置颜色阵列,但我相信有更好的方法来做到这一点。我的问题是,“我如何自动分散绘制我的几个数据集,每个数据集都有不同的颜色。 如果有帮助,我可以很容易地为每个数据集分配一个唯一的数

  • 我在一个项目中使用ChartJS,我需要为条形图中的每个条形图使用不同的颜色。 下面是条形图数据集的示例: 有没有什么方法可以把每个酒吧涂成不同的颜色?