skip to Main Content

I am new at d3.js. I am working with force directed graph. I made 3d nodes of graph. All nodes have same color. I want to change color of nodes and want to apply random colors. Can anybody help me?

here is my code:

    var   w = 1000,
      h =  800,
      circleWidth = 5; 


var palette = {
      "lightgray": "#E5E8E8",
      "gray": "#708284",
      "mediumgray": "#536870",
      "blue": "#3B757F"
  }

var colors = d3.scale.category20();

var nodes = [
      { name: "My Skills"},
      { name: "HTML5", target: [0], value: 58 },
      { name: "CSS3", target: [0, 1], value: 65 },  
      { name: ".NET", target: [0, 3], value: 48 }, 
      { name: "Java", target: [0,3,4], value: 40 }, 
      { name: "jQuery", target: [0, 1, 2], value: 52 },
      { name: "Photoshop", target: [0, 1, 2, 8], value: 37 },
      { name: "PHP", target: [0,1,2], value: 20 },
      { name: "Wordpress", target: [0,1,2,3,9], value: 67 },
      { name: "d3", target: [0,1,2,7,8], value: 25 },
      { name: "Angular", target: [0,1,2,7,8], value: 25 },
      { name: "Adobe CS", target: [0,1,2,12], value: 57 },
      { name: "mySql", target: [0,9,10], value: 20 },
];

var links = [];

for (var i = 0; i < nodes.length; i++){
      if (nodes[i].target !== undefined) { 
            for ( var x = 0; x < nodes[i].target.length; x++ ) 
              links.push({
                  source: nodes[i],
                  target: nodes[nodes[i].target[x]]  
              });
      };
};




var myChart = d3.select('body')
      .append("div")
        .classed("svg-container", true)

      .append('svg')
        .attr("preserveAspectRatio", "xMinYMin meet")
        .attr("viewBox", "0 0 1000 800")
        .classed("svg-content-responsive", true)


var force = d3.layout.force()
      .nodes(nodes)
      .links([])
      .gravity(0.1)
      .charge(-1000)
      .size([w,h]); 





      var link = myChart.selectAll('line') 
            .data(links).enter().append('line')
            .attr('stroke', palette.lightgray)
            .attr('strokewidth', '1');

      var node =  myChart.selectAll('circle')  
            .data(nodes).enter() 
            .append('g') 
            .call(force.drag); 
var grads = myChart.append("defs").selectAll("radialGradient")
    .data(nodes)
   .enter()
    .append("radialGradient")
    .attr("gradientUnits", "objectBoundingBox")
    .attr("cx","20%")
    .attr("cy", "30%")
    .attr("r", "100%")
    .attr("id", function(d, i) { return "grad" + i; });

grads.append("stop")
    .attr("offset", "0%")
    .style("stop-color", "white");

