D3.js 设置突出显示的样式 Table
D3.js Styling a highlighted Table
我正在使用 D3.js 创建突出显示的 table(下面 link 中的第 11 个 Table)
http://www.tableau.com/sites/default/files/media/which_chart_v6_final_0.pdf
到目前为止,我已经设法将给定数组解析为 HTML Table 并为特定行选择一种颜色。现在我必须根据它保存的数据值来改变颜色的深度。
例如。这是一个包含学生分数的数组。
['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'];
我需要绿色随 'Math' 标记变化。也就是说,整个数学栏应该是绿色的,最高的学生应该是最深的绿色,最低的学生应该是浅绿色等等。该过程也应重复到其他列。我正在添加我所做的。谁能帮我解决这个问题?
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];
});
有很多方法可以做到这一点,但我的解决方案使用 RGBA 颜色并根据数据值改变 Alpha 通道(主要是不透明度)。 Fiddle 这里: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 值以 return 适当的 RGBA。
快速说明:如果您只是尝试使用 .style('opacity...
来改变单元格的不透明度,您会发现它会影响背景颜色和文本,这是您不想要的!
我正在使用 D3.js 创建突出显示的 table(下面 link 中的第 11 个 Table) http://www.tableau.com/sites/default/files/media/which_chart_v6_final_0.pdf
到目前为止,我已经设法将给定数组解析为 HTML Table 并为特定行选择一种颜色。现在我必须根据它保存的数据值来改变颜色的深度。
例如。这是一个包含学生分数的数组。
['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'];
我需要绿色随 'Math' 标记变化。也就是说,整个数学栏应该是绿色的,最高的学生应该是最深的绿色,最低的学生应该是浅绿色等等。该过程也应重复到其他列。我正在添加我所做的。谁能帮我解决这个问题?
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];
});
有很多方法可以做到这一点,但我的解决方案使用 RGBA 颜色并根据数据值改变 Alpha 通道(主要是不透明度)。 Fiddle 这里: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 值以 return 适当的 RGBA。
快速说明:如果您只是尝试使用 .style('opacity...
来改变单元格的不透明度,您会发现它会影响背景颜色和文本,这是您不想要的!