|
7 | 7 | {"name": "link-data", "source": "link-data-raw"}, |
8 | 8 | { |
9 | 9 | "name": "node-data", |
10 | | - "values": [], |
11 | 10 | "transform": [ |
12 | 11 | { |
13 | | - "type": "force", |
14 | | - "iterations": 300, |
15 | | - "restart": {"signal": "restart"}, |
16 | 12 | "signal": "force", |
| 13 | + "type": "force", |
17 | 14 | "forces": [ |
18 | 15 | {"force": "center", "x": {"signal": "cx"}, "y": {"signal": "cy"}}, |
19 | 16 | { |
20 | 17 | "force": "collide", |
21 | | - "radius": {"signal": "2 * nodeRadius"}, |
22 | 18 | "iterations": 1, |
| 19 | + "radius": {"signal": "2 * nodeRadius"}, |
23 | 20 | "strength": 0.7 |
24 | 21 | }, |
25 | 22 | {"force": "nbody", "strength": {"signal": "nodeCharge"}}, |
26 | 23 | { |
27 | 24 | "force": "link", |
28 | | - "links": "link-data-raw", |
29 | 25 | "distance": {"signal": "linkDistance"}, |
30 | | - "id": "index" |
| 26 | + "id": "index", |
| 27 | + "links": "link-data-raw" |
31 | 28 | } |
32 | | - ] |
| 29 | + ], |
| 30 | + "iterations": 300, |
| 31 | + "restart": {"signal": "restart"} |
33 | 32 | }, |
34 | 33 | { |
35 | 34 | "type": "formula", |
|
41 | 40 | "as": "fy", |
42 | 41 | "expr": "fix[1]!=null && node==datum.index ?invert('yscale',fix[1]):null" |
43 | 42 | } |
44 | | - ] |
| 43 | + ], |
| 44 | + "values": [] |
45 | 45 | }, |
46 | 46 | { |
47 | 47 | "name": "adj-nodes", |
|
68 | 68 | ], |
69 | 69 | "marks": [ |
70 | 70 | { |
71 | | - "name": "links", |
72 | 71 | "from": {"data": "link-data"}, |
73 | 72 | "type": "path", |
74 | 73 | "encode": { |
|
80 | 79 | } |
81 | 80 | }, |
82 | 81 | "interactive": false, |
| 82 | + "name": "links", |
83 | 83 | "transform": [ |
84 | 84 | { |
85 | 85 | "type": "linkpath", |
|
97 | 97 | "type": "symbol", |
98 | 98 | "encode": { |
99 | 99 | "enter": { |
100 | | - "fill": { "signal": "datum.nodeType === 'BaristaLabs.ChromeDevTools.Runtime.Network.RequestWillBeSentEvent'? '#e0e1dd' : scale('color', datum.group)" }, |
| 100 | + "fill": {"signal": "scale('color', datum.nodeType)"}, |
101 | 101 | "stroke": {"value": "white"} |
102 | 102 | }, |
103 | 103 | "update": { |
104 | 104 | "cursor": {"value": "pointer"}, |
105 | 105 | "fill": { |
106 | | - "signal": "hoverIndex === datum.index || indata('adjacentIndices', 'adj', datum.index) ? 'red' : datum.nodeType === 'BaristaLabs.ChromeDevTools.Runtime.Network.RequestWillBeSentEvent'? '#e0e1dd' : scale('color', datum.group)" |
| 106 | + "signal": "hoverIndex === datum.index || indata('adjacentIndices', 'adj', datum.index) ? 'red' : scale('color', datum.nodeType)" |
107 | 107 | }, |
108 | 108 | "size": { |
109 | 109 | "signal": "(hoverIndex === datum.index || indata('adjacentIndices', 'adj', datum.index)) ? 2.5 * nodeRadius * nodeRadius : 2 * nodeRadius * nodeRadius" |
110 | 110 | }, |
111 | | - "zindex": { |
112 | | - "signal": "(hoverIndex === datum.index || indata('adjacentIndices', 'adj', datum.index)) ? 10 : 1" |
113 | | - }, |
| 111 | + "tooltip": {"signal": "{ name: datum.name }"}, |
114 | 112 | "x": { |
115 | 113 | "signal": "fix[0]!=null && node===datum.index ?fix[0]:scale('xscale', datum.x)" |
116 | 114 | }, |
117 | 115 | "y": { |
118 | 116 | "signal": "fix[1]!=null && node===datum.index ?fix[1]:scale('yscale', datum.y)" |
119 | 117 | }, |
120 | | - "tooltip": {"signal": "{ name: datum.name }"} |
| 118 | + "zindex": { |
| 119 | + "signal": "(hoverIndex === datum.index || indata('adjacentIndices', 'adj', datum.index)) ? 10 : 1" |
| 120 | + } |
121 | 121 | } |
122 | 122 | }, |
123 | 123 | "name": "nodes", |
|
126 | 126 | ], |
127 | 127 | "scales": [ |
128 | 128 | { |
129 | | - "domain": {"data": "node-data", "field": "group"}, |
| 129 | + "domain": {"data": "node-data", "field": "nodeType"}, |
130 | 130 | "name": "color", |
131 | 131 | "type": "ordinal", |
132 | 132 | "range": {"scheme": "category10"} |
133 | 133 | }, |
134 | 134 | { |
135 | | - "name": "xscale", |
136 | | - "zero": false, |
137 | 135 | "domain": {"signal": "xdom"}, |
138 | | - "range": {"signal": "xrange"} |
| 136 | + "name": "xscale", |
| 137 | + "range": {"signal": "xrange"}, |
| 138 | + "zero": false |
139 | 139 | }, |
140 | 140 | { |
141 | | - "name": "yscale", |
142 | | - "zero": false, |
143 | 141 | "domain": {"signal": "ydom"}, |
144 | | - "range": {"signal": "yrange"} |
| 142 | + "name": "yscale", |
| 143 | + "range": {"signal": "yrange"}, |
| 144 | + "zero": false |
145 | 145 | } |
146 | 146 | ], |
147 | 147 | "signals": [ |
|
151 | 151 | {"name": "yext", "update": "[height, 0]"}, |
152 | 152 | { |
153 | 153 | "name": "down", |
154 | | - "value": null, |
155 | 154 | "on": [ |
156 | 155 | {"events": "mouseup,touchend", "update": "null"}, |
157 | 156 | {"events": "mousedown, touchstart", "update": "xy()"}, |
|
160 | 159 | }, |
161 | 160 | { |
162 | 161 | "name": "xcur", |
163 | | - "value": null, |
164 | 162 | "on": [{"events": "mousedown, touchstart, touchend", "update": "xdom"}] |
165 | 163 | }, |
166 | 164 | { |
167 | 165 | "name": "ycur", |
168 | | - "value": null, |
169 | 166 | "on": [{"events": "mousedown, touchstart, touchend", "update": "ydom"}] |
170 | 167 | }, |
171 | 168 | { |
172 | 169 | "name": "delta", |
173 | | - "value": [0, 0], |
174 | 170 | "on": [ |
175 | 171 | { |
176 | 172 | "events": [ |
177 | 173 | { |
178 | | - "source": "window", |
179 | | - "type": "mousemove", |
180 | | - "consume": true, |
181 | 174 | "between": [ |
182 | 175 | {"type": "mousedown"}, |
183 | 176 | {"source": "window", "type": "mouseup"} |
184 | | - ] |
| 177 | + ], |
| 178 | + "consume": true, |
| 179 | + "source": "window", |
| 180 | + "type": "mousemove" |
185 | 181 | }, |
186 | 182 | { |
187 | | - "type": "touchmove", |
188 | 183 | "consume": true, |
189 | | - "filter": "event.touches.length === 1" |
| 184 | + "filter": "event.touches.length === 1", |
| 185 | + "type": "touchmove" |
190 | 186 | } |
191 | 187 | ], |
192 | 188 | "update": "down ? [down[0]-x(), y()-down[1]] : [0,0]" |
193 | 189 | } |
194 | | - ] |
| 190 | + ], |
| 191 | + "value": [0, 0] |
195 | 192 | }, |
196 | 193 | { |
197 | 194 | "name": "anchor", |
198 | | - "value": [0, 0], |
199 | 195 | "on": [ |
200 | 196 | { |
201 | 197 | "events": "wheel", |
202 | 198 | "update": "[invert('xscale', x()), invert('yscale', y())]" |
203 | 199 | }, |
204 | 200 | { |
205 | 201 | "events": { |
206 | | - "type": "touchstart", |
207 | | - "filter": "event.touches.length===2" |
| 202 | + "filter": "event.touches.length===2", |
| 203 | + "type": "touchstart" |
208 | 204 | }, |
209 | 205 | "update": "[(xdom[0] + xdom[1]) / 2, (ydom[0] + ydom[1]) / 2]" |
210 | 206 | } |
211 | | - ] |
| 207 | + ], |
| 208 | + "value": [0, 0] |
212 | 209 | }, |
213 | 210 | { |
214 | 211 | "name": "zoom", |
215 | | - "value": 1, |
216 | 212 | "on": [ |
217 | 213 | { |
218 | 214 | "events": "wheel!", |
|
225 | 221 | "update": "dist1 / dist2" |
226 | 222 | }, |
227 | 223 | {"events": [{"source": "view", "type": "dblclick"}], "update": "1"} |
228 | | - ] |
| 224 | + ], |
| 225 | + "value": 1 |
229 | 226 | }, |
230 | 227 | { |
231 | 228 | "name": "dist1", |
232 | | - "value": 0, |
233 | 229 | "on": [ |
234 | 230 | { |
235 | 231 | "events": { |
236 | | - "type": "touchstart", |
237 | | - "filter": "event.touches.length===2" |
| 232 | + "filter": "event.touches.length===2", |
| 233 | + "type": "touchstart" |
238 | 234 | }, |
239 | 235 | "update": "pinchDistance(event)" |
240 | 236 | }, |
241 | 237 | {"events": {"signal": "dist2"}, "update": "dist2"} |
242 | | - ] |
| 238 | + ], |
| 239 | + "value": 0 |
243 | 240 | }, |
244 | 241 | { |
245 | 242 | "name": "dist2", |
246 | | - "value": 0, |
247 | 243 | "on": [ |
248 | 244 | { |
249 | 245 | "events": { |
250 | | - "type": "touchmove", |
251 | 246 | "consume": true, |
252 | | - "filter": "event.touches.length===2" |
| 247 | + "filter": "event.touches.length===2", |
| 248 | + "type": "touchmove" |
253 | 249 | }, |
254 | 250 | "update": "pinchDistance(event)" |
255 | 251 | } |
256 | | - ] |
| 252 | + ], |
| 253 | + "value": 0 |
257 | 254 | }, |
258 | 255 | { |
259 | 256 | "name": "xdom", |
260 | | - "update": "xext", |
261 | 257 | "on": [ |
262 | 258 | { |
263 | 259 | "events": {"signal": "delta"}, |
|
268 | 264 | "update": "[anchor[0] + (xdom[0] - anchor[0]) * zoom, anchor[0] + (xdom[1] - anchor[0]) * zoom]" |
269 | 265 | }, |
270 | 266 | {"events": [{"source": "view", "type": "dblclick"}], "update": "xrange"} |
271 | | - ] |
| 267 | + ], |
| 268 | + "update": "xext" |
272 | 269 | }, |
273 | 270 | { |
274 | 271 | "name": "ydom", |
275 | | - "update": "yext", |
276 | 272 | "on": [ |
277 | 273 | { |
278 | 274 | "events": {"signal": "delta"}, |
|
283 | 279 | "update": "[anchor[1] + (ydom[0] - anchor[1]) * zoom, anchor[1] + (ydom[1] - anchor[1]) * zoom]" |
284 | 280 | }, |
285 | 281 | {"events": [{"source": "view", "type": "dblclick"}], "update": "yrange"} |
286 | | - ] |
| 282 | + ], |
| 283 | + "update": "yext" |
287 | 284 | }, |
288 | 285 | {"name": "size", "update": "clamp(20 / span(xdom), 1, 1000)"}, |
289 | 286 | { |
290 | 287 | "name": "cx", |
291 | | - "update": "width / 2", |
292 | 288 | "on": [ |
293 | 289 | { |
294 | 290 | "events": "[symbol:mousedown, window:mouseup] > window:mousemove", |
295 | 291 | "update": " cx==width/2?cx+0.001:width/2" |
296 | 292 | } |
297 | | - ] |
| 293 | + ], |
| 294 | + "update": "width / 2" |
298 | 295 | }, |
299 | 296 | {"name": "cy", "update": "height / 2"}, |
300 | 297 | {"name": "w", "value": 1200}, |
|
326 | 323 | { |
327 | 324 | "description": "State variable for active node fix status.", |
328 | 325 | "name": "fix", |
329 | | - "value": false, |
330 | 326 | "on": [ |
331 | 327 | { |
332 | 328 | "events": "symbol:mouseout[!event.buttons], window:mouseup", |
333 | 329 | "update": "false" |
334 | 330 | }, |
335 | | - {"events": "symbol:mouseover", "update": "fix || true", "force": true}, |
| 331 | + {"events": "symbol:mouseover", "force": true, "update": "fix || true"}, |
336 | 332 | { |
337 | 333 | "events": "[symbol:mousedown, window:mouseup] > window:mousemove!", |
338 | | - "update": "xy()", |
339 | | - "force": true |
| 334 | + "force": true, |
| 335 | + "update": "xy()" |
340 | 336 | } |
341 | | - ] |
| 337 | + ], |
| 338 | + "value": false |
342 | 339 | }, |
343 | 340 | { |
344 | 341 | "description": "Graph node most recently interacted with.", |
345 | 342 | "name": "node", |
346 | | - "value": null, |
347 | 343 | "on": [ |
348 | 344 | { |
349 | 345 | "events": "symbol:mouseover", |
|
354 | 350 | { |
355 | 351 | "description": "Flag to restart Force simulation upon data changes.", |
356 | 352 | "name": "restart", |
357 | | - "value": false, |
358 | | - "on": [{"events": {"signal": "fix"}, "update": "fix && fix.length"}] |
| 353 | + "on": [{"events": {"signal": "fix"}, "update": "fix && fix.length"}], |
| 354 | + "value": false |
| 355 | + } |
| 356 | + ], |
| 357 | + "legends": [ |
| 358 | + { |
| 359 | + "fill": "color", |
| 360 | + "title": "Color codes", |
| 361 | + "direction": "vertical", |
| 362 | + "labelLimit": 0 |
359 | 363 | } |
360 | 364 | ], |
361 | 365 | "$schema": "https://vega.github.io/schema/vega/v6.json", |
362 | | - "autosize": {"type": "none"}, |
| 366 | + "autosize": {"type": "pad", "resize": true, "contains": "padding"}, |
| 367 | + "padding": {"right": 260}, |
363 | 368 | "description": "A node-link diagram with force-directed layout", |
364 | 369 | "height": {"signal": "h"}, |
365 | 370 | "width": {"signal": "w"} |
|
0 commit comments