我正在尝试根据用户选择创建动态html表(鼠标悬停在d3图表上)。到目前为止,我非常幸运,我能够修改其他代码片段(主要来自http://jsfiddle.net/U4CGz/7/)以实现这一目标。
我找到了其他链接,但我无法将它们整合到一个工作脚本中(由于声誉不佳而未列出的链接)
我的目标......
以下的部分数据集
var dataset = [{
'date': '201405221630',
'10300200': 199,
'10300000': 239
}, {
'date': '201405221645',
'10300200': 199,
'10300000': 239
}, {
'date': '201405221700',
'10300200': 197,
'10300000': 240
}, ];
mousemove函数似乎工作,而updateTable函数不起作用
function mousemove() {
var x0 = x_main.invert(d3.mouse(this)[0]),
i = bisectDate(dataset, x0, 1),
d0 = dataset[i - 1].date,
d1 = dataset[i].date,
c = x0 - d0 > d1 - x0 ? [d1, i] : [d0, i - 1];
//console.log(dataset[i]);
circles.attr('transform', function (d) {
return 'translate(' + x_main(c[0]) + ',' + y_main(d.values[c[1]].value) + ')'
});
updateTable(c)
}
function updateTable(dateIndex) {
//console.log(dateValue)
d3.select("#th-date").text("Date: " + dateIndex[0]);
//console.log(dataset[dateValue[1]])
//console.log(dataset);
var tbody = d3.select("discharge-table").append("tbody");
var rows = tbody.selectAll("tr")
.data(dataset)
.enter()
.append("tr");
var cells = rows.selectAll("td")
.data(function (row) {
return dataset.map(function (d) {
return {
name: d,
value: d[name]
};
});
})
.enter()
.append("td")
.text(function (d) {
return d.value;
});
}
我的代码处于当前状态(在某种程度上有效)是http://jsfiddle.net/cjustin7/DCCe4/#base
正如您在上面的代码或我的JSFiddle中所看到的,我甚至还没有开始为我的第4和第5个目标设置结构。我是html,css,javascript和d3的新手。我将很感激被指导或展示一个工作实例或建议我做错了什么。
答案 0 :(得分:0)
基本上,updateTable
中执行的数据绑定似乎不正确。初始化rows
和cells
的方式是错误的。
编辑我已经更改了建议的代码。以下代码应该为您提供必要的表输出
在HTML中,将以下tbody
声明添加到discharge-table
的标记中(在声明<thead>
后添加)
<tbody id="discharge-table-body"></tbody>
重写updateTable
如下:
function updateTable(dateIndex) {
d3.select("#th-date").text("Date: " + dateIndex[0]);
var tbody = d3.select("#discharge-table-body");
var recordIndex = dateIndex[1]
var record = dataset[recordIndex] // This is currently selected record in the graph
var stationDischargeData = getStationDischargeData(record)
tbody.selectAll(".data-row").remove()
var rows = tbody.selectAll(".data-row")
.data(stationDischargeData)
.enter()
.append("tr").attr("class", "data-row");
var cells = rows.selectAll("td")
.data(function(d) {return [d.station, d.discharge]})
.enter()
.append("td")
.text(function(d) {return d})
}
添加新功能getStationDischargeData
,如下所示
function getStationDischargeData(record) {
var stationDischargeData = []
for (f in record) {
if (f != "date") {
stationDischargeData.push({station: f, discharge: record[f]})
}
}
return stationDischargeData
}
这些更改可让您使用dataset
编辑为了将表格中的放电值更改为与其对应的图表线的颜色,请更改在updateTable中初始化cells
的部分,如下所示:
var cells = rows.selectAll("td")
.data(function (d) {
return [d.station, {value: d.discharge, color: colour(d.station)}, d.stationName]
})
.enter()
.append("td")
.style('color', function (d) {
if ((typeof d) == "object") {return d.color} else {return 'black'}
})
.text(function (d) {
if ((typeof d) == "object") {return d.value} else {return d}
})