【问题标题】:Static Force Directed Graph links not correct length [duplicate]静态力有向图链接长度不正确[重复]
【发布时间】:2015-06-19 10:11:46
【问题描述】:

我正在尝试创建一个静态力有向图。加载时没有任何动画。这是我要模拟的内容:http://bl.ocks.org/mbostock/1667139

我有以下 D3 图:

var width = $("#theVizness").width(),
    height = $("#theVizness").height();

var color = d3.scale.ordinal().range(["#ff0000", "#fff000", "#ff4900"]);

var force = d3.layout.force()
    .charge(-120)
    .linkDistance(30)
    .size([width, height]);

var svg = d3.select("#theVizness").append("svg")
    .attr("width", width)
    .attr("height", height);

var loading = svg.append("text")
    .attr("class", "loading")
    .attr("x", width / 2)
    .attr("y", height / 2)
    .attr("dy", ".35em")
    .style("text-anchor", "middle")
    .text("Loading...");

d3.json("https://dl.dropboxusercontent.com/u/5772230/ForceDirectData.json", function (error, json) {
    var nodes = json.nodes;
    force.nodes(nodes)
        .links(json.links)
        .linkDistance(function (d) {
            return d.value * 1.5;
        })
        .friction(0.4);

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

        var files = svg.selectAll(".file")
        .data(json.nodes)
        .enter().append("circle")
        .attr("class", "file")
        .attr("r", 10)
        .attr("fill", function (d) {
            return color(d.colorGroup);
        });
    var totalNodes = files[0].length;

    files.append("title")
        .text(function (d) { return d.name; });

    force.start();
    for (var i = totalNodes * totalNodes; i > 0; --i) force.tick();
    force.stop();

    nodes[0].x = width / 2;
    nodes[0].y = height / 2;

    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; });

    files.attr("cx", function (d) { return d.x; })
        .attr("cy", function (d) { return d.y; })
        .attr("class", function(d){
            var classString = "file"

            if (d.index === 0) classString += " rootFile";

            return classString;
        })
        .attr("r", function(d){
            var radius = 10;

            if (d.index === 0) radius = radius * 2;

            return radius;
        });

    loading.remove();
});

这是我的数据:https://dl.dropboxusercontent.com/u/5772230/ForceDirectData.json

{
    "nodes":[
      {"name":"File1.exe","colorGroup":0},
      {"name":"File2.exe","colorGroup":0},
      {"name":"File3.exe","colorGroup":0},
      {"name":"File4.exe","colorGroup":0},
      {"name":"File5.exe","colorGroup":0},
      {"name":"File6.exe","colorGroup":0},
      {"name":"File7.exe","colorGroup":0},
      {"name":"File8.exe","colorGroup":0},
      {"name":"File8.exe","colorGroup":0},
      {"name":"File9.exe","colorGroup":0}
    ],
    "links":[
      {"source":1,"target":0,"value":10},
      {"source":2,"target":0,"value":35},
      {"source":3,"target":0,"value":50},
      {"source":4,"target":0,"value":50},
      {"source":5,"target":0,"value":65},
      {"source":6,"target":0,"value":65},
      {"source":7,"target":0,"value":81},
      {"source":8,"target":0,"value":98},
      {"source":9,"target":0,"value":100}
    ]
}

Fiddle

根据我对 bl.ocks 页面的理解,该图运行 tick 方法一定次数。但我的问题是节点之间的链接长度与我在 JSON 文件中的长度不成比例。

我选择了静态图表,因为我不想让图表变成动画,就像在 standard graph 中一样。

为什么我的节点链接与我的 JSON 文件不匹配?

【问题讨论】:

    标签: javascript json d3.js force-layout


    【解决方案1】:

    我不明白你的问题。

    这是你的意思吗?

    var width = $("#theVizness").width(),
        height = $("#theVizness").height();
    
    var color = d3.scale.ordinal().range(["#ff0000", "#fff000", "#ff4900"]);
    
    var force = d3.layout.force()
        .charge(-120)
        .linkDistance(30)
        .size([width, height]);
    
    var svg = d3.select("#theVizness").append("svg")
        .attr("width", width)
        .attr("height", height);
    
    var loading = svg.append("text")
        .attr("class", "loading")
        .attr("x", width / 2)
        .attr("y", height / 2)
        .attr("dy", ".35em")
        .style("text-anchor", "middle")
        .text("Loading...");
    
    d3.json("https://dl.dropboxusercontent.com/u/5772230/ForceDirectData.json", function (error, json) {
        var nodes = json.nodes;
        force.nodes(nodes)
            .links(json.links)
            .linkDistance(function (d) {
                return d.value * 1.5;
            })
            .friction(0.4);
    
        var link = svg.selectAll(".link")
            .data(json.links)
            .enter().append("line")
            .attr("class", "link")              
            .style("stroke-width", 1);
    
            var files = svg.selectAll(".file")
            .data(json.nodes)
            .enter().append("circle")
            .attr("class", "file")
            .attr("r", 10)
            .attr("fill", function (d) {
                return color(d.colorGroup);
            });
        var totalNodes = files[0].length;
    
        files.append("title")
            .text(function (d) { return d.name; });
    
        force.start();
        for (var i = totalNodes * totalNodes; i > 0; --i) force.tick();
    
    
        nodes[0].x = width / 2;
        nodes[0].y = height / 2;
    
        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; });
    
        files.attr("cx", function (d) { return d.x; })
            .attr("cy", function (d) { return d.y; })
            .attr("class", function(d){
                var classString = "file"
    
                if (d.index === 0) classString += " rootFile";
    
                return classString;
            })
            .attr("r", function(d){
                var radius = 10;
    
                if (d.index === 0) radius = radius * 2;
    
                return radius;
            });
        force.on("tick", function() {
        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; });
    
        files.attr("cx", function(d) { return d.x; })
            .attr("cy", function(d) { return d.y; });
      });
    
        loading.remove();
    
      }); 
    

    JSFiddle

    【讨论】:

    • 这并不能完全解决我的问题,但很有帮助。你介意评论一下你的改变吗?我仍在学习 D3,并且正在熟悉它的功能。
    • 我已经修改了我的问题。希望现在更清楚了。
    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2016-01-20
    • 2014-01-14
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多