d3js-plugins-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +28 -0
  5. data/Rakefile +1 -0
  6. data/d3js-plugins-rails.gemspec +21 -0
  7. data/lib/d3js-plugins-rails/version.rb +7 -0
  8. data/lib/d3js-plugins-rails.rb +10 -0
  9. data/vendor/assets/javascripts/d3/plugins/.gitignore +1 -0
  10. data/vendor/assets/javascripts/d3/plugins/LICENSE +26 -0
  11. data/vendor/assets/javascripts/d3/plugins/Makefile +87 -0
  12. data/vendor/assets/javascripts/d3/plugins/README.md +19 -0
  13. data/vendor/assets/javascripts/d3/plugins/box/box.js +301 -0
  14. data/vendor/assets/javascripts/d3/plugins/bullet/README.md +14 -0
  15. data/vendor/assets/javascripts/d3/plugins/bullet/bullet.js +241 -0
  16. data/vendor/assets/javascripts/d3/plugins/chernoff/README.md +15 -0
  17. data/vendor/assets/javascripts/d3/plugins/chernoff/chernoff.js +176 -0
  18. data/vendor/assets/javascripts/d3/plugins/cie/README.md +54 -0
  19. data/vendor/assets/javascripts/d3/plugins/cie/cie.js +155 -0
  20. data/vendor/assets/javascripts/d3/plugins/fisheye/README.md +43 -0
  21. data/vendor/assets/javascripts/d3/plugins/fisheye/fisheye.js +85 -0
  22. data/vendor/assets/javascripts/d3/plugins/force_labels/README.md +29 -0
  23. data/vendor/assets/javascripts/d3/plugins/force_labels/force_labels.js +56 -0
  24. data/vendor/assets/javascripts/d3/plugins/geo/polyhedron/README.md +7 -0
  25. data/vendor/assets/javascripts/d3/plugins/geo/polyhedron/polyhedron.js +436 -0
  26. data/vendor/assets/javascripts/d3/plugins/geo/projection/README.md +107 -0
  27. data/vendor/assets/javascripts/d3/plugins/geo/projection/aitoff.js +40 -0
  28. data/vendor/assets/javascripts/d3/plugins/geo/projection/armadillo.js +79 -0
  29. data/vendor/assets/javascripts/d3/plugins/geo/projection/august.js +15 -0
  30. data/vendor/assets/javascripts/d3/plugins/geo/projection/baker.js +28 -0
  31. data/vendor/assets/javascripts/d3/plugins/geo/projection/berghaus.js +60 -0
  32. data/vendor/assets/javascripts/d3/plugins/geo/projection/boggs.js +27 -0
  33. data/vendor/assets/javascripts/d3/plugins/geo/projection/bonne.js +29 -0
  34. data/vendor/assets/javascripts/d3/plugins/geo/projection/bromley.js +5 -0
  35. data/vendor/assets/javascripts/d3/plugins/geo/projection/collignon.js +17 -0
  36. data/vendor/assets/javascripts/d3/plugins/geo/projection/conic-conformal.js +29 -0
  37. data/vendor/assets/javascripts/d3/plugins/geo/projection/conic-equidistant.js +27 -0
  38. data/vendor/assets/javascripts/d3/plugins/geo/projection/craig.js +24 -0
  39. data/vendor/assets/javascripts/d3/plugins/geo/projection/craster.js +18 -0
  40. data/vendor/assets/javascripts/d3/plugins/geo/projection/cylindrical-equal-area.js +23 -0
  41. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert1.js +18 -0
  42. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert2.js +17 -0
  43. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert3.js +17 -0
  44. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert4.js +24 -0
  45. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert5.js +17 -0
  46. data/vendor/assets/javascripts/d3/plugins/geo/projection/eckert6.js +22 -0
  47. data/vendor/assets/javascripts/d3/plugins/geo/projection/eisenlohr.js +16 -0
  48. data/vendor/assets/javascripts/d3/plugins/geo/projection/end.js +1 -0
  49. data/vendor/assets/javascripts/d3/plugins/geo/projection/gringorten.js +111 -0
  50. data/vendor/assets/javascripts/d3/plugins/geo/projection/guyou.js +46 -0
  51. data/vendor/assets/javascripts/d3/plugins/geo/projection/hammer-retroazimuthal.js +75 -0
  52. data/vendor/assets/javascripts/d3/plugins/geo/projection/hammer.js +51 -0
  53. data/vendor/assets/javascripts/d3/plugins/geo/projection/hatano.js +25 -0
  54. data/vendor/assets/javascripts/d3/plugins/geo/projection/healpix.js +64 -0
  55. data/vendor/assets/javascripts/d3/plugins/geo/projection/hill.js +64 -0
  56. data/vendor/assets/javascripts/d3/plugins/geo/projection/homolosine.js +17 -0
  57. data/vendor/assets/javascripts/d3/plugins/geo/projection/interrupt.js +111 -0
  58. data/vendor/assets/javascripts/d3/plugins/geo/projection/kavrayskiy7.js +15 -0
  59. data/vendor/assets/javascripts/d3/plugins/geo/projection/lagrange.js +27 -0
  60. data/vendor/assets/javascripts/d3/plugins/geo/projection/larrivee.js +39 -0
  61. data/vendor/assets/javascripts/d3/plugins/geo/projection/laskowski.js +31 -0
  62. data/vendor/assets/javascripts/d3/plugins/geo/projection/littrow.js +21 -0
  63. data/vendor/assets/javascripts/d3/plugins/geo/projection/loximuthal.js +29 -0
  64. data/vendor/assets/javascripts/d3/plugins/geo/projection/miller.js +15 -0
  65. data/vendor/assets/javascripts/d3/plugins/geo/projection/mollweide.js +35 -0
  66. data/vendor/assets/javascripts/d3/plugins/geo/projection/mt-flat-polar-parabolic.js +21 -0
  67. data/vendor/assets/javascripts/d3/plugins/geo/projection/mt-flat-polar-quartic.js +23 -0
  68. data/vendor/assets/javascripts/d3/plugins/geo/projection/mt-flat-polar-sinusoidal.js +25 -0
  69. data/vendor/assets/javascripts/d3/plugins/geo/projection/natural-earth.js +22 -0
  70. data/vendor/assets/javascripts/d3/plugins/geo/projection/nell-hammer.js +20 -0
  71. data/vendor/assets/javascripts/d3/plugins/geo/projection/parallel1.js +12 -0
  72. data/vendor/assets/javascripts/d3/plugins/geo/projection/parallel2.js +13 -0
  73. data/vendor/assets/javascripts/d3/plugins/geo/projection/peirce-quincuncial.js +14 -0
  74. data/vendor/assets/javascripts/d3/plugins/geo/projection/polyconic.js +25 -0
  75. data/vendor/assets/javascripts/d3/plugins/geo/projection/projection.js +29 -0
  76. data/vendor/assets/javascripts/d3/plugins/geo/projection/robinson.js +83 -0
  77. data/vendor/assets/javascripts/d3/plugins/geo/projection/satellite.js +68 -0
  78. data/vendor/assets/javascripts/d3/plugins/geo/projection/sinu-mollweide.js +19 -0
  79. data/vendor/assets/javascripts/d3/plugins/geo/projection/sinusoidal.js +15 -0
  80. data/vendor/assets/javascripts/d3/plugins/geo/projection/start.js +1 -0
  81. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/aitoff-test.js +26 -0
  82. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/armadillo-test.js +28 -0
  83. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/baker-test.js +26 -0
  84. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/boggs-test.js +26 -0
  85. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/bonne-test.js +45 -0
  86. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/craig-test.js +25 -0
  87. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/craster-test.js +25 -0
  88. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/env.js +32 -0
  89. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/equirectangular-test.js +97 -0
  90. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/hammer-test.js +29 -0
  91. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/hatano-test.js +25 -0
  92. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/hill-test.js +26 -0
  93. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/larrivee-test.js +25 -0
  94. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/laskowski-test.js +26 -0
  95. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/littrow-test.js +24 -0
  96. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/loximuthal-test.js +25 -0
  97. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/mollweide-test.js +26 -0
  98. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/mt-flat-polar-parabolic-test.js +25 -0
  99. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/mt-flat-polar-quartic-test.js +25 -0
  100. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/mt-flat-polar-sinusoidal-test.js +25 -0
  101. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/natural-earth-test.js +26 -0
  102. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/quartic-authalic-test.js +0 -0
  103. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/robinson-test.js +26 -0
  104. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/wagner6-test.js +25 -0
  105. data/vendor/assets/javascripts/d3/plugins/geo/projection/test/winkel3-test.js +26 -0
  106. data/vendor/assets/javascripts/d3/plugins/geo/projection/van-der-grinten.js +41 -0
  107. data/vendor/assets/javascripts/d3/plugins/geo/projection/van-der-grinten4.js +22 -0
  108. data/vendor/assets/javascripts/d3/plugins/geo/projection/wagner4.js +9 -0
  109. data/vendor/assets/javascripts/d3/plugins/geo/projection/wagner6.js +15 -0
  110. data/vendor/assets/javascripts/d3/plugins/geo/projection/wagner7.js +22 -0
  111. data/vendor/assets/javascripts/d3/plugins/geo/projection/wiechel.js +14 -0
  112. data/vendor/assets/javascripts/d3/plugins/geo/projection/winkel3.js +40 -0
  113. data/vendor/assets/javascripts/d3/plugins/geo/tile/README.md +6 -0
  114. data/vendor/assets/javascripts/d3/plugins/geo/tile/tile.js +53 -0
  115. data/vendor/assets/javascripts/d3/plugins/geodesic/README.md +3 -0
  116. data/vendor/assets/javascripts/d3/plugins/geodesic/geodesic.js +130 -0
  117. data/vendor/assets/javascripts/d3/plugins/geom/contour/README.md +5 -0
  118. data/vendor/assets/javascripts/d3/plugins/geom/contour/contour.js +72 -0
  119. data/vendor/assets/javascripts/d3/plugins/graph/README.md +148 -0
  120. data/vendor/assets/javascripts/d3/plugins/graph/data/cities-matrix.json +37 -0
  121. data/vendor/assets/javascripts/d3/plugins/graph/data/cities.csv +36 -0
  122. data/vendor/assets/javascripts/d3/plugins/graph/data/miserables.json +338 -0
  123. data/vendor/assets/javascripts/d3/plugins/graph/graph.js +161 -0
  124. data/vendor/assets/javascripts/d3/plugins/graph/index.html +37 -0
  125. data/vendor/assets/javascripts/d3/plugins/hexbin/README.md +58 -0
  126. data/vendor/assets/javascripts/d3/plugins/hexbin/hexbin.js +96 -0
  127. data/vendor/assets/javascripts/d3/plugins/hive/README.md +5 -0
  128. data/vendor/assets/javascripts/d3/plugins/hive/hive.js +80 -0
  129. data/vendor/assets/javascripts/d3/plugins/horizon/README.md +11 -0
  130. data/vendor/assets/javascripts/d3/plugins/horizon/horizon.js +192 -0
  131. data/vendor/assets/javascripts/d3/plugins/interpolate-zoom/README.md +11 -0
  132. data/vendor/assets/javascripts/d3/plugins/interpolate-zoom/interpolate-zoom.js +75 -0
  133. data/vendor/assets/javascripts/d3/plugins/jsonp/README.md +26 -0
  134. data/vendor/assets/javascripts/d3/plugins/jsonp/jsonp.js +25 -0
  135. data/vendor/assets/javascripts/d3/plugins/keybinding/README.md +17 -0
  136. data/vendor/assets/javascripts/d3/plugins/keybinding/keybinding.js +120 -0
  137. data/vendor/assets/javascripts/d3/plugins/longscroll/README.md +10 -0
  138. data/vendor/assets/javascripts/d3/plugins/longscroll/longscroll.js +75 -0
  139. data/vendor/assets/javascripts/d3/plugins/package.json +20 -0
  140. data/vendor/assets/javascripts/d3/plugins/qq/README.md +3 -0
  141. data/vendor/assets/javascripts/d3/plugins/qq/qq.js +249 -0
  142. data/vendor/assets/javascripts/d3/plugins/rollup/README.md +5 -0
  143. data/vendor/assets/javascripts/d3/plugins/rollup/rollup.js +131 -0
  144. data/vendor/assets/javascripts/d3/plugins/sankey/README.md +17 -0
  145. data/vendor/assets/javascripts/d3/plugins/sankey/sankey.js +292 -0
  146. data/vendor/assets/javascripts/d3/plugins/simplify/README.md +6 -0
  147. data/vendor/assets/javascripts/d3/plugins/simplify/simplify-test.js +193 -0
  148. data/vendor/assets/javascripts/d3/plugins/simplify/simplify.js +446 -0
  149. data/vendor/assets/javascripts/d3/plugins/superformula/superformula.js +98 -0
  150. data/vendor/assets/javascripts/d3/plugins/urlencode/urlencode-test.js +68 -0
  151. data/vendor/assets/javascripts/d3/plugins/urlencode/urlencode.js +37 -0
  152. metadata +218 -0
