私はD3を学び始めたばかりです。配列から(チュートリアルの例から)テーブルを生成することで遊んでいましたが、マウスオーバーで列を強調表示するための最良の方法は何でしょうか?以下は私の最初の試みです。
var tableData = [], colCnt = 100, rowCnt = 100;
//Generate 2d array with values
for( var i=0; i<rowCnt; i++ ){
tableData.push( d3.range(i*colCnt, (i*colCnt)+colCnt) )
}
d3.select('#viz').append('table')
.style('border-collapse', 'collapse')
.style('border', '2px solid black')
.selectAll('tr')
.data( tableData )
.enter().append('tr')
//Highlight the row
.on('mouseover', function(){d3.select(this).style('background-color', 'gray');})
.on('mouseout', function(){d3.select(this).style('background-color', 'white');})
.selectAll('td')
.data( function(d){ return d; } )
.enter().append('td')
.text(String)
.style('border', '1px solid black')
.style('padding', '5px')
//Highlight the column
.on('mouseover', function(d,i){
//d3.select(this).style('background-color','lightgray');
d3.select(this.parentNode.parentNode).selectAll('tr')
.selectAll('td')
.style('background-color', function(d,j){ return i==j ? 'lightgray' : null;});
})
.on('mouseout', function(d,i){
//d3.select(this).style('background-color', null);
d3.select(this.parentNode.parentNode).selectAll('tr').selectAll('td').style('background-color', null);
})
[更新]Joshのソリューションを試しましたが、上記のソリューションよりもはるかに高速です。以下は更新されたバージョンです。テーブルを256x256に設定しましたが、上記のソリューションに大きな遅延がある場合、速度の低下は見られませんでした。
d3.select('#viz').append('table')
.style('border-collapse', 'collapse')
.style('border', '2px solid black')
.selectAll('tr')
.data( tableData )
.enter().append('tr')
.on('mouseover', function(){d3.select(this).style('background-color', 'gray');})
.on('mouseout', function(){d3.select(this).style('background-color', 'white');})
.selectAll('td')
.data( function(d){ return d; } )
.enter().append('td')
.text(String)
.style('border', '1px solid black')
.style('padding', '5px')
.attr('class', function(d,i){ return "col_" + i; })
.on('mouseover', function(d,i){
d3.selectAll('td.col_' + i)
.style('background-color', 'lightgray');
})
.on('mouseout', function(d,i){
d3.selectAll('td.col_' + i)
.style('background-color', null);
})