Giter Site home page Giter Site logo

Node placement problem about d3-sankey HOT 3 CLOSED

d3 avatar d3 commented on July 19, 2024 1
Node placement problem

from d3-sankey.

Comments (3)

cosmin-novac avatar cosmin-novac commented on July 19, 2024 1

+1

I'm interested in a solution to this problem as well. I've found some ideas here, but haven't found a no concrete solution yet.

from d3-sankey.

cirofdo avatar cirofdo commented on July 19, 2024

I came with a solution that I'm still working on, but it is a specific to the problem you have.

The idea is to change the "class" attribute to all nodes, so you can manually change its position.

For example:

  • Links class: .attr("class", function(d) { return "link " + d.source.name + " " + d.target.name; })
  • Nodes class: .attr("class", function(d) { return "node " + d.name; })

Now you can change the position on the .css.

PS: I'm really new to html, css and js programming (less than 4 months). If this is not recommended I'll be pleased to know.

from d3-sankey.

mbostock avatar mbostock commented on July 19, 2024

This library performs relaxation in passes of alternating directions, from right-to-left and then left-to-right. When relaxing from left-to-right, it moves each node’s following nodes (the targets of the node’s source links) towards the node’s center; for example, it tries to center B around the center of A. Likewise when relaxing from right-to-left, it moves each node’s preceding nodes (the sources of the node’s target links) towards the node’s center; for example, it tries to center B around the weighted average centers of C, G and D.

In this example, the primary problem is the left-to-right pass, where it moves the center of B up towards the center of A. (There’s a similar but lesser problem moving the center of B up towards the center of C as part of the right-to-left pass, but it’s mitigated because the weighted average center of C, G and D is used.)

A better heuristic would probably try to contain B within the span of A on the left-to-right pass (and similarly for the right-to-left pass), but simply changing to that heuristic instead of the move-to-center heuristic does not work well because it greatly increases the overlap between links. Currently, there is no penalty when a link passes through a node, such as the link from B to G that passes through C.

Fixing this problem in general requires a more thorough redesign of how the layout is optimized. It might also require the insertion of dummy nodes, so that when a link spans more than one topological layer (such as B→G), it can be routed through a dummy node to avoid overlap with other nodes in the intermediate layers (such as B→dummy→G, where the dummy then avoids collision with C).

So, the short summary of this issue is “the generated layout could be better” and the answer is “yes, but it’s hard”, and I may get around to working on it sometime in the future but I don’t have a concrete plan for doing so in the short term, and so I’m going to close this issue. However, contributions for better layout heuristics and algorithms are welcome!

from d3-sankey.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.