@@ -0,0 +1,11 @@
1
+ # Interpolate Zoom
2
+
3
+ An interpolator for zooming and panning between two views of a two-dimensional plane, based on [“Smooth and efficient zooming and panning”](https://www.google.com/search?q=Smooth+and+efficient+zooming+and+panning) by Jarke J. van Wijk and Wim A.A. Nuij.
4
+
5
+ Demo: <http://bl.ocks.org/3828981>
6
+
7
+ <a name="interpolateZoom" href="#interpolateZoom">#</a> d3.**interpolateZoom**(*start*, *end*)
8
+
9
+ Returns an [interpolator](https://github.com/mbostock/d3/wiki/Transitions#wiki-_interpolate) between the two points *start* and *end*. Each point should be defined as an array of three numbers in world coordinates: *ux*, *uy* and *w*. The first two coordinates *ux*, *uy* are the center of the viewport. The last coordinate *w* is the size of the viewport.
10
+
11
+ The returned interpolator also has a *duration* property which encodes the recommended transition duration in milliseconds. This duration is based on the path length of the curved trajectory through *u,w* space. If you want to a slower or faster transition, feel free to multiply this by an arbitrary scale factor (*V* as described in the original paper).
@@ -0,0 +1,75 @@
1
+ (function() {
2
+
3
+ var ρ = Math.SQRT2,
4
+ ρ2 = 2,
5
+ ρ4 = 4;
6
+
7
+ // p0 = [ux0, uy0, w0]
8
+ // p1 = [ux1, uy1, w1]
9
+ d3.interpolateZoom = function(p0, p1) {
10
+ var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
11
+ ux1 = p1[0], uy1 = p1[1], w1 = p1[2];
12
+ return ux0 === ux1 && uy0 === uy1
13
+ ? interpolate1(ux0, uy0, w0, w1)
14
+ : interpolate2(ux0, uy0, ux1, uy1, w0, w1);
15
+ };
16
+
17
+ // Special case for u0 = u1.
18
+ function interpolate1(ux0, uy0, w0, w1) {
19
+ var S = Math.abs(Math.log(w1 / w0)) / ρ,
20
+ k = w1 < w0 ? -1 : 1;
21
+
22
+ function interpolate(t) {
23
+ var s = t * S;
24
+ return [
25
+ ux0,
26
+ uy0,
27
+ w0 * Math.exp(k * ρ * s)
28
+ ];
29
+ }
30
+
31
+ interpolate.duration = S * 1000;
32
+
33
+ return interpolate;
34
+ };
35
+
36
+ // General case.
37
+ function interpolate2(ux0, uy0, ux1, uy1, w0, w1) {
38
+ var dx = ux1 - ux0,
39
+ dy = uy1 - uy0,
40
+ d2 = dx * dx + dy * dy,
41
+ d1 = Math.sqrt(d2),
42
+ b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1),
43
+ b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1),
44
+ r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
45
+ r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1),
46
+ S = (r1 - r0) / ρ;
47
+
48
+ function interpolate(t) {
49
+ var s = t * S,
50
+ u = w0 / (ρ2 * d1) * (cosh(r0) * tanh(ρ * s + r0) - sinh(r0));
51
+ return [
52
+ ux0 + u * dx,
53
+ uy0 + u * dy,
54
+ w0 * cosh(r0) / cosh(ρ * s + r0)
55
+ ];
56
+ };
57
+
58
+ interpolate.duration = S * 1000;
59
+
60
+ return interpolate;
61
+ };
62
+
63
+ function cosh(x) {
64
+ return (Math.exp(x) + Math.exp(-x)) / 2;
65
+ }
66
+
67
+ function sinh(x) {
68
+ return (Math.exp(x) - Math.exp(-x)) / 2;
69
+ }
70
+
71
+ function tanh(x) {
72
+ return sinh(x) / cosh(x);
73
+ }
74
+
75
+ })();
@@ -0,0 +1,26 @@
1
+ # d3.jsonp
2
+
3
+ Demo: <http://bl.ocks.org/4494715>
4
+
5
+ A plugin for supporting the [JSONP](http://json-p.org/) technique of requesting
6
+ cross-domain JSON data. This plugin is unstable and in development.
7
+
8
+ Whenever possible, _use [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
9
+ instead of JSONP_. CORS handles errors properly, has better security, and
10
+ supports formats besides JSON. See [enable-cors.org](http://enable-cors.org/) for more
11
+ information.
12
+
13
+ ```js
14
+ // autogenerate a callback in the form d3.jsonp.foo
15
+ d3.jsonp('foo.jsonp?callback={callback}', function() {
16
+ console.log(arguments);
17
+ });
18
+
19
+ // specify a callback
20
+ d3.jsonp('foo.jsonp?callback=d3.jsonp.foo', function() {
21
+ console.log(arguments);
22
+ });
23
+ ```
24
+
25
+ This plugin requires servers to accept callbacks with numeric and `.`
26
+ characters. Unlike `d3.xhr` functions, there is no error handling.
@@ -0,0 +1,25 @@
1
+ d3.jsonp = function (url, callback) {
2
+ function rand() {
3
+ var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
4
+ c = '', i = -1;
5
+ while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
6
+ return c;
7
+ }
8
+
9
+ function create(url) {
10
+ var e = url.match(/callback=d3.jsonp.(\w+)/),
11
+ c = e ? e[1] : rand();
12
+ d3.jsonp[c] = function(data) {
13
+ callback(data);
14
+ delete d3.jsonp[c];
15
+ script.remove();
16
+ };
17
+ return 'd3.jsonp.' + c;
18
+ }
19
+
20
+ var cb = create(url),
21
+ script = d3.select('head')
22
+ .append('script')
23
+ .attr('type', 'text/javascript')
24
+ .attr('src', url.replace(/(\{|%7B)callback(\{|%7D)/, cb));
25
+ };
@@ -0,0 +1,17 @@
1
+ # keybinding
2
+
3
+ Keybindings for d3
4
+
5
+ Demo: <http://bl.ocks.org/4444952>
6
+
7
+ <a name="keybinding" href="#keybinding">#</a> d3.**keybinding**()
8
+
9
+ Returns a keybinding object that can be used with `.call` to provide
10
+ bindings on selections.
11
+
12
+ The keybinding object exposes `.on()` for common keycodes and dispatches events
13
+ with arguments `[d3.event, modifiers]` in which modifiers is a string which
14
+ can include `⇧`, `⌃`, `⌥`, `⌘'`.
15
+
16
+ Keystroke events on input areas (`<input>`, `<select>`, and `<textarea>`)
17
+ are not caught.
@@ -0,0 +1,120 @@
1
+ d3.keybinding = function() {
2
+ // via https://github.com/keithamus/jwerty/
3
+ // and https://github.com/madrobby/keymaster
4
+ var _keys = {
5
+ // MOD aka toggleable keys
6
+ mods: {
7
+ // Shift key, ⇧
8
+ '⇧': 16,
9
+ // CTRL key, on Mac: ⌃
10
+ '⌃': 17,
11
+ // ALT key, on Mac: ⌥ (Alt)
12
+ '⌥': 18,
13
+ // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
14
+ '⌘': 91
15
+ },
16
+ // Normal keys
17
+ keys: {
18
+ // Backspace key, on Mac: ⌫ (Backspace)
19
+ '⌫': 8, backspace: 8,
20
+ // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
21
+ '⇥': 9, '⇆': 9, tab: 9,
22
+ // Return key, ↩
23
+ '↩': 13, 'return': 13, enter: 13, '⌅': 13,
24
+ // Pause/Break key
25
+ 'pause': 19, 'pause-break': 19,
26
+ // Caps Lock key, ⇪
27
+ '⇪': 20, caps: 20, 'caps-lock': 20,
28
+ // Escape key, on Mac: ⎋, on Windows: Esc
29
+ '⎋': 27, escape: 27, esc: 27,
30
+ // Space key
31
+ space: 32,
32
+ // Page-Up key, or pgup, on Mac: ↖
33
+ '↖': 33, pgup: 33, 'page-up': 33,
34
+ // Page-Down key, or pgdown, on Mac: ↘
35
+ '↘': 34, pgdown: 34, 'page-down': 34,
36
+ // END key, on Mac: ⇟
37
+ '⇟': 35, end: 35,
38
+ // HOME key, on Mac: ⇞
39
+ '⇞': 36, home: 36,
40
+ // Insert key, or ins
41
+ ins: 45, insert: 45,
42
+ // Delete key, on Mac: ⌦ (Delete)
43
+ '⌦': 46, del: 46, 'delete': 46,
44
+ // Left Arrow Key, or ←
45
+ '←': 37, left: 37, 'arrow-left': 37,
46
+ // Up Arrow Key, or ↑
47
+ '↑': 38, up: 38, 'arrow-up': 38,
48
+ // Right Arrow Key, or →
49
+ '→': 39, right: 39, 'arrow-right': 39,
50
+ // Up Arrow Key, or ↓
51
+ '↓': 40, down: 40, 'arrow-down': 40,
52
+ // odities, printing characters that come out wrong:
53
+ // Num-Multiply, or *
54
+ '*': 106, star: 106, asterisk: 106, multiply: 106,
55
+ // Num-Plus or +
56
+ '+': 107, 'plus': 107,
57
+ // Num-Subtract, or -
58
+ '-': 109, subtract: 109,
59
+ // Semicolon
60
+ ';': 186, semicolon:186,
61
+ // = or equals
62
+ '=': 187, 'equals': 187,
63
+ // Comma, or ,
64
+ ',': 188, comma: 188,
65
+ //'-': 189, //???
66
+ // Period, or ., or full-stop
67
+ '.': 190, period: 190, 'full-stop': 190,
68
+ // Slash, or /, or forward-slash
69
+ '/': 191, slash: 191, 'forward-slash': 191,
70
+ // Tick, or `, or back-quote
71
+ '`': 192, tick: 192, 'back-quote': 192,
72
+ // Open bracket, or [
73
+ '[': 219, 'open-bracket': 219,
74
+ // Back slash, or \
75
+ '\\': 220, 'back-slash': 220,
76
+ // Close backet, or ]
77
+ ']': 221, 'close-bracket': 221,
78
+ // Apostraphe, or Quote, or '
79
+ '\'': 222, quote: 222, apostraphe: 222
80
+ }
81
+ };
82
+ // To minimise code bloat, add all of the NUMPAD 0-9 keys in a loop
83
+ var i = 95, n = 0;
84
+ while (++i < 106) _keys.keys['num-' + n] = i; ++n;
85
+ // To minimise code bloat, add all of the top row 0-9 keys in a loop
86
+ i = 47, n = 0;
87
+ while (++i < 58) _keys.keys[n] = i; ++n;
88
+ // To minimise code bloat, add all of the F1-F25 keys in a loop
89
+ i = 111, n = 1;
90
+ while (++i < 136) _keys.keys['f' + n] = i; ++n;
91
+ // To minimise code bloat, add all of the letters of the alphabet in a loop
92
+ i = 64;
93
+ while(++i < 91) _keys.keys[String.fromCharCode(i).toLowerCase()] = i;
94
+
95
+ var pairs = d3.entries(_keys.keys),
96
+ event = d3.dispatch.apply(d3, d3.keys(_keys.keys));
97
+
98
+ function keys(selection) {
99
+ selection.on('keydown', function () {
100
+ var tagName = d3.select(d3.event.target).node().tagName;
101
+ if (tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA') {
102
+ return;
103
+ }
104
+
105
+ var modifiers = '';
106
+ if (d3.event.shiftKey) modifiers += '⇧';
107
+ if (d3.event.ctrlKey) modifiers += '⌃';
108
+ if (d3.event.altKey) modifiers += '⌥';
109
+ if (d3.event.metaKey) modifiers += '⌘';
110
+
111
+ pairs.filter(function(d) {
112
+ return d.value === d3.event.keyCode;
113
+ }).forEach(function(d) {
114
+ event[d.key](d3.event, modifiers);
115
+ });
116
+ });
117
+ }
118
+
119
+ return d3.rebind(keys, event, 'on');
120
+ };
@@ -0,0 +1,10 @@
1
+ # d3.longscroll
2
+
3
+ Scroll large numbers of rows using virtual rendering: <http://bl.ocks.org/3689677>
4
+
5
+ ## Limitations
6
+
7
+ Currently, only up to around 1e7px of vertical space is supported in current
8
+ browsers. A fix for this is [in the works][1].
9
+
10
+ [1]: https://groups.google.com/d/msg/d3-js/vNOvn2YUcaI/mz7m1igScUUJ
@@ -0,0 +1,75 @@
1
+ (function() {
2
+
3
+ // Virtual rendering for rows taking up to 1e7px of vertical space.
4
+ // By Jason Davies, http://www.jasondavies.com/
5
+ d3.longscroll = function() {
6
+ var render = null,
7
+ size = 0,
8
+ position = 0,
9
+ rowHeight = 20;
10
+
11
+ function longscroll(g) {
12
+ g.selectAll("div.before").data([0]).enter().append("div").attr("class", "before");
13
+ var current = g.selectAll("div.current").data([0]);
14
+ current.enter().append("div").attr("class", "current");
15
+ g.selectAll("div.after").data([0]).enter().append("div").attr("class", "after");
16
+
17
+ g.on("scroll.longscroll", function() {
18
+ position = Math.floor(this.scrollTop / rowHeight);
19
+ scroll(this.scrollTop);
20
+ });
21
+
22
+ scroll(0);
23
+ current.each(function() {
24
+ this.scrollIntoView();
25
+ });
26
+
27
+ function scroll(scrollTop) {
28
+ g.each(function() {
29
+ this.scrollTop = scrollTop;
30
+ var g = d3.select(this),
31
+ rows = 1 + Math.ceil(this.clientHeight / rowHeight),
32
+ position0 = Math.max(0, Math.min(size - rows, position)),
33
+ position1 = position0 + rows;
34
+
35
+ g.select(".before").style("height", position0 * rowHeight + "px");
36
+ g.select(".after").style("height", (size - position1) * rowHeight + "px");
37
+
38
+ var div = g.select(".current").selectAll("div.row")
39
+ .data(d3.range(position0, Math.min(position1, size)), String);
40
+ div.enter().append("div")
41
+ .attr("class", "row");
42
+ div.exit().remove();
43
+ div.order().call(render);
44
+ });
45
+ }
46
+ }
47
+
48
+ longscroll.render = function(_) {
49
+ if (!arguments.length) return render;
50
+ render = _;
51
+ return longscroll;
52
+ };
53
+
54
+ longscroll.rowHeight = function(_) {
55
+ if (!arguments.length) return rowHeight;
56
+ rowHeight = +_;
57
+ return longscroll;
58
+ };
59
+
60
+ longscroll.position = function(_) {
61
+ if (!arguments.length) return position;
62
+ position = +_;
63
+ return longscroll;
64
+ };
65
+
66
+ longscroll.size = function(_) {
67
+ if (!arguments.length) return size;
68
+ size = +_;
69
+ return longscroll;
70
+ };
71
+
72
+ return longscroll;
73
+ };
74
+
75
+ })();
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "d3-plugins",
3
+ "version": "0.0.1",
4
+ "description": "Plugins for D3.js.",
5
+ "keywords": ["visualization"],
6
+ "homepage": "http://github.com/d3/d3-plugins",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "http://github.com/d3/d3-plugins.git"
10
+ },
11
+ "dependencies": {
12
+ "d3": "3.0.x"
13
+ },
14
+ "devDependencies": {
15
+ "vows": "0.6.x"
16
+ },
17
+ "scripts": {
18
+ "test": "./node_modules/vows/bin/vows `find . -name \"*-test.js\" \\! -path \"./node_modules/*\"`"
19
+ }
20
+ }
@@ -0,0 +1,3 @@
1
+ # Q-Q Plots
2
+
3
+ Example: <http://bl.ocks.org/4349187>
@@ -0,0 +1,249 @@
1
+ (function() {
2
+
3
+ // Based on http://vis.stanford.edu/protovis/ex/qqplot.html
4
+ d3.qq = function() {
5
+ var width = 1,
6
+ height = 1,
7
+ duration = 0,
8
+ domain = null,
9
+ tickFormat = null,
10
+ n = 100,
11
+ x = qqX,
12
+ y = qqY;
13
+
14
+ // For each small multiple…
15
+ function qq(g) {
16
+ g.each(function(d, i) {
17
+ var g = d3.select(this),
18
+ qx = qqQuantiles(n, x.call(this, d, i)),
19
+ qy = qqQuantiles(n, y.call(this, d, i)),
20
+ xd = domain && domain.call(this, d, i) || [d3.min(qx), d3.max(qx)], // new x-domain
21
+ yd = domain && domain.call(this, d, i) || [d3.min(qy), d3.max(qy)], // new y-domain
22
+ x0, // old x-scale
23
+ y0; // old y-scale
24
+
25
+ // Compute the new x-scale.
26
+ var x1 = d3.scale.linear()
27
+ .domain(xd)
28
+ .range([0, width]);
29
+
30
+ // Compute the new y-scale.
31
+ var y1 = d3.scale.linear()
32
+ .domain(yd)
33
+ .range([height, 0]);
34
+
35
+ // Retrieve the old scales, if this is an update.
36
+ if (this.__chart__) {
37
+ x0 = this.__chart__.x;
38
+ y0 = this.__chart__.y;
39
+ } else {
40
+ x0 = d3.scale.linear().domain([0, Infinity]).range(x1.range());
41
+ y0 = d3.scale.linear().domain([0, Infinity]).range(y1.range());
42
+ }
43
+
44
+ // Stash the new scales.
45
+ this.__chart__ = {x: x1, y: y1};
46
+
47
+ // Update diagonal line.
48
+ var diagonal = g.selectAll("line.diagonal")
49
+ .data([null]);
50
+
51
+ diagonal.enter().append("svg:line")
52
+ .attr("class", "diagonal")
53
+ .attr("x1", x1(yd[0]))
54
+ .attr("y1", y1(xd[0]))
55
+ .attr("x2", x1(yd[1]))
56
+ .attr("y2", y1(xd[1]));
57
+
58
+ diagonal.transition()
59
+ .duration(duration)
60
+ .attr("x1", x1(yd[0]))
61
+ .attr("y1", y1(xd[0]))
62
+ .attr("x2", x1(yd[1]))
63
+ .attr("y2", y1(xd[1]));
64
+
65
+ // Update quantile plots.
66
+ var circle = g.selectAll("circle")
67
+ .data(d3.range(n).map(function(i) {
68
+ return {x: qx[i], y: qy[i]};
69
+ }));
70
+
71
+ circle.enter().append("svg:circle")
72
+ .attr("class", "quantile")
73
+ .attr("r", 4.5)
74
+ .attr("cx", function(d) { return x0(d.x); })
75
+ .attr("cy", function(d) { return y0(d.y); })
76
+ .style("opacity", 1e-6)
77
+ .transition()
78
+ .duration(duration)
79
+ .attr("cx", function(d) { return x1(d.x); })
80
+ .attr("cy", function(d) { return y1(d.y); })
81
+ .style("opacity", 1);
82
+
83
+ circle.transition()
84
+ .duration(duration)
85
+ .attr("cx", function(d) { return x1(d.x); })
86
+ .attr("cy", function(d) { return y1(d.y); })
87
+ .style("opacity", 1);
88
+
89
+ circle.exit().transition()
90
+ .duration(duration)
91
+ .attr("cx", function(d) { return x1(d.x); })
92
+ .attr("cy", function(d) { return y1(d.y); })
93
+ .style("opacity", 1e-6)
94
+ .remove();
95
+
96
+ var xformat = tickFormat || x1.tickFormat(4),
97
+ yformat = tickFormat || y1.tickFormat(4),
98
+ tx = function(d) { return "translate(" + x1(d) + "," + height + ")"; },
99
+ ty = function(d) { return "translate(0," + y1(d) + ")"; };
100
+
101
+ // Update x-ticks.
102
+ var xtick = g.selectAll("g.x.tick")
103
+ .data(x1.ticks(4), function(d) {
104
+ return this.textContent || xformat(d);
105
+ });
106
+
107
+ var xtickEnter = xtick.enter().append("svg:g")
108
+ .attr("class", "x tick")
109
+ .attr("transform", function(d) { return "translate(" + x0(d) + "," + height + ")"; })
110
+ .style("opacity", 1e-6);
111
+
112
+ xtickEnter.append("svg:line")
113
+ .attr("y1", 0)
114
+ .attr("y2", -6);
115
+
116
+ xtickEnter.append("svg:text")
117
+ .attr("text-anchor", "middle")
118
+ .attr("dy", "1em")
119
+ .text(xformat);
120
+
121
+ // Transition the entering ticks to the new scale, x1.
122
+ xtickEnter.transition()
123
+ .duration(duration)
124
+ .attr("transform", tx)
125
+ .style("opacity", 1);
126
+
127
+ // Transition the updating ticks to the new scale, x1.
128
+ xtick.transition()
129
+ .duration(duration)
130
+ .attr("transform", tx)
131
+ .style("opacity", 1);
132
+
133
+ // Transition the exiting ticks to the new scale, x1.
134
+ xtick.exit().transition()
135
+ .duration(duration)
136
+ .attr("transform", tx)
137
+ .style("opacity", 1e-6)
138
+ .remove();
139
+
140
+ // Update ticks.
141
+ var ytick = g.selectAll("g.y.tick")
142
+ .data(y1.ticks(4), function(d) {
143
+ return this.textContent || yformat(d);
144
+ });
145
+
146
+ var ytickEnter = ytick.enter().append("svg:g")
147
+ .attr("class", "y tick")
148
+ .attr("transform", function(d) { return "translate(0," + y0(d) + ")"; })
149
+ .style("opacity", 1e-6);
150
+
151
+ ytickEnter.append("svg:line")
152
+ .attr("x1", 0)
153
+ .attr("x2", 6);
154
+
155
+ ytickEnter.append("svg:text")
156
+ .attr("text-anchor", "end")
157
+ .attr("dx", "-.5em")
158
+ .attr("dy", ".3em")
159
+ .text(yformat);
160
+
161
+ // Transition the entering ticks to the new scale, y1.
162
+ ytickEnter.transition()
163
+ .duration(duration)
164
+ .attr("transform", ty)
165
+ .style("opacity", 1);
166
+
167
+ // Transition the updating ticks to the new scale, y1.
168
+ ytick.transition()
169
+ .duration(duration)
170
+ .attr("transform", ty)
171
+ .style("opacity", 1);
172
+
173
+ // Transition the exiting ticks to the new scale, y1.
174
+ ytick.exit().transition()
175
+ .duration(duration)
176
+ .attr("transform", ty)
177
+ .style("opacity", 1e-6)
178
+ .remove();
179
+ });
180
+ }
181
+
182
+ qq.width = function(x) {
183
+ if (!arguments.length) return width;
184
+ width = x;
185
+ return qq;
186
+ };
187
+
188
+ qq.height = function(x) {
189
+ if (!arguments.length) return height;
190
+ height = x;
191
+ return qq;
192
+ };
193
+
194
+ qq.duration = function(x) {
195
+ if (!arguments.length) return duration;
196
+ duration = x;
197
+ return qq;
198
+ };
199
+
200
+ qq.domain = function(x) {
201
+ if (!arguments.length) return domain;
202
+ domain = x == null ? x : d3.functor(x);
203
+ return qq;
204
+ };
205
+
206
+ qq.count = function(z) {
207
+ if (!arguments.length) return n;
208
+ n = z;
209
+ return qq;
210
+ };
211
+
212
+ qq.x = function(z) {
213
+ if (!arguments.length) return x;
214
+ x = z;
215
+ return qq;
216
+ };
217
+
218
+ qq.y = function(z) {
219
+ if (!arguments.length) return y;
220
+ y = z;
221
+ return qq;
222
+ };
223
+
224
+ qq.tickFormat = function(x) {
225
+ if (!arguments.length) return tickFormat;
226
+ tickFormat = x;
227
+ return qq;
228
+ };
229
+
230
+ return qq;
231
+ };
232
+
233
+ function qqQuantiles(n, values) {
234
+ var m = values.length - 1;
235
+ values = values.slice().sort(d3.ascending);
236
+ return d3.range(n).map(function(i) {
237
+ return values[~~(i * m / n)];
238
+ });
239
+ }
240
+
241
+ function qqX(d) {
242
+ return d.x;
243
+ }
244
+
245
+ function qqY(d) {
246
+ return d.y;
247
+ }
248
+
249
+ })();