【问题标题】:Drop down button to filter a d3.js graph用于过滤 d3.js 图形的下拉按钮
【发布时间】:2016-11-23 17:50:06
【问题描述】:

我有一个可以正常工作的图表,甚至可以过滤按钮单击时的数据。现在我正在尝试使用下拉按钮而不是常规按钮。当用户从下拉列表中选择 Amount 为 1000 或 2000 时,节点和链接应根据属性进行过滤

d.total_amt> 1000 or d.total_amt > 2000

HTML

    <style>
  .links line {
    stroke: #999;
    stroke-opacity: 0.6;
  }

  .nodes circle {
    stroke: #fff;
    stroke-width: 1.5px;
  }

  .nodes circle {
    stroke: #fff;
    stroke-width: 1.5px;
  }

  div.tooltip {
    position: absolute;
    background-color: white;
    max-width: 200px;
    height: auto;
    padding: 1px;
    border-style: solid;
    border-radius: 4px;
    border-width: 1px;
    box-shadow: 3px 3px 10px rgba(0, 0, 0, .5);
    pointer-events: none;
  }

</style>
<svg id="Network_graph" width="400" height="350"></svg>


  <label for="input ID">Amount</label>
  <select id="select_ID" name="select_ID">
    <option value="1000">1000</option>
    <option value="2000">2000</option>
   </select>
   <button id="full_data">
   full data
   </button>

JSON

    var IDData = JSON.stringify([
  ["node/105173", "node/38180995", "Agent", "Customer", "1379644.0", 1, 264, "1374903"],
  ["node/1061", "node/21373542", "Agent", "Customer", "530848.0", 1, 3000, "529502"],
  ["node/10750", "node/59648369", "Agent", "Customer", "1454228.0", 1, 120, "1454118"],
  ["node/10750", "node/78569210", "Agent", "Customer", "1425251.0", 1, 234, "1421416"],
  ["node/10750", "node/96726118", "Agent", "Customer", "1376239.0", 1, 434, "1376152"],
  ["node/10946829", "node/11190", "Customer", "Agent", "1409620.0", 20, 3380, "1406665"],
  ["node/10946829", "node/57774036", "Customer", "Customer", "1460029.0", 3, 960, "1459731"],
  ["node/109947", "node/97911872", "Agent", "Customer", "1323025.0", 1, 600, "1315582"],..])

下面是一段代码,它将使这些数据以适合呈现图形的格式:

var galData = JSON.parse(IDData);
var startnodes = [];
var endnodes = [];
var startnodetype = [];
var endnodetype = [];
var PayTime = [];
var TXN_COUNT = [];
var Total_Amt = [];
var SendTime = [];
galData.map(function(e, i) {
  startnodes.push(e[0]);
  endnodes.push(e[1]);
  startnodetype.push(e[2]);
  endnodetype.push(e[3]);
  PayTime.push(e[4]);
  TXN_COUNT.push(e[5]);
  Total_Amt.push(e[6]);
  SendTime.push(e[7]);
});
var final_data = createNodes(startnodes, endnodes, startnodetype, endnodetype, PayTime, TXN_COUNT, Total_Amt, SendTime);
makeGraph("#Network_graph", final_data);

我使用这些数据制作了一个力有向图。 Jsfiddle 是工作图的链接。

现在我正在尝试为数据过滤添加下拉菜单。这是保持下拉选择的代码部分

    d3.select(this)  //right way to hold on to the selection or need some jquery?
.selectAll("option")
.filter(function(d, i) {
  return this.selected;
});

这段代码使用filter函数来过滤节点和链接。

    function isUnique(id, nodes) {
      for (var i = 0; i < nodes.length; i++) {
        if (nodes[i].id == id) {
          return false;
        }
      }
      return true;
    }

  var filtered_data = [];
  var nodes = [];
  var links = [];
  d3.selectAll("line").filter(function(d, i) {
    if (d.total_amt > this.value) {
      if (isUnique(d.source.id, nodes)) {
        nodes.push(d.source);
      }

      if (isUnique(d.target.id, nodes)) {
        nodes.push(d.target);
      }
      links.push(d);
    }
  });
  filtered_data.links = links;
  filtered_data.nodes = nodes;
  filtered_data.nodetype = final_data.nodetype;

  d3.select('#Network_graph').selectAll("*").remove();
  makeGraph("#Network_graph", filtered_data); 

上述方法有意义吗?所以,到目前为止,这还没有奏效。我不知道缺少的部分是什么。我也对其他可能更适合下拉菜单的想法持开放态度。仍然在 d3.js /javascript 周围找到我的方式。期待一些帮助。

【问题讨论】:

    标签: javascript jquery html d3.js drop-down-menu


    【解决方案1】:

    好的

    这是您需要的代码:

    var elem = document.getElementById('select_ID');
    elem.addEventListener("change", onSelectChange);
    
    function onSelectChange(){
      var value = this.value;
      var fdata = filteredData(value);
      d3.select('#Network_graph').selectAll("*").remove();
      makeGraph("#Network_graph", fdata);
    }
    

    为了在您的选择选项更改时执行某些操作。选择元素并为其附加一个事件侦听器(在本例中为更改)。

    var elem = document.getElementById('select_ID');
    elem.addEventListener("change", onSelectChange);
    

    并在这个更改事件中使用this.value 获取值,正如您已经说过的并进行过滤。

    这是小提琴:https://jsfiddle.net/tgv6s5cd/14/

    【讨论】:

    • 再次感谢您。但是 d.total_amt > this.value 对吗?而不是 d.total_amt > 2000。
    • @optimus_prime 啊抱歉忘记更改变量。已更新。
    • 不用担心..最后一件事..我想要的是 full_data 按钮仍然显示 full_data 。并下拉与过滤数据按钮相关联。应该更好地提出这个问题。我为相同的代码修改了一些代码并搞砸了一些东西。 Fiddle.
    • @optimus_prime 所以如果用户选择 1000 应该重新绘制图形还是改变不透明度?还是用户会选择 1000/2000,然后选择一个过滤器,然后根据过滤器改变不透明度?
    • 不透明度与过滤器无关。当用户选择 1000/2000 时,应该相应地重绘图表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2016-03-10
    • 2013-09-05
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多