d3
Version:
A small, free JavaScript library for manipulating documents based on data.
204 lines (198 loc) • 38.5 kB
HTML
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>d3.js ~ Stacked Bars</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='stacked_bars'>Stacked Bars</h1>
<div class='gallery' id='chart'>
<button class='first' id='group' onclick='transitionGroup()'>
Group
</button><button class='last active' id='stack' onclick='transitionStack()'>
Stack
</button><p />
</div><link href='stack.css' rel='stylesheet' type='text/css' /><link href='button.css' rel='stylesheet' type='text/css' /><script src='../d3.layout.js?1.12.0' type='text/javascript'> </script><script src='stream_layers.js' type='text/javascript'> </script><script src='stack.js' type='text/javascript'> </script>
<p>Animation design by <a href='http://vis.berkeley.edu/papers/animated_transitions/'>Heer and Robertson</a>. Colors and data generation inspired by <a href='http://www.leebyron.com/else/streamgraph/'>Byron and Wattenberg</a>.</p>
<h3 id='source_code'>Source Code</h3>
<div class='highlight'><pre><code class='js'><span class='lineno'> 1</span> <span class='kd'>var</span> <span class='nx'>n</span> <span class='o'>=</span> <span class='mi'>4</span><span class='p'>,</span> <span class='c1'>// number of layers</span>
<span class='lineno'> 2</span> <span class='nx'>m</span> <span class='o'>=</span> <span class='mi'>64</span><span class='p'>,</span> <span class='c1'>// number of samples per layer</span>
<span class='lineno'> 3</span> <span class='nx'>data</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'>stack</span><span class='p'>()(</span><span class='nx'>stream_layers</span><span class='p'>(</span><span class='nx'>n</span><span class='p'>,</span> <span class='nx'>m</span><span class='p'>,</span> <span class='p'>.</span><span class='mi'>1</span><span class='p'>)),</span>
<span class='lineno'> 4</span> <span class='nx'>color</span> <span class='o'>=</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>interpolateRgb</span><span class='p'>(</span><span class='s2'>"#aad"</span><span class='p'>,</span> <span class='s2'>"#556"</span><span class='p'>);</span>
<span class='lineno'> 5</span>
<span class='lineno'> 6</span> <span class='kd'>var</span> <span class='nx'>p</span> <span class='o'>=</span> <span class='mi'>20</span><span class='p'>,</span>
<span class='lineno'> 7</span> <span class='nx'>w</span> <span class='o'>=</span> <span class='mi'>960</span><span class='p'>,</span>
<span class='lineno'> 8</span> <span class='nx'>h</span> <span class='o'>=</span> <span class='mi'>500</span> <span class='o'>-</span> <span class='p'>.</span><span class='mi'>5</span> <span class='o'>-</span> <span class='nx'>p</span><span class='p'>,</span>
<span class='lineno'> 9</span> <span class='nx'>mx</span> <span class='o'>=</span> <span class='nx'>m</span><span class='p'>,</span>
<span class='lineno'> 10</span> <span class='nx'>my</span> <span class='o'>=</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>max</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='lineno'> 11</span> <span class='k'>return</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>max</span><span class='p'>(</span><span class='nx'>d</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'> 12</span> <span class='k'>return</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>y0</span> <span class='o'>+</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>;</span>
<span class='lineno'> 13</span> <span class='p'>});</span>
<span class='lineno'> 14</span> <span class='p'>}),</span>
<span class='lineno'> 15</span> <span class='nx'>mz</span> <span class='o'>=</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>max</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='lineno'> 16</span> <span class='k'>return</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>max</span><span class='p'>(</span><span class='nx'>d</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'> 17</span> <span class='k'>return</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span><span class='p'>;</span>
<span class='lineno'> 18</span> <span class='p'>});</span>
<span class='lineno'> 19</span> <span class='p'>}),</span>
<span class='lineno'> 20</span> <span class='nx'>x</span> <span class='o'>=</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'>x</span> <span class='o'>*</span> <span class='nx'>w</span> <span class='o'>/</span> <span class='nx'>mx</span><span class='p'>;</span> <span class='p'>},</span>
<span class='lineno'> 21</span> <span class='nx'>y0</span> <span class='o'>=</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'>h</span> <span class='o'>-</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>y0</span> <span class='o'>*</span> <span class='nx'>h</span> <span class='o'>/</span> <span class='nx'>my</span><span class='p'>;</span> <span class='p'>},</span>
<span class='lineno'> 22</span> <span class='nx'>y1</span> <span class='o'>=</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'>h</span> <span class='o'>-</span> <span class='p'>(</span><span class='nx'>d</span><span class='p'>.</span><span class='nx'>y</span> <span class='o'>+</span> <span class='nx'>d</span><span class='p'>.</span><span class='nx'>y0</span><span class='p'>)</span> <span class='o'>*</span> <span class='nx'>h</span> <span class='o'>/</span> <span class='nx'>my</span><span class='p'>;</span> <span class='p'>},</span>
<span class='lineno'> 23</span> <span class='nx'>y2</span> <span class='o'>=</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'>y</span> <span class='o'>*</span> <span class='nx'>h</span> <span class='o'>/</span> <span class='nx'>mz</span><span class='p'>;</span> <span class='p'>};</span> <span class='c1'>// or `my` to not rescale</span>
<span class='lineno'> 24</span>
<span class='lineno'> 25</span> <span class='kd'>var</span> <span class='nx'>vis</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'> 26</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'> 27</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'> 28</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='o'>+</span> <span class='nx'>p</span><span class='p'>);</span>
<span class='lineno'> 29</span>
<span class='lineno'> 30</span> <span class='kd'>var</span> <span class='nx'>layers</span> <span class='o'>=</span> <span class='nx'>vis</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"g.layer"</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'>data</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'>"svg:g"</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'>"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='nx'>i</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'>i</span> <span class='o'>/</span> <span class='p'>(</span><span class='nx'>n</span> <span class='o'>-</span> <span class='mi'>1</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'>"class"</span><span class='p'>,</span> <span class='s2'>"layer"</span><span class='p'>);</span>
<span class='lineno'> 35</span>
<span class='lineno'> 36</span> <span class='kd'>var</span> <span class='nx'>bars</span> <span class='o'>=</span> <span class='nx'>layers</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"g.bar"</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='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'> 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'>"svg:g"</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'>"class"</span><span class='p'>,</span> <span class='s2'>"bar"</span><span class='p'>)</span>
<span class='lineno'> 40</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='k'>return</span> <span class='s2'>"translate("</span> <span class='o'>+</span> <span class='nx'>x</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='o'>+</span> <span class='s2'>",0)"</span><span class='p'>;</span> <span class='p'>});</span>
<span class='lineno'> 41</span>
<span class='lineno'> 42</span> <span class='nx'>bars</span><span class='p'>.</span><span class='nx'>append</span><span class='p'>(</span><span class='s2'>"svg:rect"</span><span class='p'>)</span>
<span class='lineno'> 43</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'>x</span><span class='p'>({</span><span class='nx'>x</span><span class='o'>:</span> <span class='p'>.</span><span class='mi'>9</span><span class='p'>}))</span>
<span class='lineno'> 44</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'>0</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'>"y"</span><span class='p'>,</span> <span class='nx'>h</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'>"height"</span><span class='p'>,</span> <span class='mi'>0</span><span class='p'>)</span>
<span class='lineno'> 47</span> <span class='p'>.</span><span class='nx'>transition</span><span class='p'>()</span>
<span class='lineno'> 48</span> <span class='p'>.</span><span class='nx'>delay</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='nx'>i</span> <span class='o'>*</span> <span class='mi'>10</span><span class='p'>;</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'>"y"</span><span class='p'>,</span> <span class='nx'>y1</span><span class='p'>)</span>
<span class='lineno'> 50</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='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'>y0</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='o'>-</span> <span class='nx'>y1</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>);</span> <span class='p'>});</span>
<span class='lineno'> 51</span>
<span class='lineno'> 52</span> <span class='kd'>var</span> <span class='nx'>labels</span> <span class='o'>=</span> <span class='nx'>vis</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"text.label"</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='nx'>data</span><span class='p'>[</span><span class='mi'>0</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'>"svg:text"</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'>"class"</span><span class='p'>,</span> <span class='s2'>"label"</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'>"x"</span><span class='p'>,</span> <span class='nx'>x</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'>"y"</span><span class='p'>,</span> <span class='nx'>h</span> <span class='o'>+</span> <span class='mi'>6</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'>"dx"</span><span class='p'>,</span> <span class='nx'>x</span><span class='p'>({</span><span class='nx'>x</span><span class='o'>:</span> <span class='p'>.</span><span class='mi'>45</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'>".71em"</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='s2'>"middle"</span><span class='p'>)</span>
<span class='lineno'> 61</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='nx'>i</span><span class='p'>)</span> <span class='p'>{</span> <span class='k'>return</span> <span class='nx'>i</span><span class='p'>;</span> <span class='p'>});</span>
<span class='lineno'> 62</span>
<span class='lineno'> 63</span> <span class='nx'>vis</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'> 64</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'>0</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'>"x2"</span><span class='p'>,</span> <span class='nx'>w</span> <span class='o'>-</span> <span class='nx'>x</span><span class='p'>({</span><span class='nx'>x</span><span class='o'>:</span> <span class='p'>.</span><span class='mi'>1</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'>"y1"</span><span class='p'>,</span> <span class='nx'>h</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'>"y2"</span><span class='p'>,</span> <span class='nx'>h</span><span class='p'>);</span>
<span class='lineno'> 68</span>
<span class='lineno'> 69</span> <span class='kd'>function</span> <span class='nx'>transitionGroup</span><span class='p'>()</span> <span class='p'>{</span>
<span class='lineno'> 70</span> <span class='kd'>var</span> <span class='nx'>group</span> <span class='o'>=</span> <span class='nx'>d3</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"#chart"</span><span class='p'>);</span>
<span class='lineno'> 71</span>
<span class='lineno'> 72</span> <span class='nx'>group</span><span class='p'>.</span><span class='nx'>select</span><span class='p'>(</span><span class='s2'>"#group"</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'>"class"</span><span class='p'>,</span> <span class='s2'>"first active"</span><span class='p'>);</span>
<span class='lineno'> 74</span>
<span class='lineno'> 75</span> <span class='nx'>group</span><span class='p'>.</span><span class='nx'>select</span><span class='p'>(</span><span class='s2'>"#stack"</span><span class='p'>)</span>
<span class='lineno'> 76</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'>"last"</span><span class='p'>);</span>
<span class='lineno'> 77</span>
<span class='lineno'> 78</span> <span class='nx'>group</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"g.layer rect"</span><span class='p'>)</span>
<span class='lineno'> 79</span> <span class='p'>.</span><span class='nx'>transition</span><span class='p'>()</span>
<span class='lineno'> 80</span> <span class='p'>.</span><span class='nx'>duration</span><span class='p'>(</span><span class='mi'>500</span><span class='p'>)</span>
<span class='lineno'> 81</span> <span class='p'>.</span><span class='nx'>delay</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='p'>(</span><span class='nx'>i</span> <span class='o'>%</span> <span class='nx'>m</span><span class='p'>)</span> <span class='o'>*</span> <span class='mi'>10</span><span class='p'>;</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'>"x"</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='nx'>x</span><span class='p'>({</span><span class='nx'>x</span><span class='o'>:</span> <span class='p'>.</span><span class='mi'>9</span> <span class='o'>*</span> <span class='o'>~~</span><span class='p'>(</span><span class='nx'>i</span> <span class='o'>/</span> <span class='nx'>m</span><span class='p'>)</span> <span class='o'>/</span> <span class='nx'>n</span><span class='p'>});</span> <span class='p'>})</span>
<span class='lineno'> 83</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'>x</span><span class='p'>({</span><span class='nx'>x</span><span class='o'>:</span> <span class='p'>.</span><span class='mi'>9</span> <span class='o'>/</span> <span class='nx'>n</span><span class='p'>}))</span>
<span class='lineno'> 84</span> <span class='p'>.</span><span class='nx'>each</span><span class='p'>(</span><span class='s2'>"end"</span><span class='p'>,</span> <span class='nx'>transitionEnd</span><span class='p'>);</span>
<span class='lineno'> 85</span>
<span class='lineno'> 86</span> <span class='kd'>function</span> <span class='nx'>transitionEnd</span><span class='p'>()</span> <span class='p'>{</span>
<span class='lineno'> 87</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='lineno'> 88</span> <span class='p'>.</span><span class='nx'>transition</span><span class='p'>()</span>
<span class='lineno'> 89</span> <span class='p'>.</span><span class='nx'>duration</span><span class='p'>(</span><span class='mi'>500</span><span class='p'>)</span>
<span class='lineno'> 90</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"y"</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'>h</span> <span class='o'>-</span> <span class='nx'>y2</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>);</span> <span class='p'>})</span>
<span class='lineno'> 91</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'>y2</span><span class='p'>);</span>
<span class='lineno'> 92</span> <span class='p'>}</span>
<span class='lineno'> 93</span> <span class='p'>}</span>
<span class='lineno'> 94</span>
<span class='lineno'> 95</span> <span class='kd'>function</span> <span class='nx'>transitionStack</span><span class='p'>()</span> <span class='p'>{</span>
<span class='lineno'> 96</span> <span class='kd'>var</span> <span class='nx'>stack</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'> 97</span>
<span class='lineno'> 98</span> <span class='nx'>stack</span><span class='p'>.</span><span class='nx'>select</span><span class='p'>(</span><span class='s2'>"#group"</span><span class='p'>)</span>
<span class='lineno'> 99</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'>"first"</span><span class='p'>);</span>
<span class='lineno'>100</span>
<span class='lineno'>101</span> <span class='nx'>stack</span><span class='p'>.</span><span class='nx'>select</span><span class='p'>(</span><span class='s2'>"#stack"</span><span class='p'>)</span>
<span class='lineno'>102</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'>"last active"</span><span class='p'>);</span>
<span class='lineno'>103</span>
<span class='lineno'>104</span> <span class='nx'>stack</span><span class='p'>.</span><span class='nx'>selectAll</span><span class='p'>(</span><span class='s2'>"g.layer rect"</span><span class='p'>)</span>
<span class='lineno'>105</span> <span class='p'>.</span><span class='nx'>transition</span><span class='p'>()</span>
<span class='lineno'>106</span> <span class='p'>.</span><span class='nx'>duration</span><span class='p'>(</span><span class='mi'>500</span><span class='p'>)</span>
<span class='lineno'>107</span> <span class='p'>.</span><span class='nx'>delay</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='p'>(</span><span class='nx'>i</span> <span class='o'>%</span> <span class='nx'>m</span><span class='p'>)</span> <span class='o'>*</span> <span class='mi'>10</span><span class='p'>;</span> <span class='p'>})</span>
<span class='lineno'>108</span> <span class='p'>.</span><span class='nx'>attr</span><span class='p'>(</span><span class='s2'>"y"</span><span class='p'>,</span> <span class='nx'>y1</span><span class='p'>)</span>
<span class='lineno'>109</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='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'>y0</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>)</span> <span class='o'>-</span> <span class='nx'>y1</span><span class='p'>(</span><span class='nx'>d</span><span class='p'>);</span> <span class='p'>})</span>
<span class='lineno'>110</span> <span class='p'>.</span><span class='nx'>each</span><span class='p'>(</span><span class='s2'>"end"</span><span class='p'>,</span> <span class='nx'>transitionEnd</span><span class='p'>);</span>
<span class='lineno'>111</span>
<span class='lineno'>112</span> <span class='kd'>function</span> <span class='nx'>transitionEnd</span><span class='p'>()</span> <span class='p'>{</span>
<span class='lineno'>113</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='lineno'>114</span> <span class='p'>.</span><span class='nx'>transition</span><span class='p'>()</span>
<span class='lineno'>115</span> <span class='p'>.</span><span class='nx'>duration</span><span class='p'>(</span><span class='mi'>500</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'>"x"</span><span class='p'>,</span> <span class='mi'>0</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'>"width"</span><span class='p'>,</span> <span class='nx'>x</span><span class='p'>({</span><span class='nx'>x</span><span class='o'>:</span> <span class='p'>.</span><span class='mi'>9</span><span class='p'>}));</span>
<span class='lineno'>118</span> <span class='p'>}</span>
<span class='lineno'>119</span> <span class='p'>}</span>
</code></pre>
</div><div class='highlight'><pre><code class='js'><span class='lineno'> 1</span> <span class='cm'>/* Inspired by Lee Byron's test data generator. */</span>
<span class='lineno'> 2</span> <span class='kd'>function</span> <span class='nx'>stream_layers</span><span class='p'>(</span><span class='nx'>n</span><span class='p'>,</span> <span class='nx'>m</span><span class='p'>,</span> <span class='nx'>o</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'> 3</span> <span class='k'>if</span> <span class='p'>(</span><span class='nx'>arguments</span><span class='p'>.</span><span class='nx'>length</span> <span class='o'><</span> <span class='mi'>3</span><span class='p'>)</span> <span class='nx'>o</span> <span class='o'>=</span> <span class='mi'>0</span><span class='p'>;</span>
<span class='lineno'> 4</span> <span class='kd'>function</span> <span class='nx'>bump</span><span class='p'>(</span><span class='nx'>a</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'> 5</span> <span class='kd'>var</span> <span class='nx'>x</span> <span class='o'>=</span> <span class='mi'>1</span> <span class='o'>/</span> <span class='p'>(.</span><span class='mi'>1</span> <span class='o'>+</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>random</span><span class='p'>()),</span>
<span class='lineno'> 6</span> <span class='nx'>y</span> <span class='o'>=</span> <span class='mi'>2</span> <span class='o'>*</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>random</span><span class='p'>()</span> <span class='o'>-</span> <span class='p'>.</span><span class='mi'>5</span><span class='p'>,</span>
<span class='lineno'> 7</span> <span class='nx'>z</span> <span class='o'>=</span> <span class='mi'>10</span> <span class='o'>/</span> <span class='p'>(.</span><span class='mi'>1</span> <span class='o'>+</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>random</span><span class='p'>());</span>
<span class='lineno'> 8</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'>i</span> <span class='o'><</span> <span class='nx'>m</span><span class='p'>;</span> <span class='nx'>i</span><span class='o'>++</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'> 9</span> <span class='kd'>var</span> <span class='nx'>w</span> <span class='o'>=</span> <span class='p'>(</span><span class='nx'>i</span> <span class='o'>/</span> <span class='nx'>m</span> <span class='o'>-</span> <span class='nx'>y</span><span class='p'>)</span> <span class='o'>*</span> <span class='nx'>z</span><span class='p'>;</span>
<span class='lineno'>10</span> <span class='nx'>a</span><span class='p'>[</span><span class='nx'>i</span><span class='p'>]</span> <span class='o'>+=</span> <span class='nx'>x</span> <span class='o'>*</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>exp</span><span class='p'>(</span><span class='o'>-</span><span class='nx'>w</span> <span class='o'>*</span> <span class='nx'>w</span><span class='p'>);</span>
<span class='lineno'>11</span> <span class='p'>}</span>
<span class='lineno'>12</span> <span class='p'>}</span>
<span class='lineno'>13</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='nx'>n</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='p'>{</span>
<span class='lineno'>14</span> <span class='kd'>var</span> <span class='nx'>a</span> <span class='o'>=</span> <span class='p'>[],</span> <span class='nx'>i</span><span class='p'>;</span>
<span class='lineno'>15</span> <span class='k'>for</span> <span class='p'>(</span><span class='nx'>i</span> <span class='o'>=</span> <span class='mi'>0</span><span class='p'>;</span> <span class='nx'>i</span> <span class='o'><</span> <span class='nx'>m</span><span class='p'>;</span> <span class='nx'>i</span><span class='o'>++</span><span class='p'>)</span> <span class='nx'>a</span><span class='p'>[</span><span class='nx'>i</span><span class='p'>]</span> <span class='o'>=</span> <span class='nx'>o</span> <span class='o'>+</span> <span class='nx'>o</span> <span class='o'>*</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>random</span><span class='p'>();</span>
<span class='lineno'>16</span> <span class='k'>for</span> <span class='p'>(</span><span class='nx'>i</span> <span class='o'>=</span> <span class='mi'>0</span><span class='p'>;</span> <span class='nx'>i</span> <span class='o'><</span> <span class='mi'>5</span><span class='p'>;</span> <span class='nx'>i</span><span class='o'>++</span><span class='p'>)</span> <span class='nx'>bump</span><span class='p'>(</span><span class='nx'>a</span><span class='p'>);</span>
<span class='lineno'>17</span> <span class='k'>return</span> <span class='nx'>a</span><span class='p'>.</span><span class='nx'>map</span><span class='p'>(</span><span class='nx'>stream_index</span><span class='p'>);</span>
<span class='lineno'>18</span> <span class='p'>});</span>
<span class='lineno'>19</span> <span class='p'>}</span>
<span class='lineno'>20</span>
<span class='lineno'>21</span> <span class='cm'>/* Another layer generator using gamma distributions. */</span>
<span class='lineno'>22</span> <span class='kd'>function</span> <span class='nx'>stream_waves</span><span class='p'>(</span><span class='nx'>n</span><span class='p'>,</span> <span class='nx'>m</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>23</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='nx'>n</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'>i</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>24</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='nx'>m</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'>j</span><span class='p'>)</span> <span class='p'>{</span>
<span class='lineno'>25</span> <span class='kd'>var</span> <span class='nx'>x</span> <span class='o'>=</span> <span class='mi'>20</span> <span class='o'>*</span> <span class='nx'>j</span> <span class='o'>/</span> <span class='nx'>m</span> <span class='o'>-</span> <span class='nx'>i</span> <span class='o'>/</span> <span class='mi'>3</span><span class='p'>;</span>
<span class='lineno'>26</span> <span class='k'>return</span> <span class='mi'>2</span> <span class='o'>*</span> <span class='nx'>x</span> <span class='o'>*</span> <span class='nb'>Math</span><span class='p'>.</span><span class='nx'>exp</span><span class='p'>(</span><span class='o'>-</span><span class='p'>.</span><span class='mi'>5</span> <span class='o'>*</span> <span class='nx'>x</span><span class='p'>);</span>
<span class='lineno'>27</span> <span class='p'>}).</span><span class='nx'>map</span><span class='p'>(</span><span class='nx'>stream_index</span><span class='p'>);</span>
<span class='lineno'>28</span> <span class='p'>});</span>
<span class='lineno'>29</span> <span class='p'>}</span>
<span class='lineno'>30</span>
<span class='lineno'>31</span> <span class='kd'>function</span> <span class='nx'>stream_index</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='lineno'>32</span> <span class='k'>return</span> <span class='p'>{</span><span class='nx'>x</span><span class='o'>:</span> <span class='nx'>i</span><span class='p'>,</span> <span class='nx'>y</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='mi'>0</span><span class='p'>,</span> <span class='nx'>d</span><span class='p'>)};</span>
<span class='lineno'>33</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>