使用D3创建一个表,其中两行是同级行
Creating a table with D3 where two rows are siblings
我正在创建一个具有D3的表,该表源于CSV
文件。我可以使行与CSV
中的每一行相匹配,但我有一列的文本数据很长。为了可读性,我希望将该列放在横跨整个表的其他列下面的单元格中:
<table>
...
<tr>
<td>col1</td><td>col2</td>...<td>colN</td>
</tr>
<tr>
<td colspan="N">lengthy text</td>
</tr>
...
</table>
然而,D3似乎没有添加兄弟元素的好方法。我在其他地方读过(d3.js-如何插入新的同级元素),可以迭代已经创建的第一个同级元素,并添加第二个。。。但是,我有来自源行的数据,需要添加到同级行中。
如果我尝试:
var row = mytable.enter().append("tr").attr("class","firstrow");
var row2 = mytable.enter().append("tr").attr("class","secondrow");
所有第二行都附加在所有第一行之后。
如果我尝试:
var row = mytable.enter().append("tr").attr("class","firstrow");
var row2 = mytable.insert("tr").attr("class","secondrow");
第二行附加在第一行中。
这与上面的结果相同:
var row = mytable.enter().append("tr").attr("class","firstrow");
var row2 = mytable.insert("tr","tr").attr("class","secondrow");
感谢您的帮助!
编辑:对于那些想玩的人来说,以下是整个过程:
function createTable(source, title, columns, hook) {
var tableOutput = d3.select(hook).append("table");
var headingRow = tableOutput.append("tr");
var datasets = [source];
var tableHeadings = headingRow.selectAll(".column_headings")
.data(columns)
.enter().append("th").text(function (d) {return d;}).attr("class","column_headings");
var tableChart = function(source) {
d3.csv(source, function(d) {
return {
thing1: +d.thing1,
thing2: d.thing2,
lengthything: d.lengthything, //the text that needs to go in the second row
link: d.link //wrap a link around lenthything
};
},
function(error, data) {
//do the table
var mytable = tableOutput.selectAll().data(data);
var row = mytable.enter().append("tr").attr("class","firstrow");
var row2 = mytable.insert("tr","tr").attr("class","secondrow");
row.append("td").attr("class","numeric").text(function(d) { return d.thing1 });
row.append("td").text(function(d) { return d.thing2 });
});
};
tableChart(datasets[0]);
}
重新构造数据。不要让N大小的数据数组中的每个对象都对应一行,而是修改数据,以便在现有行之间添加N个新行,其中每一新行都是一个对象,包含冗长的文本和一个标识符,您可以使用该标识符将其与其他行区分开。
我想明白了。不过,我不认为有一种严格的D3方法可以做到这一点(仍然只对D3的答案开放)。
function(error, data) {
//do the table
var mytable = tableOutput.selectAll().data(data);
var row = mytable.enter().append("tr").attr("class","firstrow");
//var row2 = mytable.insert("tr","tr").attr("class","secondrow");
//the above is replaced with:
d3.selectAll("tr.firstrow").each(function(d) {
p = this.parentNode; //grab the parent table element
r = document.createElement("tr");
r.setAttribute("class","secondrow");
c = document.createElement("td");
c.setAttribute("colspan","8");
a = document.createElement("a");
a.setAttribute("href",d.link);
a.innerText = d.message;
//glue everything together
c.appendChild(a);
r.appendChild(c);
//insert the second row after the first
p.insertBefore(r,this.nextSibling);
});
row.append("td").attr("class","numeric").text(function(d) { return d.thing1 });
row.append("td").text(function(d) { return d.thing2 });
});
它很难看,但很管用。有人有更干净/更有效的方法吗?
相关文章:
- 我怎么能用css或(angular)javascript把句子分成两行,只在特定单词后面
- 最小化CSS/JS文件,并使用命令行创建一个文件
- Jquery顶部的两行Javascript不起作用
- Javascript赢得'Don’不要跳过前两行代码
- 这两行jQuery是否等效
- 一行或两行后的CSS单词省略号('..')
- 从字符串行创建结构化列表
- 将鼠标悬停在图像上,图像的不透明度和图像下方标题的颜色会发生变化..同样,当标题变成两行时,它会破坏格式
- 将两行代码与JavaScript组合在一个函数中
- CSS 为 JSON 数据添加两行字符
- 如何为下面的代码而不是行创建一组新的列
- 如何在内容可编辑或其他地方找到通过自动换行创建的换行符
- 如何让我的 ckEditor 菜单按钮显示在两行而不是四行上
- 在两行(或更多行)上重复 ng
- 这两种创建元素的方法有什么区别
- 如何使用 jQuery 匹配两行内两个锚点的索引
- 如何重命名本机窗口函数,以便我可以删除两行
- 使用D3创建一个表,其中两行是同级行
- 如何在html/css/javascript中动态创建两行正方形
- 如何在不使用固定大小的情况下创建两列(一列有两行,另一列有一行)