UNPKG

d3

Version:

A small, free JavaScript library for manipulating documents based on data.

211 lines (205 loc) 41 kB
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>d3.js ~ Scatterplot Matrix</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='scatterplot_matrix'>Scatterplot Matrix</h1> <div id='chart'> </div><link href='splom.css' rel='stylesheet' type='text/css' /><script src='cross.js' type='text/javascript'> </script><script src='splom.js' type='text/javascript'> </script> <p>Scatterplot matrix design invented by J. A. Hartigan; see also <a href='http://www.r-project.org/'>R</a> and <a href='http://www.ggobi.org/'>GGobi</a>. Data on <em>Iris</em> flowers collected by Edgar Anderson and published by Ronald Fisher.</p> <h3 id='source_code'>Source Code</h3> <div class='highlight'><pre><code class='js'><span class='lineno'> 1</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>json</span><span class='p'>(</span><span class='s2'>&quot;flowers.json&quot;</span><span class='p'>,</span> <span class='kd'>function</span><span class='p'>(</span><span class='nx'>flower</span><span class='p'>)</span> <span class='p'>{</span> <span class='lineno'> 2</span> <span class='lineno'> 3</span> <span class='c1'>// Size parameters.</span> <span class='lineno'> 4</span> <span class='kd'>var</span> <span class='nx'>size</span> <span class='o'>=</span> <span class='mi'>150</span><span class='p'>,</span> <span class='lineno'> 5</span> <span class='nx'>padding</span> <span class='o'>=</span> <span class='mi'>20</span><span class='p'>;</span> <span class='lineno'> 6</span> <span class='lineno'> 7</span> <span class='c1'>// Color scale.</span> <span class='lineno'> 8</span> <span class='kd'>var</span> <span class='nx'>color</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='nx'>range</span><span class='p'>([</span> <span class='lineno'> 9</span> <span class='s2'>&quot;rgb(50%, 0%, 0%)&quot;</span><span class='p'>,</span> <span class='lineno'> 10</span> <span class='s2'>&quot;rgb(0%, 50%, 0%)&quot;</span><span class='p'>,</span> <span class='lineno'> 11</span> <span class='s2'>&quot;rgb(0%, 0%, 50%)&quot;</span> <span class='lineno'> 12</span> <span class='p'>]);</span> <span class='lineno'> 13</span> <span class='lineno'> 14</span> <span class='c1'>// Position scales.</span> <span class='lineno'> 15</span> <span class='kd'>var</span> <span class='nx'>position</span> <span class='o'>=</span> <span class='p'>{};</span> <span class='lineno'> 16</span> <span class='nx'>flower</span><span class='p'>.</span><span class='nx'>traits</span><span class='p'>.</span><span class='nx'>forEach</span><span class='p'>(</span><span class='kd'>function</span><span class='p'>(</span><span class='nx'>trait</span><span class='p'>)</span> <span class='p'>{</span> <span class='lineno'> 17</span> <span class='kd'>function</span> <span class='nx'>value</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'>trait</span><span class='p'>];</span> <span class='p'>}</span> <span class='lineno'> 18</span> <span class='nx'>position</span><span class='p'>[</span><span class='nx'>trait</span><span class='p'>]</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'>linear</span><span class='p'>()</span> <span class='lineno'> 19</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'>min</span><span class='p'>(</span><span class='nx'>flower</span><span class='p'>.</span><span class='nx'>values</span><span class='p'>,</span> <span class='nx'>value</span><span class='p'>),</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>max</span><span class='p'>(</span><span class='nx'>flower</span><span class='p'>.</span><span class='nx'>values</span><span class='p'>,</span> <span class='nx'>value</span><span class='p'>)])</span> <span class='lineno'> 20</span> <span class='p'>.</span><span class='nx'>range</span><span class='p'>([</span><span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>,</span> <span class='nx'>size</span> <span class='o'>-</span> <span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>]);</span> <span class='lineno'> 21</span> <span class='p'>});</span> <span class='lineno'> 22</span> <span class='lineno'> 23</span> <span class='c1'>// Root panel.</span> <span class='lineno'> 24</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'>&quot;#chart&quot;</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'>&quot;svg:svg&quot;</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'>&quot;width&quot;</span><span class='p'>,</span> <span class='nx'>size</span> <span class='o'>*</span> <span class='nx'>flower</span><span class='p'>.</span><span class='nx'>traits</span><span class='p'>.</span><span class='nx'>length</span><span class='p'>)</span> <span class='lineno'> 27</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;height&quot;</span><span class='p'>,</span> <span class='nx'>size</span> <span class='o'>*</span> <span class='nx'>flower</span><span class='p'>.</span><span class='nx'>traits</span><span class='p'>.</span><span class='nx'>length</span><span class='p'>);</span> <span class='lineno'> 28</span> <span class='lineno'> 29</span> <span class='c1'>// One column per trait.</span> <span class='lineno'> 30</span> <span class='kd'>var</span> <span class='nx'>column</span> <span class='o'>=</span> <span class='nx'>svg</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>&quot;g&quot;</span><span class='p'>)</span> <span class='lineno'> 31</span> <span class='p'>.</span><span class='nx'>data</span><span class='p'>(</span><span class='nx'>flower</span><span class='p'>.</span><span class='nx'>traits</span><span class='p'>)</span> <span class='lineno'> 32</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'>&quot;svg:g&quot;</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'>&quot;transform&quot;</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='nx'>i</span><span class='p'>)</span> <span class='p'>{</span> <span class='k'>return</span> <span class='s2'>&quot;translate(&quot;</span> <span class='o'>+</span> <span class='nx'>i</span> <span class='o'>*</span> <span class='nx'>size</span> <span class='o'>+</span> <span class='s2'>&quot;,0)&quot;</span><span class='p'>;</span> <span class='p'>});</span> <span class='lineno'> 34</span> <span class='lineno'> 35</span> <span class='c1'>// One row per trait.</span> <span class='lineno'> 36</span> <span class='kd'>var</span> <span class='nx'>row</span> <span class='o'>=</span> <span class='nx'>column</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>&quot;g&quot;</span><span class='p'>)</span> <span class='lineno'> 37</span> <span class='p'>.</span><span class='nx'>data</span><span class='p'>(</span><span class='nx'>cross</span><span class='p'>(</span><span class='nx'>flower</span><span class='p'>.</span><span class='nx'>traits</span><span class='p'>))</span> <span class='lineno'> 38</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'>&quot;svg:g&quot;</span><span class='p'>)</span> <span class='lineno'> 39</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;transform&quot;</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='nx'>i</span><span class='p'>)</span> <span class='p'>{</span> <span class='k'>return</span> <span class='s2'>&quot;translate(0,&quot;</span> <span class='o'>+</span> <span class='nx'>i</span> <span class='o'>*</span> <span class='nx'>size</span> <span class='o'>+</span> <span class='s2'>&quot;)&quot;</span><span class='p'>;</span> <span class='p'>});</span> <span class='lineno'> 40</span> <span class='lineno'> 41</span> <span class='c1'>// X-ticks. TODO Cross the trait into the tick data?</span> <span class='lineno'> 42</span> <span class='nx'>row</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>&quot;line.x&quot;</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='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'>position</span><span class='p'>[</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>].</span><span class='nx'>ticks</span><span class='p'>(</span><span class='mi'>5</span><span class='p'>).</span><span class='nx'>map</span><span class='p'>(</span><span class='nx'>position</span><span class='p'>[</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>]);</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'>&quot;svg:line&quot;</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'>&quot;class&quot;</span><span class='p'>,</span> <span class='s2'>&quot;x&quot;</span><span class='p'>)</span> <span class='lineno'> 46</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;x1&quot;</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='p'>})</span> <span class='lineno'> 47</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;x2&quot;</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='p'>})</span> <span class='lineno'> 48</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;y1&quot;</span><span class='p'>,</span> <span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>)</span> <span class='lineno'> 49</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;y2&quot;</span><span class='p'>,</span> <span class='nx'>size</span> <span class='o'>-</span> <span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>);</span> <span class='lineno'> 50</span> <span class='lineno'> 51</span> <span class='c1'>// Y-ticks. TODO Cross the trait into the tick data?</span> <span class='lineno'> 52</span> <span class='nx'>row</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>&quot;line.y&quot;</span><span class='p'>)</span> <span class='lineno'> 53</span> <span class='p'>.</span><span class='nx'>data</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'>position</span><span class='p'>[</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>].</span><span class='nx'>ticks</span><span class='p'>(</span><span class='mi'>5</span><span class='p'>).</span><span class='nx'>map</span><span class='p'>(</span><span class='nx'>position</span><span class='p'>[</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>]);</span> <span class='p'>})</span> <span class='lineno'> 54</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'>&quot;svg:line&quot;</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'>&quot;class&quot;</span><span class='p'>,</span> <span class='s2'>&quot;y&quot;</span><span class='p'>)</span> <span class='lineno'> 56</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;x1&quot;</span><span class='p'>,</span> <span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>)</span> <span class='lineno'> 57</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;x2&quot;</span><span class='p'>,</span> <span class='nx'>size</span> <span class='o'>-</span> <span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</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'>&quot;y1&quot;</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='p'>})</span> <span class='lineno'> 59</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;y2&quot;</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='p'>});</span> <span class='lineno'> 60</span> <span class='lineno'> 61</span> <span class='c1'>// Frame.</span> <span class='lineno'> 62</span> <span class='nx'>row</span><span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>&quot;svg:rect&quot;</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'>&quot;x&quot;</span><span class='p'>,</span> <span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>)</span> <span class='lineno'> 64</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;y&quot;</span><span class='p'>,</span> <span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>)</span> <span class='lineno'> 65</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;width&quot;</span><span class='p'>,</span> <span class='nx'>size</span> <span class='o'>-</span> <span class='nx'>padding</span><span class='p'>)</span> <span class='lineno'> 66</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;height&quot;</span><span class='p'>,</span> <span class='nx'>size</span> <span class='o'>-</span> <span class='nx'>padding</span><span class='p'>)</span> <span class='lineno'> 67</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;fill&quot;</span><span class='p'>,</span> <span class='s2'>&quot;none&quot;</span><span class='p'>)</span> <span class='lineno'> 68</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;stroke&quot;</span><span class='p'>,</span> <span class='s2'>&quot;#aaa&quot;</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'>&quot;stroke-width&quot;</span><span class='p'>,</span> <span class='mf'>1.5</span><span class='p'>)</span> <span class='lineno'> 70</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;pointer-events&quot;</span><span class='p'>,</span> <span class='s2'>&quot;all&quot;</span><span class='p'>)</span> <span class='lineno'> 71</span> <span class='p'>.</span><span class='nx'>on</span><span class='p'>(</span><span class='s2'>&quot;mousedown&quot;</span><span class='p'>,</span> <span class='nx'>mousedown</span><span class='p'>);</span> <span class='lineno'> 72</span> <span class='lineno'> 73</span> <span class='c1'>// Dot plot.</span> <span class='lineno'> 74</span> <span class='kd'>var</span> <span class='nx'>dot</span> <span class='o'>=</span> <span class='nx'>row</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>&quot;circle&quot;</span><span class='p'>)</span> <span class='lineno'> 75</span> <span class='p'>.</span><span class='nx'>data</span><span class='p'>(</span><span class='nx'>cross</span><span class='p'>(</span><span class='nx'>flower</span><span class='p'>.</span><span class='nx'>values</span><span class='p'>))</span> <span class='lineno'> 76</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'>&quot;svg:circle&quot;</span><span class='p'>)</span> <span class='lineno'> 77</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;cx&quot;</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'>position</span><span class='p'>[</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>](</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>[</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>]);</span> <span class='p'>})</span> <span class='lineno'> 78</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;cy&quot;</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'>size</span> <span class='o'>-</span> <span class='nx'>position</span><span class='p'>[</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>](</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>[</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>]);</span> <span class='p'>})</span> <span class='lineno'> 79</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;r&quot;</span><span class='p'>,</span> <span class='mi'>3</span><span class='p'>)</span> <span class='lineno'> 80</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;fill&quot;</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'>color</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>.</span><span class='nx'>species</span><span class='p'>);</span> <span class='p'>})</span> <span class='lineno'> 81</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;fill-opacity&quot;</span><span class='p'>,</span> <span class='p'>.</span><span class='mi'>5</span><span class='p'>)</span> <span class='lineno'> 82</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;pointer-events&quot;</span><span class='p'>,</span> <span class='s2'>&quot;none&quot;</span><span class='p'>);</span> <span class='lineno'> 83</span> <span class='lineno'> 84</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>select</span><span class='p'>(</span><span class='nb'>window</span><span class='p'>)</span> <span class='lineno'> 85</span> <span class='p'>.</span><span class='nx'>on</span><span class='p'>(</span><span class='s2'>&quot;mousemove&quot;</span><span class='p'>,</span> <span class='nx'>mousemove</span><span class='p'>)</span> <span class='lineno'> 86</span> <span class='p'>.</span><span class='nx'>on</span><span class='p'>(</span><span class='s2'>&quot;mouseup&quot;</span><span class='p'>,</span> <span class='nx'>mouseup</span><span class='p'>);</span> <span class='lineno'> 87</span> <span class='lineno'> 88</span> <span class='kd'>var</span> <span class='nx'>rect</span><span class='p'>,</span> <span class='nx'>x0</span><span class='p'>,</span> <span class='nx'>x1</span><span class='p'>,</span> <span class='nx'>count</span><span class='p'>;</span> <span class='lineno'> 89</span> <span class='lineno'> 90</span> <span class='kd'>function</span> <span class='nx'>mousedown</span><span class='p'>()</span> <span class='p'>{</span> <span class='lineno'> 91</span> <span class='nx'>x0</span> <span class='o'>=</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>svg</span><span class='p'>.</span><span class='nx'>mouse</span><span class='p'>(</span><span class='k'>this</span><span class='p'>);</span> <span class='lineno'> 92</span> <span class='nx'>count</span> <span class='o'>=</span> <span class='mi'>0</span><span class='p'>;</span> <span class='lineno'> 93</span> <span class='lineno'> 94</span> <span class='nx'>rect</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='k'>this</span><span class='p'>.</span><span class='nx'>parentNode</span><span class='p'>)</span> <span class='lineno'> 95</span> <span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>&quot;svg:rect&quot;</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'>&quot;fill&quot;</span><span class='p'>,</span> <span class='s2'>&quot;#999&quot;</span><span class='p'>)</span> <span class='lineno'> 97</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;fill-opacity&quot;</span><span class='p'>,</span> <span class='p'>.</span><span class='mi'>5</span><span class='p'>);</span> <span class='lineno'> 98</span> <span class='lineno'> 99</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>event</span><span class='p'>.</span><span class='nx'>preventDefault</span><span class='p'>();</span> <span class='lineno'>100</span> <span class='p'>}</span> <span class='lineno'>101</span> <span class='lineno'>102</span> <span class='kd'>function</span> <span class='nx'>mousemove</span><span class='p'>()</span> <span class='p'>{</span> <span class='lineno'>103</span> <span class='k'>if</span> <span class='p'>(</span><span class='o'>!</span><span class='nx'>rect</span><span class='p'>)</span> <span class='k'>return</span><span class='p'>;</span> <span class='lineno'>104</span> <span class='nx'>x1</span> <span class='o'>=</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>svg</span><span class='p'>.</span><span class='nx'>mouse</span><span class='p'>(</span><span class='nx'>rect</span><span class='p'>.</span><span class='nx'>node</span><span class='p'>());</span> <span class='lineno'>105</span> <span class='lineno'>106</span> <span class='nx'>x1</span><span class='p'>[</span><span class='mi'>0</span><span class='p'>]</span> <span class='o'>=</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>max</span><span class='p'>(</span><span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>,</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>min</span><span class='p'>(</span><span class='nx'>size</span> <span class='o'>-</span> <span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>,</span> <span class='nx'>x1</span><span class='p'>[</span><span class='mi'>0</span><span class='p'>]));</span> <span class='lineno'>107</span> <span class='nx'>x1</span><span class='p'>[</span><span class='mi'>1</span><span class='p'>]</span> <span class='o'>=</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>max</span><span class='p'>(</span><span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>,</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>min</span><span class='p'>(</span><span class='nx'>size</span> <span class='o'>-</span> <span class='nx'>padding</span> <span class='o'>/</span> <span class='mi'>2</span><span class='p'>,</span> <span class='nx'>x1</span><span class='p'>[</span><span class='mi'>1</span><span class='p'>]));</span> <span class='lineno'>108</span> <span class='lineno'>109</span> <span class='kd'>var</span> <span class='nx'>minx</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'>x0</span><span class='p'>[</span><span class='mi'>0</span><span class='p'>],</span> <span class='nx'>x1</span><span class='p'>[</span><span class='mi'>0</span><span class='p'>]),</span> <span class='lineno'>110</span> <span class='nx'>maxx</span> <span class='o'>=</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>max</span><span class='p'>(</span><span class='nx'>x0</span><span class='p'>[</span><span class='mi'>0</span><span class='p'>],</span> <span class='nx'>x1</span><span class='p'>[</span><span class='mi'>0</span><span class='p'>]),</span> <span class='lineno'>111</span> <span class='nx'>miny</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'>x0</span><span class='p'>[</span><span class='mi'>1</span><span class='p'>],</span> <span class='nx'>x1</span><span class='p'>[</span><span class='mi'>1</span><span class='p'>]),</span> <span class='lineno'>112</span> <span class='nx'>maxy</span> <span class='o'>=</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>max</span><span class='p'>(</span><span class='nx'>x0</span><span class='p'>[</span><span class='mi'>1</span><span class='p'>],</span> <span class='nx'>x1</span><span class='p'>[</span><span class='mi'>1</span><span class='p'>]);</span> <span class='lineno'>113</span> <span class='lineno'>114</span> <span class='nx'>rect</span> <span class='lineno'>115</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;x&quot;</span><span class='p'>,</span> <span class='nx'>minx</span> <span class='o'>-</span> <span class='p'>.</span><span class='mi'>5</span><span class='p'>)</span> <span class='lineno'>116</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;y&quot;</span><span class='p'>,</span> <span class='nx'>miny</span> <span class='o'>-</span> <span class='p'>.</span><span class='mi'>5</span><span class='p'>)</span> <span class='lineno'>117</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;width&quot;</span><span class='p'>,</span> <span class='nx'>maxx</span> <span class='o'>-</span> <span class='nx'>minx</span> <span class='o'>+</span> <span class='mi'>1</span><span class='p'>)</span> <span class='lineno'>118</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;height&quot;</span><span class='p'>,</span> <span class='nx'>maxy</span> <span class='o'>-</span> <span class='nx'>miny</span> <span class='o'>+</span> <span class='mi'>1</span><span class='p'>);</span> <span class='lineno'>119</span> <span class='lineno'>120</span> <span class='kd'>var</span> <span class='nx'>v</span> <span class='o'>=</span> <span class='nx'>rect</span><span class='p'>.</span><span class='nx'>node</span><span class='p'>().</span><span class='nx'>__data__</span><span class='p'>,</span> <span class='lineno'>121</span> <span class='nx'>x</span> <span class='o'>=</span> <span class='nx'>position</span><span class='p'>[</span><span class='nx'>v</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>],</span> <span class='lineno'>122</span> <span class='nx'>y</span> <span class='o'>=</span> <span class='nx'>position</span><span class='p'>[</span><span class='nx'>v</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>],</span> <span class='lineno'>123</span> <span class='nx'>mins</span> <span class='o'>=</span> <span class='nx'>x</span><span class='p'>.</span><span class='nx'>invert</span><span class='p'>(</span><span class='nx'>minx</span><span class='p'>),</span> <span class='lineno'>124</span> <span class='nx'>maxs</span> <span class='o'>=</span> <span class='nx'>x</span><span class='p'>.</span><span class='nx'>invert</span><span class='p'>(</span><span class='nx'>maxx</span><span class='p'>),</span> <span class='lineno'>125</span> <span class='nx'>mint</span> <span class='o'>=</span> <span class='nx'>y</span><span class='p'>.</span><span class='nx'>invert</span><span class='p'>(</span><span class='nx'>size</span> <span class='o'>-</span> <span class='nx'>maxy</span><span class='p'>),</span> <span class='lineno'>126</span> <span class='nx'>maxt</span> <span class='o'>=</span> <span class='nx'>y</span><span class='p'>.</span><span class='nx'>invert</span><span class='p'>(</span><span class='nx'>size</span> <span class='o'>-</span> <span class='nx'>miny</span><span class='p'>);</span> <span class='lineno'>127</span> <span class='lineno'>128</span> <span class='nx'>count</span> <span class='o'>=</span> <span class='mi'>0</span><span class='p'>;</span> <span class='lineno'>129</span> <span class='nx'>svg</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>&quot;circle&quot;</span><span class='p'>)</span> <span class='lineno'>130</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;fill&quot;</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'>131</span> <span class='k'>return</span> <span class='nx'>mins</span> <span class='o'>&lt;=</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>[</span><span class='nx'>v</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>]</span> <span class='o'>&amp;&amp;</span> <span class='nx'>maxs</span> <span class='o'>&gt;=</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>[</span><span class='nx'>v</span><span class='p'>.</span><span class='nx'>x</span><span class='p'>]</span> <span class='lineno'>132</span> <span class='o'>&amp;&amp;</span> <span class='nx'>mint</span> <span class='o'>&lt;=</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>[</span><span class='nx'>v</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>]</span> <span class='o'>&amp;&amp;</span> <span class='nx'>maxt</span> <span class='o'>&gt;=</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>[</span><span class='nx'>v</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>]</span> <span class='lineno'>133</span> <span class='o'>?</span> <span class='p'>(</span><span class='nx'>count</span><span class='o'>++</span><span class='p'>,</span> <span class='nx'>color</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>.</span><span class='nx'>species</span><span class='p'>))</span> <span class='lineno'>134</span> <span class='o'>:</span> <span class='s2'>&quot;#ccc&quot;</span><span class='p'>;</span> <span class='lineno'>135</span> <span class='p'>});</span> <span class='lineno'>136</span> <span class='p'>}</span> <span class='lineno'>137</span> <span class='lineno'>138</span> <span class='kd'>function</span> <span class='nx'>mouseup</span><span class='p'>()</span> <span class='p'>{</span> <span class='lineno'>139</span> <span class='k'>if</span> <span class='p'>(</span><span class='o'>!</span><span class='nx'>rect</span><span class='p'>)</span> <span class='k'>return</span><span class='p'>;</span> <span class='lineno'>140</span> <span class='nx'>rect</span><span class='p'>.</span><span class='nx'>remove</span><span class='p'>();</span> <span class='lineno'>141</span> <span class='nx'>rect</span> <span class='o'>=</span> <span class='kc'>null</span><span class='p'>;</span> <span class='lineno'>142</span> <span class='lineno'>143</span> <span class='k'>if</span> <span class='p'>(</span><span class='o'>!</span><span class='nx'>count</span><span class='p'>)</span> <span class='nx'>svg</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>&quot;circle&quot;</span><span class='p'>)</span> <span class='lineno'>144</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>&quot;fill&quot;</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'>145</span> <span class='k'>return</span> <span class='nx'>color</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>.</span><span class='nx'>species</span><span class='p'>);</span> <span class='lineno'>146</span> <span class='p'>});</span> <span class='lineno'>147</span> <span class='p'>}</span> <span class='lineno'>148</span> <span class='lineno'>149</span> <span class='p'>});</span> <span class='lineno'>150</span> <span class='kd'>function</span> <span class='nx'>cross</span><span class='p'>(</span><span class='nx'>a</span><span class='p'>)</span> <span class='p'>{</span> <span class='lineno'>151</span> <span class='k'>return</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'>152</span> <span class='kd'>var</span> <span class='nx'>c</span> <span class='o'>=</span> <span class='p'>[];</span> <span class='lineno'>153</span> <span class='k'>for</span> <span class='p'>(</span><span class='kd'>var</span> <span class='nx'>i</span> <span class='o'>=</span> <span class='mi'>0</span><span class='p'>,</span> <span class='nx'>n</span> <span class='o'>=</span> <span class='nx'>a</span><span class='p'>.</span><span class='nx'>length</span><span class='p'>;</span> <span class='nx'>i</span> <span class='o'>&lt;</span> <span class='nx'>n</span><span class='p'>;</span> <span class='nx'>i</span><span class='o'>++</span><span class='p'>)</span> <span class='nx'>c</span><span class='p'>.</span><span class='nx'>push</span><span class='p'>({</span><span class='nx'>x</span><span class='o'>:</span> <span class='nx'>d</span><span class='p'>,</span> <span class='nx'>y</span><span class='o'>:</span> <span class='nx'>a</span><span class='p'>[</span><span class='nx'>i</span><span class='p'>]});</span> <span class='lineno'>154</span> <span class='k'>return</span> <span class='nx'>c</span><span class='p'>;</span> <span class='lineno'>155</span> <span class='p'>};</span> <span class='lineno'>156</span> <span class='p'>}</span> </code></pre> </div> <p>This example uses a helper function, <code>cross</code>, to allow property functions to access both parent and child data. We&#8217;re looking for simpler ways to do this in future versions of D3:</p> <div class='highlight'><pre><code class='js'><span class='lineno'>1</span> <span class='kd'>function</span> <span class='nx'>cross</span><span class='p'>(</span><span class='nx'>a</span><span class='p'>)</span> <span class='p'>{</span> <span class='lineno'>2</span> <span class='k'>return</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'>3</span> <span class='kd'>var</span> <span class='nx'>c</span> <span class='o'>=</span> <span class='p'>[];</span> <span class='lineno'>4</span> <span class='k'>for</span> <span class='p'>(</span><span class='kd'>var</span> <span class='nx'>i</span> <span class='o'>=</span> <span class='mi'>0</span><span class='p'>,</span> <span class='nx'>n</span> <span class='o'>=</span> <span class='nx'>a</span><span class='p'>.</span><span class='nx'>length</span><span class='p'>;</span> <span class='nx'>i</span> <span class='o'>&lt;</span> <span class='nx'>n</span><span class='p'>;</span> <span class='nx'>i</span><span class='o'>++</span><span class='p'>)</span> <span class='nx'>c</span><span class='p'>.</span><span class='nx'>push</span><span class='p'>({</span><span class='nx'>x</span><span class='o'>:</span> <span class='nx'>d</span><span class='p'>,</span> <span class='nx'>y</span><span class='o'>:</span> <span class='nx'>a</span><span class='p'>[</span><span class='nx'>i</span><span class='p'>]});</span> <span class='lineno'>5</span> <span class='k'>return</span> <span class='nx'>c</span><span class='p'>;</span> <span class='lineno'>6</span> <span class='p'>};</span> <span class='lineno'>7</span> <span class='p'>}</span> </code></pre> </div> </div> <div class="foot">Copyright &copy; 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>