Google 图表不同颜色 w/ 单一系列 Material 条形图

Google charts different colors w/ single series Material bar chart

使用 {role: 'style'} 我可以将不同的颜色应用于单个系列条形图。但是如果我使用新的 Google "Material" 条形图,我不能。

"regular" Google 排行榜(作品):

google.load("visualization", '1.1', {packages:['corechart']});
google.setOnLoadCallback(drawChart);

function drawChart() {

   var data = google.visualization.arrayToDataTable([
       ['Element', 'Density', {role: 'style'} ],
       ['Copper', 8.94, 'color: #FF9900'],
       ['Silver', 10.49,'color: #109618'],
       ['Gold', 19.30,'color: #3B3EAC'],
       ['Platinum', 21.45,'color: #0099C6']
    ]);       

    var view = new google.visualization.DataView(data);


    var options = {
        title: "Density of Precious Metals, in g/cm^3",
        width: 600,
        height: 400,
        bar: {groupWidth: '85%'},
        legend: { position: 'none' },
    };

    var chart = new google.visualization.ColumnChart(document.getElementById('barchart_values'));
    chart.draw(view, options);
}

相同的图表,但使用 Google "Material" 条形图(未应用不同的颜色)

google.load("visualization", "1.1", {packages:["bar"]});
google.setOnLoadCallback(drawChart);
function drawChart() {

   var data = google.visualization.arrayToDataTable([
       ['Element', 'Density', { role: 'style' } ],
       ['Copper', 8.94, 'color: #FF9900'],
       ['Silver', 10.49,'color: #109618'],
       ['Gold', 19.30,'color: #3B3EAC'],
       ['Platinum', 21.45,'color: #0099C6']
  ]);   

  var view = new google.visualization.DataView(data);


  var options = {
    title: "Density of Precious Metals, in g/cm^3",
    width: 600,
    height: 400,
    bar: {groupWidth: '95%'},
    legend: { position: 'none' },
  };
    options = google.charts.Bar.convertOptions(options);
    var chart = new google.charts.Bar(document.getElementById('barchart_values'));
    chart.draw(view, options);
}

好像真的不可能。 Material 使用单独颜色的图表在任何地方都没有任何问题,如果您以旧方式设置颜色数组,例如 colors: [...],Material 图表只需采用第一种颜色并将其添加到所有颜色酒吧。我相信这根本没有在 Material 图表中实现(还没有?)。

但是如果你真的想要给条形图着色,你可以通过代码来完成:

function colorize() {
   var colors = ['#FF9900', '#109618', '#3B3EAC', '#0099C6'],
       svg = document.getElementById('barchart_values').querySelector('svg'),
       bars = svg.querySelectorAll('path');

   for (var i=0;i<bars.length;i++) {
       if (i !== selected) bars[i].setAttribute('fill', colors[i]);
   }    
}

colors[] 是上面 data DataTable 中的颜色。仅以 <path> 为目标是安全的,因为可视化条形的路径是 <svg> 中唯一存在的路径。

该函数可由就绪事件触发:

google.visualization.events.addListener(chart, 'ready', colorize);    

由于图表在 selectonmouseover 上不断重绘,因此也将侦听器附加到这些事件:

google.visualization.events.addListener(chart, 'select', colorize);
google.visualization.events.addListener(chart, 'onmouseover', colorize);

并让用户能够 select 条形图,即不要重新绘制 selected 条形图 :

function colorize() {
   var colors = ['#FF9900', '#109618', '#3B3EAC', '#0099C6'],
       selection = chart.getSelection(),
       selected = selection[0] ? selection[0].row : -1,
       svg = document.getElementById('barchart_values').querySelector('svg'),
       bars = svg.querySelectorAll('path');

   for (var i=0;i<bars.length;i++) {
       if (i !== selected) bars[i].setAttribute('fill', colors[i]);
   }    
}

你的 Material 图表添加了上面的代码 -> http://jsfiddle.net/o00oayvu/

这个帮助我

 var tmpColors = new Array(['orange'],['purple'],['red'],['green']);
    loop{
    .....
    .....
    options.colors = tmpColors[i];
    ....
    ....
    }