grads.append("stop")
    .attr("offset", "100%")
    .style("stop-color",  function(d) { return colors(d.cluster); });

     node.append('circle')
            .attr('cx', function(d){return d.x; })
            .attr('cy', function(d){return d.y; })
            .attr('fx', function(d){return d.x; })
            .attr('fy', function(d){return d.y; })
            .attr('r', function(d,i){
                  console.log(d.value);
                  if ( i > 0 ) {
                        return circleWidth + d.value; 
                  } else {
                        return circleWidth + 35; 
                  }
            })

            .attr('fill', function(d,i){
                  if ( i > 0 ) {
              return "url(#grad" + i + ")";

                 } else {
                       return '#fff';
                }
            })
            .attr('strokewidth', function(d,i){
                  if ( i > 0 ) {
                        return '0';
                  } else {
                        return '2';
                  }
            })
            .attr('stroke', function(d,i){
                  if ( i > 0 ) {
                        return '';
                  } else {
                        return 'black';
                  }
            });


      force.on('tick', function(e){ 
            node.attr('transform', function(d, i){
              return 'translate(' + d.x + ','+ d.y + ')'
            })

          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.append('text')
            .text(function(d){ return d.name; })
            .attr('font-family', 'Raleway', 'Helvetica Neue, Helvetica')
            .attr('fill', function(d, i){
              console.log(d.value);
                  if ( i > 0 && d.value < 10 ) {
                        return palette.mediumgray;
                  } else if ( i > 0 && d.value >10 ) {
                        return palette.lightgray;
                  } else {
                        return palette.blue;
                  }
            })
            .attr('text-anchor', function(d, i) {
                  return 'middle';
            })
            .attr('font-size', function(d, i){
                  if (i > 0) {
                        return '.8em';
                  } else {
                        return '.9em';    
                  }
            }) 

force.start();

2

Answers


  1. You can do like this:

    define a color scale

    var color = d3.scale.category10();
    

    Then in the fill of the circle do:

    .attr('fill', function(d,i){
                     return color(i);
                })
    
    Login or Signup to reply.
  2. You have to use node index instead of d.cluster in your code because there are no multiple clusters in your data array.

    grads.append("stop")
       .attr("offset", "100%")
       .style("stop-color", function(d,i) {
         return colors(i);
       });
    
    var w = 1000,
       h = 800,
       circleWidth = 5;
    
    
     var palette = {
       "lightgray": "#E5E8E8",
       "gray": "#708284",
       "mediumgray": "#536870",
       "blue": "#3B757F"
     }
    
     var colors = d3.scale.category20();
    
     var nodes = [{
       name: "My Skills"
     }, {
       name: "HTML5",
       target: [0],
       value: 58
     }, {
       name: "CSS3",
       target: [0, 1],
       value: 65
     }, {
       name: ".NET",
       target: [0, 3],
       value: 48
     }, {
       name: "Java",
       target: [0, 3, 4],
       value: 40
     }, {
       name: "jQuery",
       target: [0, 1, 2],
       value: 52
     }, {
       name: "Photoshop",
       target: [0, 1, 2, 8],
       value: 37
     }, {
       name: "PHP",
       target: [0, 1, 2],
       value: 20
     }, {
       name: "Wordpress",
       target: [0, 1, 2, 3, 9],
       value: 67
     }, {
       name: "d3",
       target: [0, 1, 2, 7, 8],
       value: 25
     }, {
       name: "Angular",
       target: [0, 1, 2, 7, 8],
       value: 25
     }, {
       name: "Adobe CS",
       target: [0, 1, 2, 12],
       value: 57
     }, {
       name: "mySql",
       target: [0, 9, 10],
       value: 20
     }, ];
    
     var links = [];
    
     for (var i = 0; i < nodes.length; i++) {
       if (nodes[i].target !== undefined) {
         for (var x = 0; x < nodes[i].target.length; x++)
           links.push({
             source: nodes[i],
             target: nodes[nodes[i].target[x]]
           });
       };
     };
    
    
    
    
     var myChart = d3.select('body')
       .append("div")
       .classed("svg-container", true)
    
     .append('svg')
       .attr("preserveAspectRatio", "xMinYMin meet")
       .attr("viewBox", "0 0 1000 800")
       .classed("svg-content-responsive", true)
    
    
     var force = d3.layout.force()
       .nodes(nodes)
       .links([])
       .gravity(0.1)
       .charge(-1000)
       .size([w, h]);
    
    
    
    
    
     var link = myChart.selectAll('line')
       .data(links).enter().append('line')
       .attr('stroke', palette.lightgray)
       .attr('strokewidth', '1');
    
     var node = myChart.selectAll('circle')
       .data(nodes).enter()
       .append('g')
       .call(force.drag);
    
     var grads = myChart.append("defs").selectAll("radialGradient")
       .data(nodes)
       .enter()
       .append("radialGradient")
       .attr("gradientUnits", "objectBoundingBox")
       .attr("cx", "20%")
       .attr("cy", "30%")
       .attr("r", "100%")
       .attr("id", function(d, i) {
         return "grad" + i;
       });
    
     grads.append("stop")
       .attr("offset", "0%")
       .style("stop-color", "white");
    
     grads.append("stop")
       .attr("offset", "100%")
       .style("stop-color", function(d, i) {
         return colors(i);
       });
    
     node.append('circle')
       .attr('cx', function(d) {
         return d.x;
       })
       .attr('cy', function(d) {
         return d.y;
       })
       .attr('fx', function(d) {
         return d.x;
       })
       .attr('fy', function(d) {
         return d.y;
       })
       .attr('r', function(d, i) {
    
    
         if (i > 0) {
           return circleWidth + d.value;
         } else {
           return circleWidth + 35;
         }
       })
    
     .attr('fill', function(d, i) {
         if (i > 0) {
           return "url(#grad" + i + ")";
    
         } else {
           return '#fff';
         }
       })
       .attr('strokewidth', function(d, i) {
         if (i > 0) {
           return '0';
         } else {
           return '2';
         }
       })
       .attr('stroke', function(d, i) {
         if (i > 0) {
           return '';
         } else {
           return 'black';
         }
       });
    
    
     force.on('tick', function(e) {
       node.attr('transform', function(d, i) {
         return 'translate(' + d.x + ',' + d.y + ')'
       })
    
       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.append('text')
       .text(function(d) {
         return d.name;
       })
       .attr('font-family', 'Raleway', 'Helvetica Neue, Helvetica')
       .attr('fill', function(d, i) {
    
         if (i > 0 && d.value < 10) {
           return palette.mediumgray;
         } else if (i > 0 && d.value > 10) {
           return palette.lightgray;
         } else {
           return palette.blue;
         }
       })
       .attr('text-anchor', function(d, i) {
         return 'middle';
       })
       .attr('font-size', function(d, i) {
         if (i > 0) {
           return '.8em';
         } else {
           return '.9em';
         }
       })
    
     force.start();
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search