Как установить различные цвета для каждого столбца в angular -chart.js?
Я посмотрел на Как изменить цвета для Angular -Chart.js, но он относится к цветам для всего набора (набора данных), а не к конкретному бар.
Я ищу способ применить различный цвет для каждого бара на гистограмме; ChartJS до Angular.
Итак, у меня есть гистограмма:
<canvas id="locationBar" class="chart chart-bar" data="chartParams.votes" labels="chartParams.listOfLocations" series="chartParams.series" colours="chartParams.colours" options="chartParams.options"></canvas>
Со следующим кодом angular (в контроллере, конечно)
$scope.chartParams = {
listOfLocations: ['Trenzalore','Earth','Caprica','Sol','Tau Ceti'],
votes: [[5,10,6,7,2]],
series: ["Nice Places"],
colours: [{fillColor:getRandomColour()}],
options: {barShowStroke : false}
};
где getRandomColour()
вернет случайный цвет.
В настоящее время поле colours
применяет этот цвет ко всем барам:
![same colour :(]()
![different colours]()
когда мне действительно нужен другой цвет для каждого бара:
Plunker
Ответы
Ответ 1
Демо-версия плунжера
Проще всего было изменить исходный файл chart.js, чтобы принять массив цветов для fillColor, а не одну цветовую строку.
Если бы вы могли работать с одним из других предлагаемых решений, я думаю, что это закончится тем, что нужно сделать очень не-w500 > .
Некоторым людям может не нравиться настраивать источник, но как легко и просто это сделать, и он достигает желаемого результата, и это не менее "angular" в нем решение... пусть просто назовем его улучшением для 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.bars.
Теперь просто настройте свою диаграмму, как раньше, за исключением подачи ее в массив для 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}
};
}
Ответ 2
Используя последнюю версию angular-chart.js, вот пример, который изменяет цвета на основе условия без изменения самой библиотеки. Вместо этого он использует функцию chart-dataset-override
.
Фокус в том, чтобы использовать серию только с одним набором данных.
HTML
<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>
JavaScript
Добавьте в контроллер следующий код:
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
}
}]
}
};
Выход
Выдает:
![Выход диаграммы]()
Ссылки по теме
Ответ 3
Одной из больших проблем с библиотеками диаграмм является то, что рано или поздно вы попадаете на стену, которая может быть нарушена только путем взлома или расширения библиотеки. Зная, что вы попали в эту стену, и что может быть ответом на этот вопрос.
Даже если вы можете создать собственный график chart.js, вы также можете решить его с помощью d3.js. Я взял один из основных примеров angular d3.js barchart и добавил нужное поведение:
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
Индивидуальная настройка диаграммы, как изменение заливки, штрихов или чего-либо еще, находится в пределах досягаемости.
Это по-прежнему, хотя и намного больше кода, но если вы хотите настроить вне поддержки библиотеки, это всегда намного больше кода.