【问题标题】:Create / Update an html table based on a subset of json dataset based on mouseover of a d3 graph基于 d3 图的鼠标悬停基于 json 数据集的子集创建/更新 html 表
【发布时间】:2014-05-29 00:04:36
【问题描述】:

我正在尝试根据用户选择(鼠标悬停在 d3 图上)创建动态 html 表。到目前为止,我非常幸运,我已经能够修改其他人的代码 sn-ps(主要来自http://jsfiddle.net/U4CGz/7/)以达到这一点。

我找到了其他包含这些片段的链接,但我无法将它们组合成一个工作脚本(由于声誉低,链接未列出)

我的目标..

  1. 使用鼠标悬停在 d3 图形上的索引值
  2. 使用站点 ID 填充第一列(站点数量并不总是相同)
  3. 使用图表中的相同颜色填充第二列与相应的放电值
  4. 根据查找填充第三列... StationId : StationName
  5. 根据下游预定顺序(非字母顺序)对结果进行排序

部分数据集如下

    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 非常陌生。如果有人指导或向我展示一个工作示例或关于我做错了什么的建议,我将不胜感激。

【问题讨论】:

  • 您的数据集不包含站号和名称
  • @Justin 正如 jhyap 提到的,您的数据集似乎没有 StationID 和 name 字段。您能否澄清数据集中的不同字段代表什么。目前,仅清楚数据集中的每个条目都有一个“日期”条目。每个数据点中的其他 2 个字段(及其值)代表什么?
  • 抱歉给您带来了困惑...有时您与您正在做的事情有点太接近了。每条记录都有一个带有关联日期值的日期字段,后跟与 n 个排放值关联的 n 个站点。在上面的数据集中有 3 条记录,每条记录都有一个日期和 2 个站点/放电数据对。
  • @JustinMayers 我已根据您的回复编辑了代码。让我知道,以防它没有提供您期望的输出。
  • @jithinpt 谢谢。您的代码建议已考虑到上面列出的 #2 和 #3 目标的一部分。除了手头的代码 sn-p 之外,我还能够找出 #4 和 #5 目标。可以帮助我完成#3 目标的最后一部分吗?为了清楚地重申它。我希望仅使第二列中的文本(放电值)与图表上相应线的颜色相匹配。我试图将.style('color', function (d) {return colour(d.name); 添加到单元格变量中,但它可以预见地适用于整个身体,在这种情况下,它会应用看似随机的颜色。再次感谢。

标签: javascript html json d3.js


【解决方案1】:

基本上,updateTable 中执行的数据绑定似乎是不正确的。 rowscells的初始化方式不对。

编辑我已经更改了建议的代码。以下代码应该为您提供必要的表格输出

在 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 中的数据填充表格的前两列

EDIT为了将表中的放电值颜色改为其对应的曲线颜色,将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}
    })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    相关资源
    最近更新 更多