0

这是我的示例 js 文件,我需要绘制一个和弦,但是是日食形状而不是圆形。其次,我需要知道在创建和弦图时使用矩阵是什么,我们是否能够使用简单的 json 文件(不使用矩阵)绘制和弦,如http://www.delimited.io/blog/2013/12/所述8/chord-diagrams-in-d3这里。因为在和弦的每个示例中,都会给出一些矩阵来绘制它。我是 d3 的新手,我需要学习很多东西。任何人都可以帮助真正感激它

var outerRadius = 500 / 2,
innerRadius = outerRadius - 100;

var fill = d3.scale.category20c();

var chord = d3.layout.chord()
.padding(.04)
.sortSubgroups(d3.descending)
.sortChords(d3.descending);

var arc = d3.svg.arc()
.innerRadius(innerRadius)
.outerRadius(innerRadius + 20);

var svg = d3.select('#content').append("svg")
.attr("width", outerRadius * 2)
.attr("height", outerRadius * 2)
.append("g")
.attr("transform", "translate(" + outerRadius + "," + outerRadius +      

")");


d3.json("readme.json", function(error, imports) {
if (error) throw error;

var indexByName = d3.map(),
  nameByIndex = d3.map(),
  matrix = [],
  n = 0;

// Returns the Flare package name for the given class name.
function name(name) {
return name.substring(0, name.lastIndexOf(".")).substring(6);
}

// Compute a unique index for each package name.
imports.forEach(function(d) {
if (!indexByName.has(d = name(d.name))) {
  nameByIndex.set(n, d);
  indexByName.set(d, n++);
}
});

 // Construct a square matrix counting package imports.
 imports.forEach(function(d) {
  var source = indexByName.get(name(d.name)),
    row = matrix[source];
  if (!row) {
  row = matrix[source] = [];
  for (var i = -1; ++i < n;) row[i] = 0;
}
  d.imports.forEach(function(d) { row[indexByName.get(name(d))]++; });
  });

 chord.matrix(matrix);

 var g = svg.selectAll("g.group")
   .data(chord.groups())
   .enter().append("svg:g")
   .attr("class", "group")

 .on("mouseover", fade(.02))
    .on("mouseout", fade(.80));
 //  .on("mouseover", mouseover);
   //.on("mouseout", fade(1));

  g.append("svg:path")
    .style("stroke", "none")
    .style("fill", function(d) { return fill(d.index); })
    .attr("d", arc);
/* g.append("path")
  .style("fill", function(d) { return fill(d.index); })
  .style("stroke", function(d) { return fill(d.index); })
  .attr("d", arc);*/

    g.append("text")
    .each(function(d) { d.angle = (d.startAngle + d.endAngle) / 2; })
    .attr("dy", ".35em")
    .attr("transform", function(d) {
    return "rotate(" + (d.angle * 180 / Math.PI - 90) + ")"
    + "translate(" + (innerRadius + 26) + ")"
    + (d.angle > Math.PI ? "rotate(180)" : "");
    })
   .style("text-anchor", function(d) { return d.angle > Math.PI ?   "end" : null; })
  .text(function(d) { return nameByIndex.get(d.index); });

  svg.selectAll(".chord")
  .data(chord.chords)
 .enter().append("path")
  .attr("class", "chord")
  .style("stroke", function(d) { return  
  d3.rgb(fill(d.source.index)).darker(); })
  .style("fill", function(d) { return fill(d.source.index); })
//.style("opacity", 1)
  .attr("d", d3.svg.chord().radius(innerRadius));

 });


  d3.select(self.frameElement).style("height", outerRadius * 5 +   "px");
4

1 回答 1

0
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
  #tooltip {
    color: white;
    opacity: .9;
    background: #333;
    padding: 5px;
    border: 1px solid lightgrey;
    border-radius: 5px;
    position: absolute;
    z-index: 10;
    visibility: hidden;
    white-space: nowrap;
    pointer-events: none;
  }
  #circle circle {
    fill: none;
    pointer-events: all;
  }
  path.group {
    fill-opacity: .8;
  }
  path.chord {
    fill-opacity: .8;
    stroke: #000;
    stroke-width: .25px;
  }
  #circle:hover path.fade {
    display: none;
  }
</style>
    </head>
   <body>
