我想使用d3动态生成可选数据点的键值对表。
例如,对于下面粘贴的data.csv文件,我有d3代码,它将4个数据点的x,y值绘制为svg中的圆圈。我希望能够在单击每个圆时生成一个键值对表。因此,对于point1(第1行),该表将为:
<table>
<thead>
<tr> <th>Key</th> <th>Value</th> </tr>
</thead>
<tbody>
<tr> <td>name</td> <td>point1</td> </tr>
<tr> <td>x</td> <td>50</td> </tr>
<tr> <td>y</td> <td>200</td> </tr>
<tr> <td>f</td> <td>1</td> </tr>
</tbody>
</table>
此表将根据所选的数据点进行更新 - 请注意标题保持不变,但表的内容应更改。到目前为止,示例数据和我的d3 + html代码如下。任何帮助非常感谢。
data.csv
name,x,y,f
point1,50,170,1
point2,100,75,2
point3,150,125,3
point4,35,25,4
example.js
var svg = d3.select("body")
.append("svg")
.attr("width", 400)
.attr("height", 200);
var mktable = function(dat) {
console.log(dat) // data is available!
var tr = d3.select("tbody").selectAll("tr")
.data(d3.keys(dat)).enter().append("tr")
var td = tr.selectAll("td")
.data(function(d){return d})
.enter().append("td")
.text(function(d) {return d})
};
d3.text("data.csv", function(text) {
var data = d3.csv.parse(text);
svg.selectAll("circle")
.data(data)
.enter()
.append("svg:circle")
.attr("cx", function(d) {
return parseFloat(d.x);
})
.attr("cy", function(d) {
return parseFloat(d.y);
})
.attr("r", function(d) {
return 3;
})
.on("mouseover", function() {
d3.select(this)
.attr("r", function(d) { return 7 });
})
.on("mouseout", function() {
d3.select(this)
.attr("r", function(d) { return 3 });
})
.on("click", mktable)
});
example.html的
<html lang="en">
<head>
<meta charset="utf-8">
<title>D3 Test</title>
<script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
</head>
<body>
<script type="text/javascript" src="example.js"></script>
<table>
<thead>
<tr><th>Key</th><th>Value</th></tr>
</thead>
<tbody>
</tbody>
</table>
</body>
</html>
答案 0 :(得分:2)
进度 - 此mktable函数为第一次点击生成正确的表格,但点击第二个点会添加额外 td元素,而不是替换。
var mktable = function(dat, i) {
var tr = d3.select("tbody").selectAll("tr")
.data(d3.entries(dat));
tr.enter().append("tr");
tr.append("td")
.text(function(d) { return d.key });
tr.append("td")
.text(function(d) { return d.value });
tr.exit().remove();
};
答案 1 :(得分:0)
在编写属性时,您还可以阅读它们,处理click事件。因此,您可以读取在矢量circle
元素中设置的任何属性,并使用它们生成表格。
如果您需要额外的值,可以将它们保存在圈子的data-
属性中,例如data-name
。 data-
属性以这种方式构造,以便符合w3c规范。
在你的情况下,我认为表格对齐很难以一种简单的方式实现,因为该表格是一个HTML元素,并且它不能附加到SVG元素。您可以使用z-index
覆盖表格,但我建议您使用其他技巧来显示值,例如设置title
或附加和SVG元素。