D3.js为突出显示的表设置样式

时间:2015-01-27 13:18:25

标签: javascript jquery html css d3.js

我正在使用D3.js创建一个突出显示的表(下面链接中的第11个表) http://www.tableau.com/sites/default/files/media/which_chart_v6_final_0.pdf

到目前为止,我已设法将给定数组解析为HTML表并为特定行选择颜色。现在我必须根据它所拥有的数据值改变颜色的深度。

例如。这是一个包含学生标记的数组。

    ['john', 10, 30, 40, 40,55 , 36, 74, 39, 29],
    ['Alex', 32, 22, 33, 24,35 , 36, 57, 28, 29],
    ['Mark', 34, 13, 43, 43,25 , 46, 67, 48, 59],
    ['Jane', 44, 25, 33, 24,15 , 26, 74,48, 59],
    ['Tina', 55, 62, 53,44,53 , 56,47, 83, 92],
    ['Lane', 67, 23, 23, 34,56 , 26, 77, 78, 79],
    ['Barry', 87, 42, 53, 84,75 , 66, 75, 28, 91],
    ['Clark', 88, 62, 37, 44,53 , 46, 73, 28, 19],
    ['Cisco', 97, 26, 63, 44,35 , 62, 27, 82, 19]

var rowLabel = ['-', 'Math', 'Science', 'History', 'English', 'IT', 'Health', 'Social','Politics', 'Physics'];

我需要绿色随“数学”标记而变化。也就是说,整个M​​ath列应该是绿色,最高的学生应该是最深的绿色,最低的学生应该是浅绿色等等。该过程也应重复到其他列。我正在添加我所做的。有人可以帮我这个吗?

var dummy = [

    ['john', 10, 30, 40, 40,55 , 36, 74, 39, 29],
    ['Alex', 32, 22, 33, 24,35 , 36, 57, 28, 29],
    ['Mark', 34, 13, 43, 43,25 , 46, 67, 48, 59],
    ['Jane', 44, 25, 33, 24,15 , 26, 74,48, 59],
    ['Tina', 55, 62, 53,44,53 , 56,47, 83, 92],
    ['Lane', 67, 23, 23, 34,56 , 26, 77, 78, 79],
    ['Barry', 87, 42, 53, 84,75 , 66, 75, 28, 91],
    ['Clark', 88, 62, 37, 44,53 , 46, 73, 28, 19],
    ['Cisco', 97, 26, 63, 44,35 , 62, 27, 82, 19]

];
var rowLabel = ['-', 'Math', 'Science', 'History', 'English', 'IT', 'Health', 'Social','Politics'];


//should use HEX but I have used name for the convenience 
    var colors = ['red', 'green', 'blue', 'yellow', 'orange', 'purple', 'grey', 'brown', 'violet', 'cyan'];



var table = d3.select("body").append("table");

thead = table.append("thead");
tbody = table.append("tbody")


thead.append("tr")
    .selectAll("th")
    .data(rowLabel)
    .enter()
    .append("th")
    .text(function(d){
        return d;
    })

var rows = tbody.selectAll("tr")
    .data(dummy)
    .enter()
    .append("tr");

var cells = rows.selectAll("td")
            .data(function(d,i){
                //d.shift();
                //d.unshift(rowLabel[i]);
                return d;
            })
            .enter()
            .append("td")
            .text(function(d){
                return d;
            })
            .style('background-color',function(d,i){
                return colors[i];
            });

1 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点,但我的解决方案使用RGBA颜色,并根据数据值改变Alpha通道(基本上是不透明度)。在这里小提琴:http://jsfiddle.net/henbox/6yp93hp0/1/

我首先以RGB格式重新定义了颜色数组,如下所示:

// Using RBG
var colors = [
    {r: 255, g: 0, b: 0},
    {r: 0, g: 255,  b: 0}, 
    {r: 0, g: 0, b: 255},
    ...
]

接下来定义了一个简单的alpha函数,将您的标记(大概为0 - 100)转换为域,范围为0到1:

var alpha = d3.scale.linear().domain([0, 100]).range([0, 1]);

最后,单元格的background-color样式现在定义如下:

.style('background-color', function (d, i) {
    return 'rgba(' + colors[i].r + ',' + colors[i].g + ',' + colors[i].b + ',' + alpha(d) + ')';
})

我们将计算出的Alpha值附加到colors数组中的RGB值,以返回正确的RGBA。

快速注意:如果您只是尝试使用.style('opacity...来改变单元格的不透明度,您会发现它会影响您不想要的背景颜色和文字!