<div id="tooltip"></div>
<script src="lib/d3.js"></script>
<script src="lib/underscore.js"></script>
<script src="js/mapper.js"></script>
<script>


 //*******************************************************************
  //  CREATE MATRIX AND MAP

 //*******************************************************************
  d3.csv('data/CNV.csv', function (error, data) {


    var mpr = chordMpr(data);

    mpr
      .addValuesToMap('chr_no')
      .addValuesToMap('MUT')

    mpr  .setFilter(function (row, a, b) {
        return (row.chr_no === a.name && row.MUT === b.name) ||
               (row.chr_no === b.name && row.MUT === a.name)

      })
      .setAccessor(function (recs, a, b) {
        if (!recs[0]) return 0;
          return recs[0].MUT === a.name ? +recs[0].chr_start :    
  +recs[0].chr_stop ; 
      });
    drawChords(mpr.getMatrix(), mpr.getMap());
  });


 //*******************************************************************
  //  DRAW THE CHORD DIAGRAM

//*******************************************************************
  function drawChords (matrix, mmap) {
    var w = 980, h = 800, r1 = h / 2, r0 = r1 - 110;

    var fill = d3.scale.ordinal()

  .range(['#c7b570','#c6cdc7','#335c64','#768935',
  '#507282','#5c4a56','#aa7455','#574109','#837722',
'#73342d','#0a5564','#9c8f57','#7895a4','#4a5456',
'#b0a690','#0a3542',]);

    var chord = d3.layout.chord()
        .padding(.04)
        .sortSubgroups(d3.descending)
        .sortChords(d3.descending);

    var arc = d3.svg.arc()
        .innerRadius(r0)
        .outerRadius(r0 + 20);

    var svg = d3.select("body").append("svg:svg")
        .attr("width", w)
        .attr("height", h)
      .append("svg:g")
        .attr("id", "circle")
        .attr("transform", "translate(" + w / 2 + "," + h / 2 + ")");

        svg.append("circle")
            .attr("r", r0 + 20);

    var rdr = chordRdr(matrix, mmap);
    chord.matrix(matrix);

    var g = svg.selectAll("g.group")
        .data(chord.groups())
      .enter().append("svg:g")
        .attr("class", "group")
        .on("mouseover", mouseover)
        .on("mouseout", function (d) {    
  d3.select("#tooltip").style("visibility", "hidden") });

    g.append("svg:path")
        .style("stroke", "black")
        .style("fill", function(d) { return fill(rdr(d).gname); })
        .attr("d", arc);

    g.append("svg:text")
        .each(function(d) { d.angle = (d.startAngle + d.endAngle) / 2;      
     })
        .attr("dy", ".35em")
        .style("font-family", "helvetica, arial, sans-serif")
        .style("font-size", "9px")
        .attr("text-anchor", function(d) { return d.angle > Math.PI ? 
       "end" : null; })
        .attr("transform", function(d) {
          return "rotate(" + (d.angle * 180 / Math.PI - 90) + ")"
              + "translate(" + (r0 + 26) + ")"
              + (d.angle > Math.PI ? "rotate(180)" : "");
        })
        .text(function(d) { return rdr(d).gname; });

      var chordPaths = svg.selectAll("path.chord")
            .data(chord.chords())
          .enter().append("svg:path")
            .attr("class", "chord")
            .style("stroke", function(d) { return 
       d3.rgb(fill(rdr(d).sname)).darker(); })
            .style("fill", function(d) { return fill(rdr(d).sname); })
            .attr("d", d3.svg.chord().radius(r0))
            .on("mouseover", function (d) {
              d3.select("#tooltip")
                .style("visibility", "visible")
                .html(chordTip(rdr(d)))
                .style("top", function () { return (d3.event.pageY - 
       170)+"px"})
                .style("left", function () { return (d3.event.pageX - 
           100)+"px";})
            })
            .on("mouseout", function (d) { 
         d3.select("#tooltip").style("visibility", "hidden") });


      function chordTip (d) {

  var p = d3.format(".0%"), q = d3.format("0d")
        return "Choromosome information:<br/>"
          + q(d.sname) + " overlap with " + d.tname +"  " +
 "<br/>chromosome starts at"+" "+ d.sdata +"  " +
 "<br/>chromosome ends at"+ " "+ d.tdata

      }


      }

      function mouseover(d, i) {
        d3.select("#tooltip")
          .style("visibility", "visible")
          .html(groupTip(rdr(d)))
          .style("top", function () { return (d3.event.pageY - 80)+"px"})
          .style("left", function () { return (d3.event.pageX - 130)+"px";})

        chordPaths.classed("fade", function(p) {
          return p.source.index != i
              && p.target.index != i;
        });
      }
  }

</script>

于 2015-11-06T15:09:51.227 回答