d3
Version:
A small, free JavaScript library for manipulating documents based on data.
143 lines (137 loc) • 23.8 kB
HTML
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>d3.js ~ Chord Diagram</title>
<script type="text/javascript" src="../d3.js?1.12.0"></script>
<style type="text/css">
@import url("../style.css?1.10.0");
@import url("../syntax.css?1.6.0");
</style>
</head>
<body>
<div class="body">
<div class="content">
<div class="topbar">
<a href="../">Overview</a>
<b><a href="../ex/">Examples</a></b>
<a href="../api/">Documentation</a>
<a href="http://github.com/mbostock/d3/archives/master">Download</a>
</div>
<div class="sidebar">
<h1>d3.js</h1>
</div>
<h1 id='chord_diagram'>Chord Diagram</h1>
<div id='chart'> </div><link href='chord.css' rel='stylesheet' type='text/css' /><script src='../d3.layout.js?1.12.0' type='text/javascript'> </script><script src='chord.js' type='text/javascript'> </script>
<p>Layout inspired by <a href='http://mkweb.bcgsc.ca/'>Martin Krzywinski</a>’s beautiful work on <a href='http://mkweb.bcgsc.ca/circos/'>Circos</a>.</p>
<h3 id='source_code'>Source Code</h3>
<div class='highlight'><pre><code class='js'><span class='lineno'> 1</span> <span class='c1'>// From http://mkweb.bcgsc.ca/circos/guide/tables/</span>
<span class='lineno'> 2</span> <span class='kd'>var</span> <span class='nx'>chord</span> <span class='o'>=</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>layout</span><span class='p'>.</span><span class='nx'>chord</span><span class='p'>()</span>
<span class='lineno'> 3</span> <span class='p'>.</span><span class='nx'>padding</span><span class='p'>(.</span><span class='mi'>05</span><span class='p'>)</span>
<span class='lineno'> 4</span> <span class='p'>.</span><span class='nx'>sortSubgroups</span><span class='p'>(</span><span class='nx'>d3</span><span class='p'>.</span><span class='nx'>descending</span><span class='p'>)</span>
<span class='lineno'> 5</span> <span class='p'>.</span><span class='nx'>matrix</span><span class='p'>([</span>
<span class='lineno'> 6</span> <span class='p'>[</span><span class='mi'>11975</span><span class='p'>,</span> <span class='mi'>5871</span><span class='p'>,</span> <span class='mi'>8916</span><span class='p'>,</span> <span class='mi'>2868</span><span class='p'>],</span>
<span class='lineno'> 7</span> <span class='p'>[</span> <span class='mi'>1951</span><span class='p'>,</span> <span class='mi'>10048</span><span class='p'>,</span> <span class='mi'>2060</span><span class='p'>,</span> <span class='mi'>6171</span><span class='p'>],</span>
<span class='lineno'> 8</span> <span class='p'>[</span> <span class='mi'>8010</span><span class='p'>,</span> <span class='mi'>16145</span><span class='p'>,</span> <span class='mi'>8090</span><span class='p'>,</span> <span class='mi'>8045</span><span class='p'>],</span>
<span class='lineno'> 9</span> <span class='p'>[</span> <span class='mi'>1013</span><span class='p'>,</span> <span class='mi'>990</span><span class='p'>,</span> <span class='mi'>940</span><span class='p'>,</span> <span class='mi'>6907</span><span class='p'>]</span>
<span class='lineno'>10</span> <span class='p'>]);</span>
<span class='lineno'>11</span>
<span class='lineno'>12</span> <span class='kd'>var</span> <span class='nx'>w</span> <span class='o'>=</span> <span class='mi'>600</span><span class='p'>,</span>
<span class='lineno'>13</span> <span class='nx'>h</span> <span class='o'>=</span> <span class='mi'>600</span><span class='p'>,</span>
<span class='lineno'>14</span> <span class='nx'>r0</span> <span class='o'>=</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>min</span><span class='p'>(</span><span class='nx'>w</span><span class='p'>,</span> <span class='nx'>h</span><span class='p'>)</span> <span class='o'>*</span> <span class='p'>.</span><span class='mi'>41</span><span class='p'>,</span>
<span class='lineno'>15</span> <span class='nx'>r1</span> <span class='o'>=</span> <span class='nx'>r0</span> <span class='o'>*</span> <span class='mf'>1.1</span><span class='p'>;</span>
<span class='lineno'>16</span>
<span class='lineno'>17</span> <span class='kd'>var</span> <span class='nx'>fill</span> <span class='o'>=</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>scale</span><span class='p'>.</span><span class='nx'>ordinal</span><span class='p'>()</span>
<span class='lineno'>18</span> <span class='p'>.</span><span class='nx'>domain</span><span class='p'>(</span><span class='nx'>d3</span><span class='p'>.</span><span class='nx'>range</span><span class='p'>(</span><span class='mi'>4</span><span class='p'>))</span>
<span class='lineno'>19</span> <span class='p'>.</span><span class='nx'>range</span><span class='p'>([</span><span class='s2'>"#000000"</span><span class='p'>,</span> <span class='s2'>"#FFDD89"</span><span class='p'>,</span> <span class='s2'>"#957244"</span><span class='p'>,</span> <span class='s2'>"#F26223"</span><span class='p'>]);</span>
<span class='lineno'>20</span>
<span class='lineno'>21</span> <span class='kd'>var</span> <span class='nx'>svg</span> <span class='o'>=</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>select</span><span class='p'>(</span><span class='s2'>"#chart"</span><span class='p'>)</span>
<span class='lineno'>22</span> <span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:svg"</span><span class='p'>)</span>
<span class='lineno'>23</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"width"</span><span class='p'>,</span> <span class='nx'>w</span><span class='p'>)</span>
<span class='lineno'>24</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"height"</span><span class='p'>,</span> <span class='nx'>h</span><span class='p'>)</span>
<span class='lineno'>25</span> <span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:g"</span><span class='p'>)</span>
<span class='lineno'>26</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"transform"</span><span class='p'>,</span> <span class='s2'>"translate("</span> <span class='o'>+</span> <span class='nx'>w</span> <span class='o'>/</span> <span class='mi'>2</span> <span class='o'>+</span> <span class='s2'>","</span> <span class='o'>+</span> <span class='nx'>h</span> <span class='o'>/</span> <span class='mi'>2</span> <span class='o'>+</span> <span class='s2'>")"</span><span class='p'>);</span>
<span class='lineno'>27</span>
<span class='lineno'>28</span> <span class='nx'>svg</span><span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:g"</span><span class='p'>)</span>
<span class='lineno'>29</span> <span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"path"</span><span class='p'>)</span>
<span class='lineno'>30</span> <span class='p'>.</span><span class='nx'>data</span><span class='p'>(</span><span class='nx'>chord</span><span class='p'>.</span><span class='nx'>groups</span><span class='p'>)</span>
<span class='lineno'>31</span> <span class='p'>.</span><span class='nx'>enter</span><span class='p'>().</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:path"</span><span class='p'>)</span>
<span class='lineno'>32</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"fill"</span><span class='p'>,</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='p'>{</span> <span class='k'>return</span> <span class='nx'>fill</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>index</span><span class='p'>);</span> <span class='p'>})</span>
<span class='lineno'>33</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"stroke"</span><span class='p'>,</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='p'>{</span> <span class='k'>return</span> <span class='nx'>fill</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>index</span><span class='p'>);</span> <span class='p'>})</span>
<span class='lineno'>34</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"d"</span><span class='p'>,</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>svg</span><span class='p'>.</span><span class='nx'>arc</span><span class='p'>().</span><span class='nx'>innerRadius</span><span class='p'>(</span><span class='nx'>r0</span><span class='p'>).</span><span class='nx'>outerRadius</span><span class='p'>(</span><span class='nx'>r1</span><span class='p'>))</span>
<span class='lineno'>35</span> <span class='p'>.</span><span class='nx'>on</span><span class='p'>(</span><span class='s2'>"mouseover"</span><span class='p'>,</span> <span class='nx'>fade</span><span class='p'>(.</span><span class='mi'>1</span><span class='p'>))</span>
<span class='lineno'>36</span> <span class='p'>.</span><span class='nx'>on</span><span class='p'>(</span><span class='s2'>"mouseout"</span><span class='p'>,</span> <span class='nx'>fade</span><span class='p'>(</span><span class='mi'>1</span><span class='p'>));</span>
<span class='lineno'>37</span>
<span class='lineno'>38</span> <span class='kd'>var</span> <span class='nx'>ticks</span> <span class='o'>=</span> <span class='nx'>svg</span><span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:g"</span><span class='p'>)</span>
<span class='lineno'>39</span> <span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"g"</span><span class='p'>)</span>
<span class='lineno'>40</span> <span class='p'>.</span><span class='nx'>data</span><span class='p'>(</span><span class='nx'>chord</span><span class='p'>.</span><span class='nx'>groups</span><span class='p'>)</span>
<span class='lineno'>41</span> <span class='p'>.</span><span class='nx'>enter</span><span class='p'>().</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:g"</span><span class='p'>)</span>
<span class='lineno'>42</span> <span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"g"</span><span class='p'>)</span>
<span class='lineno'>43</span> <span class='p'>.</span><span class='nx'>data</span><span class='p'>(</span><span class='nx'>groupTicks</span><span class='p'>)</span>
<span class='lineno'>44</span> <span class='p'>.</span><span class='nx'>enter</span><span class='p'>().</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:g"</span><span class='p'>)</span>
<span class='lineno'>45</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"transform"</span><span class='p'>,</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>46</span> <span class='k'>return</span> <span class='s2'>"rotate("</span> <span class='o'>+</span> <span class='p'>(</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>angle</span> <span class='o'>*</span> <span class='mi'>180</span> <span class='o'>/</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>PI</span> <span class='o'>-</span> <span class='mi'>90</span><span class='p'>)</span> <span class='o'>+</span> <span class='s2'>")"</span>
<span class='lineno'>47</span> <span class='o'>+</span> <span class='s2'>"translate("</span> <span class='o'>+</span> <span class='nx'>r1</span> <span class='o'>+</span> <span class='s2'>",0)"</span><span class='p'>;</span>
<span class='lineno'>48</span> <span class='p'>});</span>
<span class='lineno'>49</span>
<span class='lineno'>50</span> <span class='nx'>ticks</span><span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:line"</span><span class='p'>)</span>
<span class='lineno'>51</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"x1"</span><span class='p'>,</span> <span class='mi'>1</span><span class='p'>)</span>
<span class='lineno'>52</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"y1"</span><span class='p'>,</span> <span class='mi'>0</span><span class='p'>)</span>
<span class='lineno'>53</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"x2"</span><span class='p'>,</span> <span class='mi'>5</span><span class='p'>)</span>
<span class='lineno'>54</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"y2"</span><span class='p'>,</span> <span class='mi'>0</span><span class='p'>)</span>
<span class='lineno'>55</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"stroke"</span><span class='p'>,</span> <span class='s2'>"#000"</span><span class='p'>);</span>
<span class='lineno'>56</span>
<span class='lineno'>57</span> <span class='nx'>ticks</span><span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:text"</span><span class='p'>)</span>
<span class='lineno'>58</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"x"</span><span class='p'>,</span> <span class='mi'>8</span><span class='p'>)</span>
<span class='lineno'>59</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"dy"</span><span class='p'>,</span> <span class='s2'>".35em"</span><span class='p'>)</span>
<span class='lineno'>60</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"text-anchor"</span><span class='p'>,</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>61</span> <span class='k'>return</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>angle</span> <span class='o'>></span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>PI</span> <span class='o'>?</span> <span class='s2'>"end"</span> <span class='o'>:</span> <span class='kc'>null</span><span class='p'>;</span>
<span class='lineno'>62</span> <span class='p'>})</span>
<span class='lineno'>63</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"transform"</span><span class='p'>,</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>64</span> <span class='k'>return</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>angle</span> <span class='o'>></span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>PI</span> <span class='o'>?</span> <span class='s2'>"rotate(180)translate(-16)"</span> <span class='o'>:</span> <span class='kc'>null</span><span class='p'>;</span>
<span class='lineno'>65</span> <span class='p'>})</span>
<span class='lineno'>66</span> <span class='p'>.</span><span class='nx'>text</span><span class='p'>(</span><span class='kd'>function</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='p'>{</span> <span class='k'>return</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>label</span><span class='p'>;</span> <span class='p'>});</span>
<span class='lineno'>67</span>
<span class='lineno'>68</span> <span class='nx'>svg</span><span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:g"</span><span class='p'>)</span>
<span class='lineno'>69</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"class"</span><span class='p'>,</span> <span class='s2'>"chord"</span><span class='p'>)</span>
<span class='lineno'>70</span> <span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"path"</span><span class='p'>)</span>
<span class='lineno'>71</span> <span class='p'>.</span><span class='nx'>data</span><span class='p'>(</span><span class='nx'>chord</span><span class='p'>.</span><span class='nx'>chords</span><span class='p'>)</span>
<span class='lineno'>72</span> <span class='p'>.</span><span class='nx'>enter</span><span class='p'>().</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:path"</span><span class='p'>)</span>
<span class='lineno'>73</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"fill"</span><span class='p'>,</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='p'>{</span> <span class='k'>return</span> <span class='nx'>fill</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>target</span><span class='p'>.</span><span class='nx'>index</span><span class='p'>);</span> <span class='p'>})</span>
<span class='lineno'>74</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"d"</span><span class='p'>,</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>svg</span><span class='p'>.</span><span class='nx'>chord</span><span class='p'>().</span><span class='nx'>radius</span><span class='p'>(</span><span class='nx'>r0</span><span class='p'>))</span>
<span class='lineno'>75</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"opacity"</span><span class='p'>,</span> <span class='mi'>1</span><span class='p'>);</span>
<span class='lineno'>76</span>
<span class='lineno'>77</span> <span class='cm'>/** Returns an array of tick angles and labels, given a group. */</span>
<span class='lineno'>78</span> <span class='kd'>function</span> <span class='nx'>groupTicks</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>79</span> <span class='kd'>var</span> <span class='nx'>k</span> <span class='o'>=</span> <span class='p'>(</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>endAngle</span> <span class='o'>-</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>startAngle</span><span class='p'>)</span> <span class='o'>/</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>value</span><span class='p'>;</span>
<span class='lineno'>80</span> <span class='k'>return</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>range</span><span class='p'>(</span><span class='mi'>0</span><span class='p'>,</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>value</span><span class='p'>,</span> <span class='mi'>1000</span><span class='p'>).</span><span class='nx'>map</span><span class='p'>(</span><span class='kd'>function</span><span class='p'>(</span><span class='nx'>v</span><span class='p'>,</span> <span class='nx'>i</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>81</span> <span class='k'>return</span> <span class='p'>{</span>
<span class='lineno'>82</span> <span class='nx'>angle</span><span class='o'>:</span> <span class='nx'>v</span> <span class='o'>*</span> <span class='nx'>k</span> <span class='o'>+</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>startAngle</span><span class='p'>,</span>
<span class='lineno'>83</span> <span class='nx'>label</span><span class='o'>:</span> <span class='nx'>i</span> <span class='o'>%</span> <span class='mi'>5</span> <span class='o'>?</span> <span class='kc'>null</span> <span class='o'>:</span> <span class='nx'>v</span> <span class='o'>/</span> <span class='mi'>1000</span> <span class='o'>+</span> <span class='s2'>"k"</span>
<span class='lineno'>84</span> <span class='p'>};</span>
<span class='lineno'>85</span> <span class='p'>});</span>
<span class='lineno'>86</span> <span class='p'>}</span>
<span class='lineno'>87</span>
<span class='lineno'>88</span> <span class='cm'>/** Returns an event handler for fading a given chord group. */</span>
<span class='lineno'>89</span> <span class='kd'>function</span> <span class='nx'>fade</span><span class='p'>(</span><span class='nx'>opacity</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>90</span> <span class='k'>return</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>g</span><span class='p'>,</span> <span class='nx'>i</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>91</span> <span class='nx'>svg</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"g.chord path"</span><span class='p'>)</span>
<span class='lineno'>92</span> <span class='p'>.</span><span class='nx'>filter</span><span class='p'>(</span><span class='kd'>function</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>93</span> <span class='k'>return</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>source</span><span class='p'>.</span><span class='nx'>index</span> <span class='o'>!=</span> <span class='nx'>i</span> <span class='o'>&&</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>target</span><span class='p'>.</span><span class='nx'>index</span> <span class='o'>!=</span> <span class='nx'>i</span><span class='p'>;</span>
<span class='lineno'>94</span> <span class='p'>})</span>
<span class='lineno'>95</span> <span class='p'>.</span><span class='nx'>transition</span><span class='p'>()</span>
<span class='lineno'>96</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"opacity"</span><span class='p'>,</span> <span class='nx'>opacity</span><span class='p'>);</span>
<span class='lineno'>97</span> <span class='p'>};</span>
<span class='lineno'>98</span> <span class='p'>}</span>
</code></pre>
</div>
</div>
<div class="foot">Copyright © 2011 <a href="http://bost.ocks.org/mike">Mike Bostock</a></div>
</div>
</div>
<a href="http://github.com/mbostock/d3"><img
style="position:absolute;top:0;right:0;border:0;"
width="149" height="149" src="../forkme.png" alt="Fork me on GitHub"
/></a>
</body>
</html>