2017-08-10 3 views
1

Je souhaite représenter mes données à partir de ce fichier JSON en tant que noeud-lien à l'aide de D3.js. Je suis nouveau sur JavaScript et D3.js. J'ai 3 types de données et je veux faire une hiérarchie entre ces 3 types de données. Parents> Source> Enfants, je veux placer tous les parents au-dessus de la source et le lien tous les parents à la source, et chaque enfant doit être sous la source et de les relier à la source:Comment est-ce que je devrais formater mon JSON et m'expliquer un lien de noeud graphique de base d3?

script.js

var width = 960, 
     height = 500; 

// i don't really understand what this does 
// except the .linkDistance - gives the dimension of the link 
var force = d3.layout.force() 
    .size([width, height]) 
    .charge(-400) 
    .linkDistance(40) 
    .on("tick", tick); 

// Drag the nodes 
var drag = force.drag() 
    .on("dragstart", dragstart); 

//Appends the svg - the place where i draw all my items 
var svg = d3.select("body").append("svg") 
    .attr("width", width) 
    .attr("height", height); 

// Select all the links and nodes , from an array ? i don't really get it 
var link = svg.selectAll(".link"), 
    node = svg.selectAll(".node"); 

// The function where i take the data from the JSON 
d3.json("graph.json", function(error, graph) { 
    if (error) throw error; 

    force 
     .nodes(graph.nodes) 
     .links(graph.links) 
     .start(); 

    link = link.data(graph.links) 
    .enter().append("line") 
     .attr("class", "link"); 

    node = node.data(graph.nodes) 
    .enter().append("circle") 
     .attr("class", "node") 
     .attr("r", 12) 
     .on("dblclick", dblclick) 
     .call(drag); 
}); 


// Here is the function where i should asign the position of the nodes and the links 
// This is the most problematic and i really don't understand it 
function tick(){} 

// The function to fix and to clear the fix from a node 
function dblclick(d) { 
    d3.select(this).classed("fixed", d.fixed = false); 
} 

function dragstart(d) { 
    d3.select(this).classed("fixed", d.fixed = true); 
} 

Index.html

<!DOCTYPE html> 
<html lang="en"> 

    <head> 
    <link rel="stylesheet" href="style.css"> 
     <meta charset="utf-8"> 
     <title>D3 Test</title> 
     <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>  
     <script src="script.js"></script> 
    </head> 
</body> 

style.css

.link { 
    stroke: #777; 
    stroke-width: 2px; 
} 
.nodes circle{ 
    cursor: move; 
    fill: #ccc; 
    stroke: #000; 
    stroke-width: 1.5px; 

} 
.node.fixed { 
    fill: #f00; 
} 

graph.json

{ 
    "nodes":[ 
    { 
     "id": "Source" , "group" :0 
    }, 
    { 
     "id":"Parent_1" , "group" : 1 
    }, 
    { 
     "id": "Parent_2" , "group" :1 
    }, 
    { 
     "id": "Parent_3" , "group" :1 
    }, 

    { 
     "id":"Child_1" , "group":2 
    }, 
    { 
     "id":"Child_2" , "group":2 
    }, 
    { 
     "id":"Child_3" , "group":2} 
    ], 
    "links":[ 
    { 
    "source":"Source","target":"Parent_1" 
    }, 
    { 
    "source":"Source","target":"Parent_2" 
    }, 
    { 
    "source":"Source","target":"Parent_3" 
    }, 
    { 
    "source":"Source","target":"Child_1" 
    }, 
    { 
    "source":"Source","target":"Child_2" 
    }, 
    { 
    "source":"Source","target":"Child_3" 
    }, 

    ] 



    } 

Si quelqu'un a le temps et l'envie de me expliquer comment formater mon JSON afin que je puisse l'utiliser plus efficacement et pour m'expliquer comment créer un graphe nœud-lien en utilisant d3 étape par étape ou donnez-moi une démo et expliquer chaque morceau de code, je serais très reconnaissant. S'il y a un problème concernant la façon dont j'ai posé la question ou s'il y a quelque chose qui n'est pas clair, dites-le donc je peux le modifier. Je vous remercie !

+1

C'est une grande question et beaucoup de travail à expliquer. Votre Json me semble bien en ce qu'il est correctement formaté et fournit des liens (reliant chaque enfant et parent à la "Source"). Vous pouvez certainement utiliser la force pour regrouper les parents/enfants dans le SVG. Avez-vous lu https://www.dashingd3js.com/ et http://d3indepth.com/about/. Si vous configurez un gist/block, jsfiddle, ou plunkr, alors vous pouvez tester votre code en action et les gens peuvent voir ce qui ne va pas. –

+0

Oui, j'ai regardé beaucoup de tutoriels et expliqué le code mais je n'ai toujours pas l'idée, merci pour les liens que je vais vérifier les vidéos gratuites. –

Répondre

0

Ok, en un mot, la force place tous vos nœuds sur un svg et leur donne beaucoup d'attributs, certains liés aux données, d'autres au comportement du graphe de force.

En général, les nœuds se repoussent, mais ce comportement peut être modifié en définissant la force de d3.forceManyBody. Les liens créeront une force entre les nœuds, qui peut être utilisée pour dessiner les nœuds ensemble, ou les maintenir à une distance définie les uns des autres.

Généralement, une force attirera tous les nœuds vers le centre du graphique, mais vous pouvez les configurer pour être attirés n'importe où. Dans votre cas, vous voulez un point en haut au centre (disons 25% vers le bas du SVG) pour attirer les nœuds parents (groupe 1) et un point centre botton (75% vers le bas du SVG) pour attirer les nœuds enfants (groupe 2). Vous pouvez définir le noeud source au centre;

var position = d3.forceSimulation(graph.nodes).force("charge", d3.forceManyBody()).force("x", d3.forceCenter(width/2, height/ 2)).force("collide", d3.forceCollide(15 * R)); 
    nodes.each(function(d) { 
     if (d.group == 0) { 
      d.fx = wid/2;//fix X value 
      d.fy = wid/2//fix Y value 
     } 
    }); 

si vous pouvez mettre en place un jsFiddle ou similaire et obtenir quelque chose que je travaille peut-être en mesure de voir où vous êtes coincé (il ressemble à vos commandes un peu hors de créer des liens avant les années de données chargées). De plus, vous êtes en train de charger la version 3 de d3, alors que vous démarrez, vous pouvez aussi basculer vers la version 4 maintenant. Edit: c'est ma compréhension de toute façon et je pense que les ressources que j'ai liées ci-dessus sont probablement beaucoup mieux!

+0

Bon, c'est un peu utile, j'essaie de réécrire le code et de configurer un jsfiddle comme vous le souhaitez, cela peut prendre du temps, alors restez en place. Merci encore ! –