【问题标题】:d3.js V3 force directed graph and unlinked nodesd3.js V3 强制有向图和未链接节点
【发布时间】:2018-02-18 10:32:50
【问题描述】:

我正在做我的第一个数据可视化项目。更多的是练习,学习 d3.js 作为数据可视化我很感兴趣。

我的第一个项目是制作一个力有向图。数据集是与其毗邻州相关的 50 个州。

源是状态,目标是边界状态。

夏威夷和阿拉斯加没有接壤的国家。

如果我在 csv 文件中将目标状态留空,它们会通过一个空字符串的中间节点相互连接。

如果我将它们的目标设为不同长度的空字符串,它们显然会附加到节点上。这几乎没问题,但现在我的工具提示上有带有空白值的节点。

只是不是 100% 干净。

我不确定这是否可能,让节点没有任何链接。

csv sn-p

Georgia,North Carolina
Georgia,South Carolina
Georgia,Tennessee
Hawaii,
Idaho,Montana
Idaho,Nevada
Idaho,Oregon

创建节点列表

var nodesList = {}

data.forEach((link) => {
  link.source = nodesList[link.source] ||
    (nodesList[link.source] = { name: link.source });
  link.target = nodesList[link.target] ||
    (nodesList[link.target] = { name: link.target });
});

我尝试在那里写一个条件,如果来源是阿拉斯加或夏威夷,将 name 设置为 null,但这也不起作用。

感谢您的帮助!

【问题讨论】:

  • 尽管您的问题很清楚,但如果没有您提供的工作代码,这很难回答(否则,我们将不得不从头开始编写代码以提供一个答案)。所以,在某个地方设置一个minimal reproducible example(fiddle、blockbuilder、plunker 等......)

标签: javascript d3.js


【解决方案1】:

很难说你在做什么,因为我们看不到你的所有代码,但似乎基本问题是你希望夏威夷和阿拉斯加在你的节点列表中,而不是在你的链接列表中。

最简单的做法是,因为您知道所有状态,所以只需拥有一个 states.csv 文件。然后只需从您的 csv 制作一个链接列表,它应该很简单:

var links = []

data.forEach(link => {
    if (link[0] && link[1]) links.push({source: link[0], target: link[1]})
});

或者如果您更喜欢地图和过滤器:

var links = data
  .filter(link => link[0] && link[1])
  .map(link => ({source: link[0], target: link[1]}))

这是一个将状态列表截断为仅链接中状态的版本

var svg = d3.select("svg"),
    width = +svg.attr("width"),
    height = +svg.attr("height");

var color = d3.scaleOrdinal(d3.schemeCategory20);

var simulation = d3.forceSimulation()
    .force("link", d3.forceLink().id(function(d) { return d.id; }))
    .force("charge", d3.forceManyBody())
    .force("center", d3.forceCenter(width / 2, height / 2));

var states = [
     {id:"Georgia",abbreviation:"GA"},
     {id:"Hawaii",abbreviation:"HI"},
     {id:"Idaho",abbreviation:"ID"},
     {id:"Montana",abbreviation:"MT"},
     {id:"Nevada",abbreviation:"NV"},
     {id:"North Carolina",abbreviation:"NC"},
     {id:"Oregon",abbreviation:"OR"},
     {id:"South Carolina",abbreviation:"SC"},
     {id:"Tennessee",abbreviation:"TN"},
]

var data = [
     ['Georgia','North Carolina'],
     ['Georgia','South Carolina'],
     ['Georgia','Tennessee'],
     ['Hawaii'],
     ['Idaho',  'Montana'],
     ['Idaho',  'Nevada'],
     ['Idaho',  'Oregon']
]


var links = data.filter(link => link[0] && link[1])
            .map(link => ({source: link[0], target: link[1]}))
  

  var link = svg.append("g")
      .attr("class", "links")
    .selectAll("line")
    .data(links)
    .enter().append("line")
      .attr("stroke-width", 1);

  var node = svg.append("g")
      .attr("class", "nodes")
    .selectAll("circle")
    .data(states)
    .enter().append("circle")
      .attr("r", 5)
    .call(d3.drag()
          .on("start", dragstarted)
          .on("drag", dragged)
          .on("end", dragended));

  node.append("title")
      .text(function(d) { return d.abbreviation; });

  simulation
      .nodes(states)
      .on("tick", ticked);

  simulation.force("link")
      .links(links);

  function ticked() {
    link
        .attr("x1", function(d) { return d.source.x; })
        .attr("y1", function(d) { return d.source.y; })
        .attr("x2", function(d) { return d.target.x; })
        .attr("y2", function(d) { return d.target.y; });

    node
        .attr("cx", function(d) { return d.x; })
        .attr("cy", function(d) { return d.y; });
  }

function dragstarted(d) {
  if (!d3.event.active) simulation.alphaTarget(0.3).restart();
  d.fx = d.x;
  d.fy = d.y;
}

function dragged(d) {
  d.fx = d3.event.x;
  d.fy = d3.event.y;
}

function dragended(d) {
  if (!d3.event.active) simulation.alphaTarget(0);
  d.fx = null;
  d.fy = null;
}
.links line {
  stroke: #999;
  stroke-opacity: 0.6;
}

.nodes circle {
  stroke: #fff;
  stroke-width: 1.5px;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width="500" height="200"></svg>

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 2015-03-02
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2016-02-21
    • 2020-09-01
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多