Skip to content

TylerRick/d3-force-labels

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

D3 Force Labels

Demo: https://bl.ocks.org/TylerRick/c5df6e777a9de71777b4c4b449abfae8

Generates an automatic and dynamic positioning for labels, using d3.forceSimulation().

Usage

Pass in a selection of the objects you want to attach labels to.

labelSim = d3.forceLabels(anchors)

forceLabels() returns a d3.forceSimulation() object which allows full control over the charge strength, etc.

For example, to change the charge strength, you could do something like this:

labelSim.force('charge').strength(-60);

At each tick the following occurs:

  • Center of each object (anchor position) is determined by the SVG Bounding Box of that object and stored in object anchorPos under x,y
  • The position of the label element is determined by a force layout where anchors are fixed nodes and labels are floating. New position for each label is stored in object labelPos under x,y

Both the anchorPos and labelPos are inserted in the __data__ variable of the object being labeled. This allows easy access when drawing the labels and connectors.

In the demo the label and link are created as svg objects on the same data selection as the anchors. As the position information is embedded in __data__, the redraw function is simply:

function redrawLabels() {
  labelBox
    .attr("transform", function(d) {
      return "translate(" + d.labelPos.x + " " + d.labelPos.y + ")"
    })

  links
    .attr("x1", function(d) { return d.anchorPos.x })
    .attr("y1", function(d) { return d.anchorPos.y })
    .attr("x2", function(d) { return d.labelPos.x })
    .attr("y2", function(d) { return d.labelPos.y })
}

which is attached like this:

labelSim = d3.forceLabels(anchors)
  .on("tick", redrawLabels)

Authors

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published