From cb6d92eb9e89815df1c6a6294ac6234e87cae796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Mon, 22 May 2023 17:53:50 +0200 Subject: [PATCH 1/7] balanced trees closes #1589 --- docs/marks/tree.md | 5 +- src/marks/tree.js | 49 +- src/transforms/tree.js | 9 +- test/output/flareCluster.svg | 632 ++++++++-------- test/output/flareIndent.svg | 1380 +++++++++++++++++----------------- test/output/flareTree.svg | 942 +++++++++++------------ test/output/greekGods.svg | 36 +- test/plots/flare-cluster.ts | 1 + test/plots/flare-indent.ts | 3 +- test/plots/flare-tree.ts | 1 + test/plots/greek-gods.ts | 2 +- 11 files changed, 1553 insertions(+), 1507 deletions(-) diff --git a/docs/marks/tree.md b/docs/marks/tree.md index 7ea61bbce2..e66f84c7ec 100644 --- a/docs/marks/tree.md +++ b/docs/marks/tree.md @@ -41,7 +41,8 @@ For example, here is a little family tree of Greek gods. Plot.plot({ axis: null, height: 100, - margin: 20, + margin: 10, + marginLeft: 35, marginRight: 120, marks: [ Plot.tree(gods, {textStroke: "var(--vp-c-bg)"}) @@ -63,6 +64,7 @@ As a more complete example, here is a visualization of a software package hierar Plot.plot({ axis: null, margin: 10, + marginLeft: 30, marginRight: 160, width: 688, height: 1800, @@ -80,6 +82,7 @@ The **treeLayout** option specifies the layout algorithm. The tree mark uses the Plot.plot({ axis: null, margin: 10, + marginLeft: 30, marginRight: 160, width: 688, height: 2400, diff --git a/src/marks/tree.js b/src/marks/tree.js index ebc6bf02e1..387d196f2a 100644 --- a/src/marks/tree.js +++ b/src/marks/tree.js @@ -2,6 +2,7 @@ import {cluster as Cluster} from "d3"; import {isNoneish} from "../options.js"; import {marks} from "../mark.js"; import {maybeTreeAnchor, treeLink, treeNode} from "../transforms/tree.js"; +import {filter} from "../transforms/basic.js"; import {dot} from "./dot.js"; import {link} from "./link.js"; import {text} from "./text.js"; @@ -27,10 +28,12 @@ export function tree( title = "node:path", dx, dy, + textAnchor, ...options } = {} ) { if (dx === undefined) dx = maybeTreeAnchor(options.treeAnchor).dx; + if (textAnchor !== undefined) throw new Error("textAnchor is not a configurable tree option"); return marks( link( data, @@ -50,18 +53,40 @@ export function tree( ), dotDot ? dot(data, treeNode({fill: fill === undefined ? "node:internal" : fill, title, ...options})) : null, textText != null - ? text( - data, - treeNode({ - text: textText, - fill: fill === undefined ? "currentColor" : fill, - stroke: textStroke, - dx, - dy, - title, - ...options - }) - ) + ? [ + text( + data, + filter( + (d) => !d.internal, + treeNode({ + text: textText, + fill: fill === undefined ? "currentColor" : fill, + stroke: textStroke, + dx, + dy, + title, + textAnchor: "start", + ...options + }) + ) + ), + text( + data, + filter( + "internal", + treeNode({ + text: textText, + fill: fill === undefined ? "currentColor" : fill, + stroke: textStroke, + dx: -dx, + dy, + title, + textAnchor: "end", + ...options + }) + ) + ) + ] : null ); } diff --git a/src/transforms/tree.js b/src/transforms/tree.js index 9ff9871ba1..b37c66b2bd 100644 --- a/src/transforms/tree.js +++ b/src/transforms/tree.js @@ -43,7 +43,14 @@ export function treeNode({ layout(root); for (const node of root.descendants()) { treeFacet.push(++treeIndex); - treeData[treeIndex] = node.data; + treeData[treeIndex] = { + data: node.data, + name: nodeName(node), + path: nodePath(node), + internal: nodeInternal(node), + depth: node.depth, // nodeDepth(node) + height: node.height // nodeHeight(node) + }; treeAnchor.position(node, treeIndex, X, Y); for (const o of outputs) o[output_values][treeIndex] = o[output_evaluate](node); } diff --git a/test/output/flareCluster.svg b/test/output/flareCluster.svg index 6e54354e41..cdfa34d8b7 100644 --- a/test/output/flareCluster.svg +++ b/test/output/flareCluster.svg @@ -14,276 +14,276 @@ } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - /flare - /flare/analytics - /flare/animate - /flare/data - /flare/display - /flare/flex - /flare/physics - /flare/query - /flare/scale - /flare/util - /flare/vis - /flare/analytics/cluster - /flare/analytics/graph - /flare/analytics/optimization + /flare + /flare/analytics + /flare/animate + /flare/data + /flare/display + /flare/flex + /flare/physics + /flare/query + /flare/scale + /flare/util + /flare/vis + /flare/analytics/cluster + /flare/analytics/graph + /flare/analytics/optimization /flare/animate/Easing /flare/animate/FunctionSequence - /flare/animate/interpolate + /flare/animate/interpolate /flare/animate/ISchedulable /flare/animate/Parallel /flare/animate/Pause @@ -293,7 +293,7 @@ /flare/animate/Transitioner /flare/animate/TransitionEvent /flare/animate/Tween - /flare/data/converters + /flare/data/converters /flare/data/DataField /flare/data/DataSchema /flare/data/DataSet @@ -331,7 +331,7 @@ /flare/query/Literal /flare/query/Match /flare/query/Maximum - /flare/query/methods + /flare/query/methods /flare/query/Minimum /flare/query/Not /flare/query/Or @@ -358,25 +358,25 @@ /flare/util/Displays /flare/util/Filter /flare/util/Geometry - /flare/util/heap + /flare/util/heap /flare/util/IEvaluable /flare/util/IPredicate /flare/util/IValueProxy - /flare/util/math + /flare/util/math /flare/util/Maths /flare/util/Orientation - /flare/util/palette + /flare/util/palette /flare/util/Property /flare/util/Shapes /flare/util/Sort /flare/util/Stats /flare/util/Strings - /flare/vis/axis - /flare/vis/controls - /flare/vis/data - /flare/vis/events - /flare/vis/legend - /flare/vis/operator + /flare/vis/axis + /flare/vis/controls + /flare/vis/data + /flare/vis/events + /flare/vis/legend + /flare/vis/operator /flare/vis/Visualization /flare/analytics/cluster/AgglomerativeCluster /flare/analytics/cluster/CommunityStructure @@ -464,7 +464,7 @@ /flare/vis/data/DataSprite /flare/vis/data/EdgeSprite /flare/vis/data/NodeSprite - /flare/vis/data/render + /flare/vis/data/render /flare/vis/data/ScaleBinding /flare/vis/data/Tree /flare/vis/data/TreeBuilder @@ -475,12 +475,12 @@ /flare/vis/legend/Legend /flare/vis/legend/LegendItem /flare/vis/legend/LegendRange - /flare/vis/operator/distortion - /flare/vis/operator/encoder - /flare/vis/operator/filter + /flare/vis/operator/distortion + /flare/vis/operator/encoder + /flare/vis/operator/filter /flare/vis/operator/IOperator - /flare/vis/operator/label - /flare/vis/operator/layout + /flare/vis/operator/label + /flare/vis/operator/layout /flare/vis/operator/Operator /flare/vis/operator/OperatorList /flare/vis/operator/OperatorSequence @@ -521,23 +521,8 @@ /flare/vis/operator/layout/TreeMapLayout - flare/flare - analytics/flare/analytics - animate/flare/animate - data/flare/data - display/flare/display - flex/flare/flex - physics/flare/physics - query/flare/query - scale/flare/scale - util/flare/util - vis/flare/vis - cluster/flare/analytics/cluster - graph/flare/analytics/graph - optimization/flare/analytics/optimization Easing/flare/animate/Easing FunctionSequence/flare/animate/FunctionSequence - interpolate/flare/animate/interpolate ISchedulable/flare/animate/ISchedulable Parallel/flare/animate/Parallel Pause/flare/animate/Pause @@ -547,7 +532,6 @@ Transitioner/flare/animate/Transitioner TransitionEvent/flare/animate/TransitionEvent Tween/flare/animate/Tween - converters/flare/data/converters DataField/flare/data/DataField DataSchema/flare/data/DataSchema DataSet/flare/data/DataSet @@ -585,7 +569,6 @@ Literal/flare/query/Literal Match/flare/query/Match Maximum/flare/query/Maximum - methods/flare/query/methods Minimum/flare/query/Minimum Not/flare/query/Not Or/flare/query/Or @@ -612,25 +595,16 @@ Displays/flare/util/Displays Filter/flare/util/Filter Geometry/flare/util/Geometry - heap/flare/util/heap IEvaluable/flare/util/IEvaluable IPredicate/flare/util/IPredicate IValueProxy/flare/util/IValueProxy - math/flare/util/math Maths/flare/util/Maths Orientation/flare/util/Orientation - palette/flare/util/palette Property/flare/util/Property Shapes/flare/util/Shapes Sort/flare/util/Sort Stats/flare/util/Stats Strings/flare/util/Strings - axis/flare/vis/axis - controls/flare/vis/controls - data/flare/vis/data - events/flare/vis/events - legend/flare/vis/legend - operator/flare/vis/operator Visualization/flare/vis/Visualization AgglomerativeCluster/flare/analytics/cluster/AgglomerativeCluster CommunityStructure/flare/analytics/cluster/CommunityStructure @@ -718,7 +692,6 @@ DataSprite/flare/vis/data/DataSprite EdgeSprite/flare/vis/data/EdgeSprite NodeSprite/flare/vis/data/NodeSprite - render/flare/vis/data/render ScaleBinding/flare/vis/data/ScaleBinding Tree/flare/vis/data/Tree TreeBuilder/flare/vis/data/TreeBuilder @@ -729,12 +702,7 @@ Legend/flare/vis/legend/Legend LegendItem/flare/vis/legend/LegendItem LegendRange/flare/vis/legend/LegendRange - distortion/flare/vis/operator/distortion - encoder/flare/vis/operator/encoder - filter/flare/vis/operator/filter IOperator/flare/vis/operator/IOperator - label/flare/vis/operator/label - layout/flare/vis/operator/layout Operator/flare/vis/operator/Operator OperatorList/flare/vis/operator/OperatorList OperatorSequence/flare/vis/operator/OperatorSequence @@ -774,4 +742,38 @@ StackedAreaLayout/flare/vis/operator/layout/StackedAreaLayout TreeMapLayout/flare/vis/operator/layout/TreeMapLayout + + flare/flare + analytics/flare/analytics + animate/flare/animate + data/flare/data + display/flare/display + flex/flare/flex + physics/flare/physics + query/flare/query + scale/flare/scale + util/flare/util + vis/flare/vis + cluster/flare/analytics/cluster + graph/flare/analytics/graph + optimization/flare/analytics/optimization + interpolate/flare/animate/interpolate + converters/flare/data/converters + methods/flare/query/methods + heap/flare/util/heap + math/flare/util/math + palette/flare/util/palette + axis/flare/vis/axis + controls/flare/vis/controls + data/flare/vis/data + events/flare/vis/events + legend/flare/vis/legend + operator/flare/vis/operator + render/flare/vis/data/render + distortion/flare/vis/operator/distortion + encoder/flare/vis/operator/encoder + filter/flare/vis/operator/filter + label/flare/vis/operator/label + layout/flare/vis/operator/layout + \ No newline at end of file diff --git a/test/output/flareIndent.svg b/test/output/flareIndent.svg index c21599c161..2d09442c8e 100644 --- a/test/output/flareIndent.svg +++ b/test/output/flareIndent.svg @@ -14,478 +14,478 @@ } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - /flare - /flare/analytics - /flare/animate - /flare/data - /flare/display - /flare/flex - /flare/physics - /flare/query - /flare/scale - /flare/util - /flare/vis - /flare/analytics/cluster - /flare/analytics/graph - /flare/analytics/optimization - /flare/animate/Easing - /flare/animate/FunctionSequence - /flare/animate/interpolate - /flare/animate/ISchedulable - /flare/animate/Parallel - /flare/animate/Pause - /flare/animate/Scheduler - /flare/animate/Sequence - /flare/animate/Transition - /flare/animate/Transitioner - /flare/animate/TransitionEvent - /flare/animate/Tween - /flare/data/converters - /flare/data/DataField - /flare/data/DataSchema - /flare/data/DataSet - /flare/data/DataSource - /flare/data/DataTable - /flare/data/DataUtil - /flare/display/DirtySprite - /flare/display/LineSprite - /flare/display/RectSprite - /flare/display/TextSprite - /flare/flex/FlareVis - /flare/physics/DragForce - /flare/physics/GravityForce - /flare/physics/IForce - /flare/physics/NBodyForce - /flare/physics/Particle - /flare/physics/Simulation - /flare/physics/Spring - /flare/physics/SpringForce - /flare/query/AggregateExpression - /flare/query/And - /flare/query/Arithmetic - /flare/query/Average - /flare/query/BinaryExpression - /flare/query/Comparison - /flare/query/CompositeExpression - /flare/query/Count - /flare/query/DateUtil - /flare/query/Distinct - /flare/query/Expression - /flare/query/ExpressionIterator - /flare/query/Fn - /flare/query/If - /flare/query/IsA - /flare/query/Literal - /flare/query/Match - /flare/query/Maximum - /flare/query/methods - /flare/query/Minimum - /flare/query/Not - /flare/query/Or - /flare/query/Query - /flare/query/Range - /flare/query/StringUtil - /flare/query/Sum - /flare/query/Variable - /flare/query/Variance - /flare/query/Xor - /flare/scale/IScaleMap - /flare/scale/LinearScale - /flare/scale/LogScale - /flare/scale/OrdinalScale - /flare/scale/QuantileScale - /flare/scale/QuantitativeScale - /flare/scale/RootScale - /flare/scale/Scale - /flare/scale/ScaleType - /flare/scale/TimeScale - /flare/util/Arrays - /flare/util/Colors - /flare/util/Dates - /flare/util/Displays - /flare/util/Filter - /flare/util/Geometry - /flare/util/heap - /flare/util/IEvaluable - /flare/util/IPredicate - /flare/util/IValueProxy - /flare/util/math - /flare/util/Maths - /flare/util/Orientation - /flare/util/palette - /flare/util/Property - /flare/util/Shapes - /flare/util/Sort - /flare/util/Stats - /flare/util/Strings - /flare/vis/axis - /flare/vis/controls - /flare/vis/data - /flare/vis/events - /flare/vis/legend - /flare/vis/operator - /flare/vis/Visualization - /flare/analytics/cluster/AgglomerativeCluster - /flare/analytics/cluster/CommunityStructure - /flare/analytics/cluster/HierarchicalCluster - /flare/analytics/cluster/MergeEdge - /flare/analytics/graph/BetweennessCentrality - /flare/analytics/graph/LinkDistance - /flare/analytics/graph/MaxFlowMinCut - /flare/analytics/graph/ShortestPaths - /flare/analytics/graph/SpanningTree - /flare/analytics/optimization/AspectRatioBanker - /flare/animate/interpolate/ArrayInterpolator - /flare/animate/interpolate/ColorInterpolator - /flare/animate/interpolate/DateInterpolator - /flare/animate/interpolate/Interpolator - /flare/animate/interpolate/MatrixInterpolator - /flare/animate/interpolate/NumberInterpolator - /flare/animate/interpolate/ObjectInterpolator - /flare/animate/interpolate/PointInterpolator - /flare/animate/interpolate/RectangleInterpolator - /flare/data/converters/Converters - /flare/data/converters/DelimitedTextConverter - /flare/data/converters/GraphMLConverter - /flare/data/converters/IDataConverter - /flare/data/converters/JSONConverter - /flare/query/methods/add - /flare/query/methods/and - /flare/query/methods/average - /flare/query/methods/count - /flare/query/methods/distinct - /flare/query/methods/div - /flare/query/methods/eq - /flare/query/methods/fn - /flare/query/methods/gt - /flare/query/methods/gte - /flare/query/methods/iff - /flare/query/methods/isa - /flare/query/methods/lt - /flare/query/methods/lte - /flare/query/methods/max - /flare/query/methods/min - /flare/query/methods/mod - /flare/query/methods/mul - /flare/query/methods/neq - /flare/query/methods/not - /flare/query/methods/or - /flare/query/methods/orderby - /flare/query/methods/range - /flare/query/methods/select - /flare/query/methods/stddev - /flare/query/methods/sub - /flare/query/methods/sum - /flare/query/methods/update - /flare/query/methods/variance - /flare/query/methods/where - /flare/query/methods/xor - /flare/query/methods/_ - /flare/util/heap/FibonacciHeap - /flare/util/heap/HeapNode - /flare/util/math/DenseMatrix - /flare/util/math/IMatrix - /flare/util/math/SparseMatrix - /flare/util/palette/ColorPalette - /flare/util/palette/Palette - /flare/util/palette/ShapePalette - /flare/util/palette/SizePalette - /flare/vis/axis/Axes - /flare/vis/axis/Axis - /flare/vis/axis/AxisGridLine - /flare/vis/axis/AxisLabel - /flare/vis/axis/CartesianAxes - /flare/vis/controls/AnchorControl - /flare/vis/controls/ClickControl - /flare/vis/controls/Control - /flare/vis/controls/ControlList - /flare/vis/controls/DragControl - /flare/vis/controls/ExpandControl - /flare/vis/controls/HoverControl - /flare/vis/controls/IControl - /flare/vis/controls/PanZoomControl - /flare/vis/controls/SelectionControl - /flare/vis/controls/TooltipControl - /flare/vis/data/Data - /flare/vis/data/DataList - /flare/vis/data/DataSprite - /flare/vis/data/EdgeSprite - /flare/vis/data/NodeSprite - /flare/vis/data/render - /flare/vis/data/ScaleBinding - /flare/vis/data/Tree - /flare/vis/data/TreeBuilder - /flare/vis/events/DataEvent - /flare/vis/events/SelectionEvent - /flare/vis/events/TooltipEvent - /flare/vis/events/VisualizationEvent - /flare/vis/legend/Legend - /flare/vis/legend/LegendItem - /flare/vis/legend/LegendRange - /flare/vis/operator/distortion - /flare/vis/operator/encoder - /flare/vis/operator/filter - /flare/vis/operator/IOperator - /flare/vis/operator/label - /flare/vis/operator/layout - /flare/vis/operator/Operator - /flare/vis/operator/OperatorList - /flare/vis/operator/OperatorSequence - /flare/vis/operator/OperatorSwitch - /flare/vis/operator/SortOperator + /flare + /flare/analytics + /flare/animate + /flare/data + /flare/display + /flare/flex + /flare/physics + /flare/query + /flare/scale + /flare/util + /flare/vis + /flare/analytics/cluster + /flare/analytics/graph + /flare/analytics/optimization + /flare/animate/Easing + /flare/animate/FunctionSequence + /flare/animate/interpolate + /flare/animate/ISchedulable + /flare/animate/Parallel + /flare/animate/Pause + /flare/animate/Scheduler + /flare/animate/Sequence + /flare/animate/Transition + /flare/animate/Transitioner + /flare/animate/TransitionEvent + /flare/animate/Tween + /flare/data/converters + /flare/data/DataField + /flare/data/DataSchema + /flare/data/DataSet + /flare/data/DataSource + /flare/data/DataTable + /flare/data/DataUtil + /flare/display/DirtySprite + /flare/display/LineSprite + /flare/display/RectSprite + /flare/display/TextSprite + /flare/flex/FlareVis + /flare/physics/DragForce + /flare/physics/GravityForce + /flare/physics/IForce + /flare/physics/NBodyForce + /flare/physics/Particle + /flare/physics/Simulation + /flare/physics/Spring + /flare/physics/SpringForce + /flare/query/AggregateExpression + /flare/query/And + /flare/query/Arithmetic + /flare/query/Average + /flare/query/BinaryExpression + /flare/query/Comparison + /flare/query/CompositeExpression + /flare/query/Count + /flare/query/DateUtil + /flare/query/Distinct + /flare/query/Expression + /flare/query/ExpressionIterator + /flare/query/Fn + /flare/query/If + /flare/query/IsA + /flare/query/Literal + /flare/query/Match + /flare/query/Maximum + /flare/query/methods + /flare/query/Minimum + /flare/query/Not + /flare/query/Or + /flare/query/Query + /flare/query/Range + /flare/query/StringUtil + /flare/query/Sum + /flare/query/Variable + /flare/query/Variance + /flare/query/Xor + /flare/scale/IScaleMap + /flare/scale/LinearScale + /flare/scale/LogScale + /flare/scale/OrdinalScale + /flare/scale/QuantileScale + /flare/scale/QuantitativeScale + /flare/scale/RootScale + /flare/scale/Scale + /flare/scale/ScaleType + /flare/scale/TimeScale + /flare/util/Arrays + /flare/util/Colors + /flare/util/Dates + /flare/util/Displays + /flare/util/Filter + /flare/util/Geometry + /flare/util/heap + /flare/util/IEvaluable + /flare/util/IPredicate + /flare/util/IValueProxy + /flare/util/math + /flare/util/Maths + /flare/util/Orientation + /flare/util/palette + /flare/util/Property + /flare/util/Shapes + /flare/util/Sort + /flare/util/Stats + /flare/util/Strings + /flare/vis/axis + /flare/vis/controls + /flare/vis/data + /flare/vis/events + /flare/vis/legend + /flare/vis/operator + /flare/vis/Visualization + /flare/analytics/cluster/AgglomerativeCluster + /flare/analytics/cluster/CommunityStructure + /flare/analytics/cluster/HierarchicalCluster + /flare/analytics/cluster/MergeEdge + /flare/analytics/graph/BetweennessCentrality + /flare/analytics/graph/LinkDistance + /flare/analytics/graph/MaxFlowMinCut + /flare/analytics/graph/ShortestPaths + /flare/analytics/graph/SpanningTree + /flare/analytics/optimization/AspectRatioBanker + /flare/animate/interpolate/ArrayInterpolator + /flare/animate/interpolate/ColorInterpolator + /flare/animate/interpolate/DateInterpolator + /flare/animate/interpolate/Interpolator + /flare/animate/interpolate/MatrixInterpolator + /flare/animate/interpolate/NumberInterpolator + /flare/animate/interpolate/ObjectInterpolator + /flare/animate/interpolate/PointInterpolator + /flare/animate/interpolate/RectangleInterpolator + /flare/data/converters/Converters + /flare/data/converters/DelimitedTextConverter + /flare/data/converters/GraphMLConverter + /flare/data/converters/IDataConverter + /flare/data/converters/JSONConverter + /flare/query/methods/add + /flare/query/methods/and + /flare/query/methods/average + /flare/query/methods/count + /flare/query/methods/distinct + /flare/query/methods/div + /flare/query/methods/eq + /flare/query/methods/fn + /flare/query/methods/gt + /flare/query/methods/gte + /flare/query/methods/iff + /flare/query/methods/isa + /flare/query/methods/lt + /flare/query/methods/lte + /flare/query/methods/max + /flare/query/methods/min + /flare/query/methods/mod + /flare/query/methods/mul + /flare/query/methods/neq + /flare/query/methods/not + /flare/query/methods/or + /flare/query/methods/orderby + /flare/query/methods/range + /flare/query/methods/select + /flare/query/methods/stddev + /flare/query/methods/sub + /flare/query/methods/sum + /flare/query/methods/update + /flare/query/methods/variance + /flare/query/methods/where + /flare/query/methods/xor + /flare/query/methods/_ + /flare/util/heap/FibonacciHeap + /flare/util/heap/HeapNode + /flare/util/math/DenseMatrix + /flare/util/math/IMatrix + /flare/util/math/SparseMatrix + /flare/util/palette/ColorPalette + /flare/util/palette/Palette + /flare/util/palette/ShapePalette + /flare/util/palette/SizePalette + /flare/vis/axis/Axes + /flare/vis/axis/Axis + /flare/vis/axis/AxisGridLine + /flare/vis/axis/AxisLabel + /flare/vis/axis/CartesianAxes + /flare/vis/controls/AnchorControl + /flare/vis/controls/ClickControl + /flare/vis/controls/Control + /flare/vis/controls/ControlList + /flare/vis/controls/DragControl + /flare/vis/controls/ExpandControl + /flare/vis/controls/HoverControl + /flare/vis/controls/IControl + /flare/vis/controls/PanZoomControl + /flare/vis/controls/SelectionControl + /flare/vis/controls/TooltipControl + /flare/vis/data/Data + /flare/vis/data/DataList + /flare/vis/data/DataSprite + /flare/vis/data/EdgeSprite + /flare/vis/data/NodeSprite + /flare/vis/data/render + /flare/vis/data/ScaleBinding + /flare/vis/data/Tree + /flare/vis/data/TreeBuilder + /flare/vis/events/DataEvent + /flare/vis/events/SelectionEvent + /flare/vis/events/TooltipEvent + /flare/vis/events/VisualizationEvent + /flare/vis/legend/Legend + /flare/vis/legend/LegendItem + /flare/vis/legend/LegendRange + /flare/vis/operator/distortion + /flare/vis/operator/encoder + /flare/vis/operator/filter + /flare/vis/operator/IOperator + /flare/vis/operator/label + /flare/vis/operator/layout + /flare/vis/operator/Operator + /flare/vis/operator/OperatorList + /flare/vis/operator/OperatorSequence + /flare/vis/operator/OperatorSwitch + /flare/vis/operator/SortOperator /flare/vis/data/render/ArrowType /flare/vis/data/render/EdgeRenderer /flare/vis/data/render/IRenderer @@ -521,225 +521,193 @@ /flare/vis/operator/layout/TreeMapLayout - flare/flare - analytics/flare/analytics - animate/flare/animate - data/flare/data - display/flare/display - flex/flare/flex - physics/flare/physics - query/flare/query - scale/flare/scale - util/flare/util - vis/flare/vis - cluster/flare/analytics/cluster - graph/flare/analytics/graph - optimization/flare/analytics/optimization - Easing/flare/animate/Easing - FunctionSequence/flare/animate/FunctionSequence - interpolate/flare/animate/interpolate - ISchedulable/flare/animate/ISchedulable - Parallel/flare/animate/Parallel - Pause/flare/animate/Pause - Scheduler/flare/animate/Scheduler - Sequence/flare/animate/Sequence - Transition/flare/animate/Transition - Transitioner/flare/animate/Transitioner - TransitionEvent/flare/animate/TransitionEvent - Tween/flare/animate/Tween - converters/flare/data/converters - DataField/flare/data/DataField - DataSchema/flare/data/DataSchema - DataSet/flare/data/DataSet - DataSource/flare/data/DataSource - DataTable/flare/data/DataTable - DataUtil/flare/data/DataUtil - DirtySprite/flare/display/DirtySprite - LineSprite/flare/display/LineSprite - RectSprite/flare/display/RectSprite - TextSprite/flare/display/TextSprite - FlareVis/flare/flex/FlareVis - DragForce/flare/physics/DragForce - GravityForce/flare/physics/GravityForce - IForce/flare/physics/IForce - NBodyForce/flare/physics/NBodyForce - Particle/flare/physics/Particle - Simulation/flare/physics/Simulation - Spring/flare/physics/Spring - SpringForce/flare/physics/SpringForce - AggregateExpression/flare/query/AggregateExpression - And/flare/query/And - Arithmetic/flare/query/Arithmetic - Average/flare/query/Average - BinaryExpression/flare/query/BinaryExpression - Comparison/flare/query/Comparison - CompositeExpression/flare/query/CompositeExpression - Count/flare/query/Count - DateUtil/flare/query/DateUtil - Distinct/flare/query/Distinct - Expression/flare/query/Expression - ExpressionIterator/flare/query/ExpressionIterator - Fn/flare/query/Fn - If/flare/query/If - IsA/flare/query/IsA - Literal/flare/query/Literal - Match/flare/query/Match - Maximum/flare/query/Maximum - methods/flare/query/methods - Minimum/flare/query/Minimum - Not/flare/query/Not - Or/flare/query/Or - Query/flare/query/Query - Range/flare/query/Range - StringUtil/flare/query/StringUtil - Sum/flare/query/Sum - Variable/flare/query/Variable - Variance/flare/query/Variance - Xor/flare/query/Xor - IScaleMap/flare/scale/IScaleMap - LinearScale/flare/scale/LinearScale - LogScale/flare/scale/LogScale - OrdinalScale/flare/scale/OrdinalScale - QuantileScale/flare/scale/QuantileScale - QuantitativeScale/flare/scale/QuantitativeScale - RootScale/flare/scale/RootScale - Scale/flare/scale/Scale - ScaleType/flare/scale/ScaleType - TimeScale/flare/scale/TimeScale - Arrays/flare/util/Arrays - Colors/flare/util/Colors - Dates/flare/util/Dates - Displays/flare/util/Displays - Filter/flare/util/Filter - Geometry/flare/util/Geometry - heap/flare/util/heap - IEvaluable/flare/util/IEvaluable - IPredicate/flare/util/IPredicate - IValueProxy/flare/util/IValueProxy - math/flare/util/math - Maths/flare/util/Maths - Orientation/flare/util/Orientation - palette/flare/util/palette - Property/flare/util/Property - Shapes/flare/util/Shapes - Sort/flare/util/Sort - Stats/flare/util/Stats - Strings/flare/util/Strings - axis/flare/vis/axis - controls/flare/vis/controls - data/flare/vis/data - events/flare/vis/events - legend/flare/vis/legend - operator/flare/vis/operator - Visualization/flare/vis/Visualization - AgglomerativeCluster/flare/analytics/cluster/AgglomerativeCluster - CommunityStructure/flare/analytics/cluster/CommunityStructure - HierarchicalCluster/flare/analytics/cluster/HierarchicalCluster - MergeEdge/flare/analytics/cluster/MergeEdge - BetweennessCentrality/flare/analytics/graph/BetweennessCentrality - LinkDistance/flare/analytics/graph/LinkDistance - MaxFlowMinCut/flare/analytics/graph/MaxFlowMinCut - ShortestPaths/flare/analytics/graph/ShortestPaths - SpanningTree/flare/analytics/graph/SpanningTree - AspectRatioBanker/flare/analytics/optimization/AspectRatioBanker - ArrayInterpolator/flare/animate/interpolate/ArrayInterpolator - ColorInterpolator/flare/animate/interpolate/ColorInterpolator - DateInterpolator/flare/animate/interpolate/DateInterpolator - Interpolator/flare/animate/interpolate/Interpolator - MatrixInterpolator/flare/animate/interpolate/MatrixInterpolator - NumberInterpolator/flare/animate/interpolate/NumberInterpolator - ObjectInterpolator/flare/animate/interpolate/ObjectInterpolator - PointInterpolator/flare/animate/interpolate/PointInterpolator - RectangleInterpolator/flare/animate/interpolate/RectangleInterpolator - Converters/flare/data/converters/Converters - DelimitedTextConverter/flare/data/converters/DelimitedTextConverter - GraphMLConverter/flare/data/converters/GraphMLConverter - IDataConverter/flare/data/converters/IDataConverter - JSONConverter/flare/data/converters/JSONConverter - add/flare/query/methods/add - and/flare/query/methods/and - average/flare/query/methods/average - count/flare/query/methods/count - distinct/flare/query/methods/distinct - div/flare/query/methods/div - eq/flare/query/methods/eq - fn/flare/query/methods/fn - gt/flare/query/methods/gt - gte/flare/query/methods/gte - iff/flare/query/methods/iff - isa/flare/query/methods/isa - lt/flare/query/methods/lt - lte/flare/query/methods/lte - max/flare/query/methods/max - min/flare/query/methods/min - mod/flare/query/methods/mod - mul/flare/query/methods/mul - neq/flare/query/methods/neq - not/flare/query/methods/not - or/flare/query/methods/or - orderby/flare/query/methods/orderby - range/flare/query/methods/range - select/flare/query/methods/select - stddev/flare/query/methods/stddev - sub/flare/query/methods/sub - sum/flare/query/methods/sum - update/flare/query/methods/update - variance/flare/query/methods/variance - where/flare/query/methods/where - xor/flare/query/methods/xor - _/flare/query/methods/_ - FibonacciHeap/flare/util/heap/FibonacciHeap - HeapNode/flare/util/heap/HeapNode - DenseMatrix/flare/util/math/DenseMatrix - IMatrix/flare/util/math/IMatrix - SparseMatrix/flare/util/math/SparseMatrix - ColorPalette/flare/util/palette/ColorPalette - Palette/flare/util/palette/Palette - ShapePalette/flare/util/palette/ShapePalette - SizePalette/flare/util/palette/SizePalette - Axes/flare/vis/axis/Axes - Axis/flare/vis/axis/Axis - AxisGridLine/flare/vis/axis/AxisGridLine - AxisLabel/flare/vis/axis/AxisLabel - CartesianAxes/flare/vis/axis/CartesianAxes - AnchorControl/flare/vis/controls/AnchorControl - ClickControl/flare/vis/controls/ClickControl - Control/flare/vis/controls/Control - ControlList/flare/vis/controls/ControlList - DragControl/flare/vis/controls/DragControl - ExpandControl/flare/vis/controls/ExpandControl - HoverControl/flare/vis/controls/HoverControl - IControl/flare/vis/controls/IControl - PanZoomControl/flare/vis/controls/PanZoomControl - SelectionControl/flare/vis/controls/SelectionControl - TooltipControl/flare/vis/controls/TooltipControl - Data/flare/vis/data/Data - DataList/flare/vis/data/DataList - DataSprite/flare/vis/data/DataSprite - EdgeSprite/flare/vis/data/EdgeSprite - NodeSprite/flare/vis/data/NodeSprite - render/flare/vis/data/render - ScaleBinding/flare/vis/data/ScaleBinding - Tree/flare/vis/data/Tree - TreeBuilder/flare/vis/data/TreeBuilder - DataEvent/flare/vis/events/DataEvent - SelectionEvent/flare/vis/events/SelectionEvent - TooltipEvent/flare/vis/events/TooltipEvent - VisualizationEvent/flare/vis/events/VisualizationEvent - Legend/flare/vis/legend/Legend - LegendItem/flare/vis/legend/LegendItem - LegendRange/flare/vis/legend/LegendRange - distortion/flare/vis/operator/distortion - encoder/flare/vis/operator/encoder - filter/flare/vis/operator/filter - IOperator/flare/vis/operator/IOperator - label/flare/vis/operator/label - layout/flare/vis/operator/layout - Operator/flare/vis/operator/Operator - OperatorList/flare/vis/operator/OperatorList - OperatorSequence/flare/vis/operator/OperatorSequence - OperatorSwitch/flare/vis/operator/OperatorSwitch - SortOperator/flare/vis/operator/SortOperator + Easing/flare/animate/Easing + FunctionSequence/flare/animate/FunctionSequence + ISchedulable/flare/animate/ISchedulable + Parallel/flare/animate/Parallel + Pause/flare/animate/Pause + Scheduler/flare/animate/Scheduler + Sequence/flare/animate/Sequence + Transition/flare/animate/Transition + Transitioner/flare/animate/Transitioner + TransitionEvent/flare/animate/TransitionEvent + Tween/flare/animate/Tween + DataField/flare/data/DataField + DataSchema/flare/data/DataSchema + DataSet/flare/data/DataSet + DataSource/flare/data/DataSource + DataTable/flare/data/DataTable + DataUtil/flare/data/DataUtil + DirtySprite/flare/display/DirtySprite + LineSprite/flare/display/LineSprite + RectSprite/flare/display/RectSprite + TextSprite/flare/display/TextSprite + FlareVis/flare/flex/FlareVis + DragForce/flare/physics/DragForce + GravityForce/flare/physics/GravityForce + IForce/flare/physics/IForce + NBodyForce/flare/physics/NBodyForce + Particle/flare/physics/Particle + Simulation/flare/physics/Simulation + Spring/flare/physics/Spring + SpringForce/flare/physics/SpringForce + AggregateExpression/flare/query/AggregateExpression + And/flare/query/And + Arithmetic/flare/query/Arithmetic + Average/flare/query/Average + BinaryExpression/flare/query/BinaryExpression + Comparison/flare/query/Comparison + CompositeExpression/flare/query/CompositeExpression + Count/flare/query/Count + DateUtil/flare/query/DateUtil + Distinct/flare/query/Distinct + Expression/flare/query/Expression + ExpressionIterator/flare/query/ExpressionIterator + Fn/flare/query/Fn + If/flare/query/If + IsA/flare/query/IsA + Literal/flare/query/Literal + Match/flare/query/Match + Maximum/flare/query/Maximum + Minimum/flare/query/Minimum + Not/flare/query/Not + Or/flare/query/Or + Query/flare/query/Query + Range/flare/query/Range + StringUtil/flare/query/StringUtil + Sum/flare/query/Sum + Variable/flare/query/Variable + Variance/flare/query/Variance + Xor/flare/query/Xor + IScaleMap/flare/scale/IScaleMap + LinearScale/flare/scale/LinearScale + LogScale/flare/scale/LogScale + OrdinalScale/flare/scale/OrdinalScale + QuantileScale/flare/scale/QuantileScale + QuantitativeScale/flare/scale/QuantitativeScale + RootScale/flare/scale/RootScale + Scale/flare/scale/Scale + ScaleType/flare/scale/ScaleType + TimeScale/flare/scale/TimeScale + Arrays/flare/util/Arrays + Colors/flare/util/Colors + Dates/flare/util/Dates + Displays/flare/util/Displays + Filter/flare/util/Filter + Geometry/flare/util/Geometry + IEvaluable/flare/util/IEvaluable + IPredicate/flare/util/IPredicate + IValueProxy/flare/util/IValueProxy + Maths/flare/util/Maths + Orientation/flare/util/Orientation + Property/flare/util/Property + Shapes/flare/util/Shapes + Sort/flare/util/Sort + Stats/flare/util/Stats + Strings/flare/util/Strings + Visualization/flare/vis/Visualization + AgglomerativeCluster/flare/analytics/cluster/AgglomerativeCluster + CommunityStructure/flare/analytics/cluster/CommunityStructure + HierarchicalCluster/flare/analytics/cluster/HierarchicalCluster + MergeEdge/flare/analytics/cluster/MergeEdge + BetweennessCentrality/flare/analytics/graph/BetweennessCentrality + LinkDistance/flare/analytics/graph/LinkDistance + MaxFlowMinCut/flare/analytics/graph/MaxFlowMinCut + ShortestPaths/flare/analytics/graph/ShortestPaths + SpanningTree/flare/analytics/graph/SpanningTree + AspectRatioBanker/flare/analytics/optimization/AspectRatioBanker + ArrayInterpolator/flare/animate/interpolate/ArrayInterpolator + ColorInterpolator/flare/animate/interpolate/ColorInterpolator + DateInterpolator/flare/animate/interpolate/DateInterpolator + Interpolator/flare/animate/interpolate/Interpolator + MatrixInterpolator/flare/animate/interpolate/MatrixInterpolator + NumberInterpolator/flare/animate/interpolate/NumberInterpolator + ObjectInterpolator/flare/animate/interpolate/ObjectInterpolator + PointInterpolator/flare/animate/interpolate/PointInterpolator + RectangleInterpolator/flare/animate/interpolate/RectangleInterpolator + Converters/flare/data/converters/Converters + DelimitedTextConverter/flare/data/converters/DelimitedTextConverter + GraphMLConverter/flare/data/converters/GraphMLConverter + IDataConverter/flare/data/converters/IDataConverter + JSONConverter/flare/data/converters/JSONConverter + add/flare/query/methods/add + and/flare/query/methods/and + average/flare/query/methods/average + count/flare/query/methods/count + distinct/flare/query/methods/distinct + div/flare/query/methods/div + eq/flare/query/methods/eq + fn/flare/query/methods/fn + gt/flare/query/methods/gt + gte/flare/query/methods/gte + iff/flare/query/methods/iff + isa/flare/query/methods/isa + lt/flare/query/methods/lt + lte/flare/query/methods/lte + max/flare/query/methods/max + min/flare/query/methods/min + mod/flare/query/methods/mod + mul/flare/query/methods/mul + neq/flare/query/methods/neq + not/flare/query/methods/not + or/flare/query/methods/or + orderby/flare/query/methods/orderby + range/flare/query/methods/range + select/flare/query/methods/select + stddev/flare/query/methods/stddev + sub/flare/query/methods/sub + sum/flare/query/methods/sum + update/flare/query/methods/update + variance/flare/query/methods/variance + where/flare/query/methods/where + xor/flare/query/methods/xor + _/flare/query/methods/_ + FibonacciHeap/flare/util/heap/FibonacciHeap + HeapNode/flare/util/heap/HeapNode + DenseMatrix/flare/util/math/DenseMatrix + IMatrix/flare/util/math/IMatrix + SparseMatrix/flare/util/math/SparseMatrix + ColorPalette/flare/util/palette/ColorPalette + Palette/flare/util/palette/Palette + ShapePalette/flare/util/palette/ShapePalette + SizePalette/flare/util/palette/SizePalette + Axes/flare/vis/axis/Axes + Axis/flare/vis/axis/Axis + AxisGridLine/flare/vis/axis/AxisGridLine + AxisLabel/flare/vis/axis/AxisLabel + CartesianAxes/flare/vis/axis/CartesianAxes + AnchorControl/flare/vis/controls/AnchorControl + ClickControl/flare/vis/controls/ClickControl + Control/flare/vis/controls/Control + ControlList/flare/vis/controls/ControlList + DragControl/flare/vis/controls/DragControl + ExpandControl/flare/vis/controls/ExpandControl + HoverControl/flare/vis/controls/HoverControl + IControl/flare/vis/controls/IControl + PanZoomControl/flare/vis/controls/PanZoomControl + SelectionControl/flare/vis/controls/SelectionControl + TooltipControl/flare/vis/controls/TooltipControl + Data/flare/vis/data/Data + DataList/flare/vis/data/DataList + DataSprite/flare/vis/data/DataSprite + EdgeSprite/flare/vis/data/EdgeSprite + NodeSprite/flare/vis/data/NodeSprite + ScaleBinding/flare/vis/data/ScaleBinding + Tree/flare/vis/data/Tree + TreeBuilder/flare/vis/data/TreeBuilder + DataEvent/flare/vis/events/DataEvent + SelectionEvent/flare/vis/events/SelectionEvent + TooltipEvent/flare/vis/events/TooltipEvent + VisualizationEvent/flare/vis/events/VisualizationEvent + Legend/flare/vis/legend/Legend + LegendItem/flare/vis/legend/LegendItem + LegendRange/flare/vis/legend/LegendRange + IOperator/flare/vis/operator/IOperator + Operator/flare/vis/operator/Operator + OperatorList/flare/vis/operator/OperatorList + OperatorSequence/flare/vis/operator/OperatorSequence + OperatorSwitch/flare/vis/operator/OperatorSwitch + SortOperator/flare/vis/operator/SortOperator ArrowType/flare/vis/data/render/ArrowType EdgeRenderer/flare/vis/data/render/EdgeRenderer IRenderer/flare/vis/data/render/IRenderer @@ -774,4 +742,38 @@ StackedAreaLayout/flare/vis/operator/layout/StackedAreaLayout TreeMapLayout/flare/vis/operator/layout/TreeMapLayout + + flare/flare + analytics/flare/analytics + animate/flare/animate + data/flare/data + display/flare/display + flex/flare/flex + physics/flare/physics + query/flare/query + scale/flare/scale + util/flare/util + vis/flare/vis + cluster/flare/analytics/cluster + graph/flare/analytics/graph + optimization/flare/analytics/optimization + interpolate/flare/animate/interpolate + converters/flare/data/converters + methods/flare/query/methods + heap/flare/util/heap + math/flare/util/math + palette/flare/util/palette + axis/flare/vis/axis + controls/flare/vis/controls + data/flare/vis/data + events/flare/vis/events + legend/flare/vis/legend + operator/flare/vis/operator + render/flare/vis/data/render + distortion/flare/vis/operator/distortion + encoder/flare/vis/operator/encoder + filter/flare/vis/operator/filter + label/flare/vis/operator/label + layout/flare/vis/operator/layout + \ No newline at end of file diff --git a/test/output/flareTree.svg b/test/output/flareTree.svg index 2d9271f72a..691f0bb2d8 100644 --- a/test/output/flareTree.svg +++ b/test/output/flareTree.svg @@ -17,481 +17,449 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - flare/flare - analytics/flare/analytics - animate/flare/animate - data/flare/data - display/flare/display - flex/flare/flex - physics/flare/physics - query/flare/query - scale/flare/scale - util/flare/util - vis/flare/vis - cluster/flare/analytics/cluster - graph/flare/analytics/graph - optimization/flare/analytics/optimization - Easing/flare/animate/Easing - FunctionSequence/flare/animate/FunctionSequence - interpolate/flare/animate/interpolate - ISchedulable/flare/animate/ISchedulable - Parallel/flare/animate/Parallel - Pause/flare/animate/Pause - Scheduler/flare/animate/Scheduler - Sequence/flare/animate/Sequence - Transition/flare/animate/Transition - Transitioner/flare/animate/Transitioner - TransitionEvent/flare/animate/TransitionEvent - Tween/flare/animate/Tween - converters/flare/data/converters - DataField/flare/data/DataField - DataSchema/flare/data/DataSchema - DataSet/flare/data/DataSet - DataSource/flare/data/DataSource - DataTable/flare/data/DataTable - DataUtil/flare/data/DataUtil - DirtySprite/flare/display/DirtySprite - LineSprite/flare/display/LineSprite - RectSprite/flare/display/RectSprite - TextSprite/flare/display/TextSprite - FlareVis/flare/flex/FlareVis - DragForce/flare/physics/DragForce - GravityForce/flare/physics/GravityForce - IForce/flare/physics/IForce - NBodyForce/flare/physics/NBodyForce - Particle/flare/physics/Particle - Simulation/flare/physics/Simulation - Spring/flare/physics/Spring - SpringForce/flare/physics/SpringForce - AggregateExpression/flare/query/AggregateExpression - And/flare/query/And - Arithmetic/flare/query/Arithmetic - Average/flare/query/Average - BinaryExpression/flare/query/BinaryExpression - Comparison/flare/query/Comparison - CompositeExpression/flare/query/CompositeExpression - Count/flare/query/Count - DateUtil/flare/query/DateUtil - Distinct/flare/query/Distinct - Expression/flare/query/Expression - ExpressionIterator/flare/query/ExpressionIterator - Fn/flare/query/Fn - If/flare/query/If - IsA/flare/query/IsA - Literal/flare/query/Literal - Match/flare/query/Match - Maximum/flare/query/Maximum - methods/flare/query/methods - Minimum/flare/query/Minimum - Not/flare/query/Not - Or/flare/query/Or - Query/flare/query/Query - Range/flare/query/Range - StringUtil/flare/query/StringUtil - Sum/flare/query/Sum - Variable/flare/query/Variable - Variance/flare/query/Variance - Xor/flare/query/Xor - IScaleMap/flare/scale/IScaleMap - LinearScale/flare/scale/LinearScale - LogScale/flare/scale/LogScale - OrdinalScale/flare/scale/OrdinalScale - QuantileScale/flare/scale/QuantileScale - QuantitativeScale/flare/scale/QuantitativeScale - RootScale/flare/scale/RootScale - Scale/flare/scale/Scale - ScaleType/flare/scale/ScaleType - TimeScale/flare/scale/TimeScale - Arrays/flare/util/Arrays - Colors/flare/util/Colors - Dates/flare/util/Dates - Displays/flare/util/Displays - Filter/flare/util/Filter - Geometry/flare/util/Geometry - heap/flare/util/heap - IEvaluable/flare/util/IEvaluable - IPredicate/flare/util/IPredicate - IValueProxy/flare/util/IValueProxy - math/flare/util/math - Maths/flare/util/Maths - Orientation/flare/util/Orientation - palette/flare/util/palette - Property/flare/util/Property - Shapes/flare/util/Shapes - Sort/flare/util/Sort - Stats/flare/util/Stats - Strings/flare/util/Strings - axis/flare/vis/axis - controls/flare/vis/controls - data/flare/vis/data - events/flare/vis/events - legend/flare/vis/legend - operator/flare/vis/operator - Visualization/flare/vis/Visualization - AgglomerativeCluster/flare/analytics/cluster/AgglomerativeCluster - CommunityStructure/flare/analytics/cluster/CommunityStructure - HierarchicalCluster/flare/analytics/cluster/HierarchicalCluster - MergeEdge/flare/analytics/cluster/MergeEdge - BetweennessCentrality/flare/analytics/graph/BetweennessCentrality - LinkDistance/flare/analytics/graph/LinkDistance - MaxFlowMinCut/flare/analytics/graph/MaxFlowMinCut - ShortestPaths/flare/analytics/graph/ShortestPaths - SpanningTree/flare/analytics/graph/SpanningTree - AspectRatioBanker/flare/analytics/optimization/AspectRatioBanker - ArrayInterpolator/flare/animate/interpolate/ArrayInterpolator - ColorInterpolator/flare/animate/interpolate/ColorInterpolator - DateInterpolator/flare/animate/interpolate/DateInterpolator - Interpolator/flare/animate/interpolate/Interpolator - MatrixInterpolator/flare/animate/interpolate/MatrixInterpolator - NumberInterpolator/flare/animate/interpolate/NumberInterpolator - ObjectInterpolator/flare/animate/interpolate/ObjectInterpolator - PointInterpolator/flare/animate/interpolate/PointInterpolator - RectangleInterpolator/flare/animate/interpolate/RectangleInterpolator - Converters/flare/data/converters/Converters - DelimitedTextConverter/flare/data/converters/DelimitedTextConverter - GraphMLConverter/flare/data/converters/GraphMLConverter - IDataConverter/flare/data/converters/IDataConverter - JSONConverter/flare/data/converters/JSONConverter - add/flare/query/methods/add - and/flare/query/methods/and - average/flare/query/methods/average - count/flare/query/methods/count - distinct/flare/query/methods/distinct - div/flare/query/methods/div - eq/flare/query/methods/eq - fn/flare/query/methods/fn - gt/flare/query/methods/gt - gte/flare/query/methods/gte - iff/flare/query/methods/iff - isa/flare/query/methods/isa - lt/flare/query/methods/lt - lte/flare/query/methods/lte - max/flare/query/methods/max - min/flare/query/methods/min - mod/flare/query/methods/mod - mul/flare/query/methods/mul - neq/flare/query/methods/neq - not/flare/query/methods/not - or/flare/query/methods/or - orderby/flare/query/methods/orderby - range/flare/query/methods/range - select/flare/query/methods/select - stddev/flare/query/methods/stddev - sub/flare/query/methods/sub - sum/flare/query/methods/sum - update/flare/query/methods/update - variance/flare/query/methods/variance - where/flare/query/methods/where - xor/flare/query/methods/xor - _/flare/query/methods/_ - FibonacciHeap/flare/util/heap/FibonacciHeap - HeapNode/flare/util/heap/HeapNode - DenseMatrix/flare/util/math/DenseMatrix - IMatrix/flare/util/math/IMatrix - SparseMatrix/flare/util/math/SparseMatrix - ColorPalette/flare/util/palette/ColorPalette - Palette/flare/util/palette/Palette - ShapePalette/flare/util/palette/ShapePalette - SizePalette/flare/util/palette/SizePalette - Axes/flare/vis/axis/Axes - Axis/flare/vis/axis/Axis - AxisGridLine/flare/vis/axis/AxisGridLine - AxisLabel/flare/vis/axis/AxisLabel - CartesianAxes/flare/vis/axis/CartesianAxes - AnchorControl/flare/vis/controls/AnchorControl - ClickControl/flare/vis/controls/ClickControl - Control/flare/vis/controls/Control - ControlList/flare/vis/controls/ControlList - DragControl/flare/vis/controls/DragControl - ExpandControl/flare/vis/controls/ExpandControl - HoverControl/flare/vis/controls/HoverControl - IControl/flare/vis/controls/IControl - PanZoomControl/flare/vis/controls/PanZoomControl - SelectionControl/flare/vis/controls/SelectionControl - TooltipControl/flare/vis/controls/TooltipControl - Data/flare/vis/data/Data - DataList/flare/vis/data/DataList - DataSprite/flare/vis/data/DataSprite - EdgeSprite/flare/vis/data/EdgeSprite - NodeSprite/flare/vis/data/NodeSprite - render/flare/vis/data/render - ScaleBinding/flare/vis/data/ScaleBinding - Tree/flare/vis/data/Tree - TreeBuilder/flare/vis/data/TreeBuilder - DataEvent/flare/vis/events/DataEvent - SelectionEvent/flare/vis/events/SelectionEvent - TooltipEvent/flare/vis/events/TooltipEvent - VisualizationEvent/flare/vis/events/VisualizationEvent - Legend/flare/vis/legend/Legend - LegendItem/flare/vis/legend/LegendItem - LegendRange/flare/vis/legend/LegendRange - distortion/flare/vis/operator/distortion - encoder/flare/vis/operator/encoder - filter/flare/vis/operator/filter - IOperator/flare/vis/operator/IOperator - label/flare/vis/operator/label - layout/flare/vis/operator/layout - Operator/flare/vis/operator/Operator - OperatorList/flare/vis/operator/OperatorList - OperatorSequence/flare/vis/operator/OperatorSequence - OperatorSwitch/flare/vis/operator/OperatorSwitch - SortOperator/flare/vis/operator/SortOperator + Easing/flare/animate/Easing + FunctionSequence/flare/animate/FunctionSequence + ISchedulable/flare/animate/ISchedulable + Parallel/flare/animate/Parallel + Pause/flare/animate/Pause + Scheduler/flare/animate/Scheduler + Sequence/flare/animate/Sequence + Transition/flare/animate/Transition + Transitioner/flare/animate/Transitioner + TransitionEvent/flare/animate/TransitionEvent + Tween/flare/animate/Tween + DataField/flare/data/DataField + DataSchema/flare/data/DataSchema + DataSet/flare/data/DataSet + DataSource/flare/data/DataSource + DataTable/flare/data/DataTable + DataUtil/flare/data/DataUtil + DirtySprite/flare/display/DirtySprite + LineSprite/flare/display/LineSprite + RectSprite/flare/display/RectSprite + TextSprite/flare/display/TextSprite + FlareVis/flare/flex/FlareVis + DragForce/flare/physics/DragForce + GravityForce/flare/physics/GravityForce + IForce/flare/physics/IForce + NBodyForce/flare/physics/NBodyForce + Particle/flare/physics/Particle + Simulation/flare/physics/Simulation + Spring/flare/physics/Spring + SpringForce/flare/physics/SpringForce + AggregateExpression/flare/query/AggregateExpression + And/flare/query/And + Arithmetic/flare/query/Arithmetic + Average/flare/query/Average + BinaryExpression/flare/query/BinaryExpression + Comparison/flare/query/Comparison + CompositeExpression/flare/query/CompositeExpression + Count/flare/query/Count + DateUtil/flare/query/DateUtil + Distinct/flare/query/Distinct + Expression/flare/query/Expression + ExpressionIterator/flare/query/ExpressionIterator + Fn/flare/query/Fn + If/flare/query/If + IsA/flare/query/IsA + Literal/flare/query/Literal + Match/flare/query/Match + Maximum/flare/query/Maximum + Minimum/flare/query/Minimum + Not/flare/query/Not + Or/flare/query/Or + Query/flare/query/Query + Range/flare/query/Range + StringUtil/flare/query/StringUtil + Sum/flare/query/Sum + Variable/flare/query/Variable + Variance/flare/query/Variance + Xor/flare/query/Xor + IScaleMap/flare/scale/IScaleMap + LinearScale/flare/scale/LinearScale + LogScale/flare/scale/LogScale + OrdinalScale/flare/scale/OrdinalScale + QuantileScale/flare/scale/QuantileScale + QuantitativeScale/flare/scale/QuantitativeScale + RootScale/flare/scale/RootScale + Scale/flare/scale/Scale + ScaleType/flare/scale/ScaleType + TimeScale/flare/scale/TimeScale + Arrays/flare/util/Arrays + Colors/flare/util/Colors + Dates/flare/util/Dates + Displays/flare/util/Displays + Filter/flare/util/Filter + Geometry/flare/util/Geometry + IEvaluable/flare/util/IEvaluable + IPredicate/flare/util/IPredicate + IValueProxy/flare/util/IValueProxy + Maths/flare/util/Maths + Orientation/flare/util/Orientation + Property/flare/util/Property + Shapes/flare/util/Shapes + Sort/flare/util/Sort + Stats/flare/util/Stats + Strings/flare/util/Strings + Visualization/flare/vis/Visualization + AgglomerativeCluster/flare/analytics/cluster/AgglomerativeCluster + CommunityStructure/flare/analytics/cluster/CommunityStructure + HierarchicalCluster/flare/analytics/cluster/HierarchicalCluster + MergeEdge/flare/analytics/cluster/MergeEdge + BetweennessCentrality/flare/analytics/graph/BetweennessCentrality + LinkDistance/flare/analytics/graph/LinkDistance + MaxFlowMinCut/flare/analytics/graph/MaxFlowMinCut + ShortestPaths/flare/analytics/graph/ShortestPaths + SpanningTree/flare/analytics/graph/SpanningTree + AspectRatioBanker/flare/analytics/optimization/AspectRatioBanker + ArrayInterpolator/flare/animate/interpolate/ArrayInterpolator + ColorInterpolator/flare/animate/interpolate/ColorInterpolator + DateInterpolator/flare/animate/interpolate/DateInterpolator + Interpolator/flare/animate/interpolate/Interpolator + MatrixInterpolator/flare/animate/interpolate/MatrixInterpolator + NumberInterpolator/flare/animate/interpolate/NumberInterpolator + ObjectInterpolator/flare/animate/interpolate/ObjectInterpolator + PointInterpolator/flare/animate/interpolate/PointInterpolator + RectangleInterpolator/flare/animate/interpolate/RectangleInterpolator + Converters/flare/data/converters/Converters + DelimitedTextConverter/flare/data/converters/DelimitedTextConverter + GraphMLConverter/flare/data/converters/GraphMLConverter + IDataConverter/flare/data/converters/IDataConverter + JSONConverter/flare/data/converters/JSONConverter + add/flare/query/methods/add + and/flare/query/methods/and + average/flare/query/methods/average + count/flare/query/methods/count + distinct/flare/query/methods/distinct + div/flare/query/methods/div + eq/flare/query/methods/eq + fn/flare/query/methods/fn + gt/flare/query/methods/gt + gte/flare/query/methods/gte + iff/flare/query/methods/iff + isa/flare/query/methods/isa + lt/flare/query/methods/lt + lte/flare/query/methods/lte + max/flare/query/methods/max + min/flare/query/methods/min + mod/flare/query/methods/mod + mul/flare/query/methods/mul + neq/flare/query/methods/neq + not/flare/query/methods/not + or/flare/query/methods/or + orderby/flare/query/methods/orderby + range/flare/query/methods/range + select/flare/query/methods/select + stddev/flare/query/methods/stddev + sub/flare/query/methods/sub + sum/flare/query/methods/sum + update/flare/query/methods/update + variance/flare/query/methods/variance + where/flare/query/methods/where + xor/flare/query/methods/xor + _/flare/query/methods/_ + FibonacciHeap/flare/util/heap/FibonacciHeap + HeapNode/flare/util/heap/HeapNode + DenseMatrix/flare/util/math/DenseMatrix + IMatrix/flare/util/math/IMatrix + SparseMatrix/flare/util/math/SparseMatrix + ColorPalette/flare/util/palette/ColorPalette + Palette/flare/util/palette/Palette + ShapePalette/flare/util/palette/ShapePalette + SizePalette/flare/util/palette/SizePalette + Axes/flare/vis/axis/Axes + Axis/flare/vis/axis/Axis + AxisGridLine/flare/vis/axis/AxisGridLine + AxisLabel/flare/vis/axis/AxisLabel + CartesianAxes/flare/vis/axis/CartesianAxes + AnchorControl/flare/vis/controls/AnchorControl + ClickControl/flare/vis/controls/ClickControl + Control/flare/vis/controls/Control + ControlList/flare/vis/controls/ControlList + DragControl/flare/vis/controls/DragControl + ExpandControl/flare/vis/controls/ExpandControl + HoverControl/flare/vis/controls/HoverControl + IControl/flare/vis/controls/IControl + PanZoomControl/flare/vis/controls/PanZoomControl + SelectionControl/flare/vis/controls/SelectionControl + TooltipControl/flare/vis/controls/TooltipControl + Data/flare/vis/data/Data + DataList/flare/vis/data/DataList + DataSprite/flare/vis/data/DataSprite + EdgeSprite/flare/vis/data/EdgeSprite + NodeSprite/flare/vis/data/NodeSprite + ScaleBinding/flare/vis/data/ScaleBinding + Tree/flare/vis/data/Tree + TreeBuilder/flare/vis/data/TreeBuilder + DataEvent/flare/vis/events/DataEvent + SelectionEvent/flare/vis/events/SelectionEvent + TooltipEvent/flare/vis/events/TooltipEvent + VisualizationEvent/flare/vis/events/VisualizationEvent + Legend/flare/vis/legend/Legend + LegendItem/flare/vis/legend/LegendItem + LegendRange/flare/vis/legend/LegendRange + IOperator/flare/vis/operator/IOperator + Operator/flare/vis/operator/Operator + OperatorList/flare/vis/operator/OperatorList + OperatorSequence/flare/vis/operator/OperatorSequence + OperatorSwitch/flare/vis/operator/OperatorSwitch + SortOperator/flare/vis/operator/SortOperator ArrowType/flare/vis/data/render/ArrowType EdgeRenderer/flare/vis/data/render/EdgeRenderer IRenderer/flare/vis/data/render/IRenderer @@ -526,4 +494,38 @@ StackedAreaLayout/flare/vis/operator/layout/StackedAreaLayout TreeMapLayout/flare/vis/operator/layout/TreeMapLayout + + flare/flare + analytics/flare/analytics + animate/flare/animate + data/flare/data + display/flare/display + flex/flare/flex + physics/flare/physics + query/flare/query + scale/flare/scale + util/flare/util + vis/flare/vis + cluster/flare/analytics/cluster + graph/flare/analytics/graph + optimization/flare/analytics/optimization + interpolate/flare/animate/interpolate + converters/flare/data/converters + methods/flare/query/methods + heap/flare/util/heap + math/flare/util/math + palette/flare/util/palette + axis/flare/vis/axis + controls/flare/vis/controls + data/flare/vis/data + events/flare/vis/events + legend/flare/vis/legend + operator/flare/vis/operator + render/flare/vis/data/render + distortion/flare/vis/operator/distortion + encoder/flare/vis/operator/encoder + filter/flare/vis/operator/filter + label/flare/vis/operator/label + layout/flare/vis/operator/layout + \ No newline at end of file diff --git a/test/output/greekGods.svg b/test/output/greekGods.svg index 8e88e87ec0..656be67932 100644 --- a/test/output/greekGods.svg +++ b/test/output/greekGods.svg @@ -14,32 +14,34 @@ } - - - - - - - + + + + + + + - /Chaos - /Chaos/Eros - /Chaos/Erebus - /Chaos/Tartarus - /Chaos/Gaia + /Chaos + /Chaos/Eros + /Chaos/Erebus + /Chaos/Tartarus + /Chaos/Gaia /Chaos/Gaia/Mountains /Chaos/Gaia/Pontus /Chaos/Gaia/Uranus - Chaos/Chaos - Eros/Chaos/Eros - Erebus/Chaos/Erebus - Tartarus/Chaos/Tartarus - Gaia/Chaos/Gaia + Eros/Chaos/Eros + Erebus/Chaos/Erebus + Tartarus/Chaos/Tartarus Mountains/Chaos/Gaia/Mountains Pontus/Chaos/Gaia/Pontus Uranus/Chaos/Gaia/Uranus + + Chaos/Chaos + Gaia/Chaos/Gaia + \ No newline at end of file diff --git a/test/plots/flare-cluster.ts b/test/plots/flare-cluster.ts index 0020403e7e..778a2a29f4 100644 --- a/test/plots/flare-cluster.ts +++ b/test/plots/flare-cluster.ts @@ -6,6 +6,7 @@ export async function flareCluster() { return Plot.plot({ axis: null, inset: 10, + insetLeft: 30, insetRight: 120, height: 2400, marks: Plot.cluster(flare, {path: "name", delimiter: "."}) diff --git a/test/plots/flare-indent.ts b/test/plots/flare-indent.ts index a4fa8bdf08..163414ed86 100644 --- a/test/plots/flare-indent.ts +++ b/test/plots/flare-indent.ts @@ -6,9 +6,10 @@ export async function flareIndent() { return Plot.plot({ axis: null, inset: 10, + insetLeft: 70, insetRight: 120, round: true, - width: 200, + width: 300, height: 3600, marks: Plot.tree(flare, { strokeWidth: 1, diff --git a/test/plots/flare-tree.ts b/test/plots/flare-tree.ts index 510e8a6101..77e1a2228b 100644 --- a/test/plots/flare-tree.ts +++ b/test/plots/flare-tree.ts @@ -6,6 +6,7 @@ export async function flareTree() { return Plot.plot({ axis: null, inset: 10, + insetLeft: 30, insetRight: 120, height: 1800, marks: Plot.tree(flare, {markerEnd: "arrow", path: "name", delimiter: "."}) diff --git a/test/plots/greek-gods.ts b/test/plots/greek-gods.ts index ab53de312d..0e4136afd8 100644 --- a/test/plots/greek-gods.ts +++ b/test/plots/greek-gods.ts @@ -11,7 +11,7 @@ Chaos Tartarus` .map((d) => d.replace(/\s+/g, "/")); return Plot.plot({ axis: null, - insetLeft: 10, + insetLeft: 35, insetTop: 20, insetBottom: 20, insetRight: 120, From 1a15ead1421d208093afdb0c867c1fffaa1eed57 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Mon, 22 May 2023 09:44:21 -0700 Subject: [PATCH 2/7] treeFilter option (#1611) --- docs/transforms/tree.md | 2 + src/marks/tree.d.ts | 2 +- src/marks/tree.js | 63 +- src/transforms/tree.d.ts | 2 + src/transforms/tree.js | 23 +- test/output/flareIndent.svg | 1514 +++++++++++++++++------------------ 6 files changed, 802 insertions(+), 804 deletions(-) diff --git a/docs/transforms/tree.md b/docs/transforms/tree.md index 8c573c0dd0..3212e2eab5 100644 --- a/docs/transforms/tree.md +++ b/docs/transforms/tree.md @@ -88,6 +88,7 @@ The treeNode transform will derive output columns for any *options* that have on * *node:name* - the node’s name (the last part of its path) * *node:path* - the node’s full, normalized, slash-separated path * *node:internal* - true if the node is internal, or false for leaves +* *node:external* - true if the node is a leaf, or false for internal nodes * *node:depth* - the distance from the node to the root * *node:height* - the distance from the node to its deepest descendant @@ -102,6 +103,7 @@ The treeLink transform will likewise derive output columns for any *options* tha * *node:name* - the child node’s name (the last part of its path) * *node:path* - the child node’s full, normalized, slash-separated path * *node:internal* - true if the child node is internal, or false for leaves +* *node:external* - true if the child node is a leaf, or false for internal nodes * *node:depth* - the distance from the child node to the root * *node:height* - the distance from the child node to its deepest descendant * *parent:name* - the parent node’s name (the last part of its path) diff --git a/src/marks/tree.d.ts b/src/marks/tree.d.ts index 7798218484..62bae7213d 100644 --- a/src/marks/tree.d.ts +++ b/src/marks/tree.d.ts @@ -4,7 +4,7 @@ import type {DotOptions} from "./dot.js"; import type {LinkOptions} from "./link.js"; import type {TextOptions} from "./text.js"; -// TODO tree channels, e.g., "node:name" | "node:path" | "node:internal"? +// TODO tree channels, e.g., "node:name" | "node:path" | "node:internal" | "node:external"? /** Options for the compound tree mark. */ export interface TreeOptions extends DotOptions, LinkOptions, TextOptions, TreeTransformOptions { diff --git a/src/marks/tree.js b/src/marks/tree.js index 387d196f2a..fa92136653 100644 --- a/src/marks/tree.js +++ b/src/marks/tree.js @@ -1,8 +1,7 @@ -import {cluster as Cluster} from "d3"; -import {isNoneish} from "../options.js"; +import {tree as Tree, cluster as Cluster} from "d3"; import {marks} from "../mark.js"; +import {isNoneish} from "../options.js"; import {maybeTreeAnchor, treeLink, treeNode} from "../transforms/tree.js"; -import {filter} from "../transforms/basic.js"; import {dot} from "./dot.js"; import {link} from "./link.js"; import {text} from "./text.js"; @@ -32,8 +31,26 @@ export function tree( ...options } = {} ) { + const {treeLayout = Tree} = options; if (dx === undefined) dx = maybeTreeAnchor(options.treeAnchor).dx; if (textAnchor !== undefined) throw new Error("textAnchor is not a configurable tree option"); + + function treeText(textOptions) { + return text( + data, + treeNode({ + text: textText, + fill: fill === undefined ? "currentColor" : fill, + stroke: textStroke, + dx, + dy, + title, + ...textOptions, + ...options + }) + ); + } + return marks( link( data, @@ -53,40 +70,12 @@ export function tree( ), dotDot ? dot(data, treeNode({fill: fill === undefined ? "node:internal" : fill, title, ...options})) : null, textText != null - ? [ - text( - data, - filter( - (d) => !d.internal, - treeNode({ - text: textText, - fill: fill === undefined ? "currentColor" : fill, - stroke: textStroke, - dx, - dy, - title, - textAnchor: "start", - ...options - }) - ) - ), - text( - data, - filter( - "internal", - treeNode({ - text: textText, - fill: fill === undefined ? "currentColor" : fill, - stroke: textStroke, - dx: -dx, - dy, - title, - textAnchor: "end", - ...options - }) - ) - ) - ] + ? treeLayout === Tree || treeLayout === Cluster + ? [ + treeText({textAnchor: "start", treeFilter: "node:external"}), + treeText({textAnchor: "end", treeFilter: "node:internal", dx: -dx}) + ] + : treeText() : null ); } diff --git a/src/transforms/tree.d.ts b/src/transforms/tree.d.ts index 3b704fd074..d7bda93b06 100644 --- a/src/transforms/tree.d.ts +++ b/src/transforms/tree.d.ts @@ -75,6 +75,7 @@ export interface TreeTransformOptions { * * *node:name* - the node’s name (the last part of its path) * * *node:path* - the node’s full, normalized, slash-separated path * * *node:internal* - true if the node is internal, or false for leaves + * * *node:external* - true if the node is a leaf, or false for internal nodes * * *node:depth* - the distance from the node to the root * * *node:height* - the distance from the node to its deepest descendant * @@ -97,6 +98,7 @@ export function treeNode(options?: T & TreeTransformOptions): Transformed; * * *node:name* - the child node’s name (the last part of its path) * * *node:path* - the child node’s full, normalized, slash-separated path * * *node:internal* - true if the child node is internal, or false for leaves + * * *node:external* - true if the child node is a leaf, or false for external nodes * * *node:depth* - the distance from the child node to the root * * *node:height* - the distance from the child node to its deepest descendant * * *parent:name* - the parent node’s name (the last part of its path) diff --git a/src/transforms/tree.js b/src/transforms/tree.js index b37c66b2bd..44d42cf474 100644 --- a/src/transforms/tree.js +++ b/src/transforms/tree.js @@ -11,10 +11,12 @@ export function treeNode({ treeSort, treeSeparation, treeAnchor, + treeFilter, ...options } = {}) { treeAnchor = maybeTreeAnchor(treeAnchor); treeSort = maybeTreeSort(treeSort); + if (treeFilter != null) treeFilter = maybeNodeValue(treeFilter); if (frameAnchor === undefined) frameAnchor = treeAnchor.frameAnchor; const normalize = normalizer(delimiter); const outputs = treeOutputs(options, maybeNodeValue); @@ -42,15 +44,9 @@ export function treeNode({ if (treeSort != null) root.sort(treeSort); layout(root); for (const node of root.descendants()) { + if (treeFilter != null && !treeFilter(node)) continue; treeFacet.push(++treeIndex); - treeData[treeIndex] = { - data: node.data, - name: nodeName(node), - path: nodePath(node), - internal: nodeInternal(node), - depth: node.depth, // nodeDepth(node) - height: node.height // nodeHeight(node) - }; + treeData[treeIndex] = node.data; treeAnchor.position(node, treeIndex, X, Y); for (const o of outputs) o[output_values][treeIndex] = o[output_evaluate](node); } @@ -73,10 +69,12 @@ export function treeLink({ treeSort, treeSeparation, treeAnchor, + treeFilter, ...options } = {}) { treeAnchor = maybeTreeAnchor(treeAnchor); treeSort = maybeTreeSort(treeSort); + if (treeFilter != null) treeFilter = maybeLinkValue(treeFilter); options = {curve, stroke, strokeWidth, strokeOpacity, ...options}; const normalize = normalizer(delimiter); const outputs = treeOutputs(options, maybeLinkValue); @@ -109,6 +107,7 @@ export function treeLink({ if (treeSort != null) root.sort(treeSort); layout(root); for (const {source, target} of root.links()) { + if (treeFilter != null && !treeFilter(target, source)) continue; treeFacet.push(++treeIndex); treeData[treeIndex] = target.data; treeAnchor.position(source, treeIndex, X1, Y1); @@ -201,6 +200,8 @@ function maybeNodeValue(value) { return nodePath; case "node:internal": return nodeInternal; + case "node:external": + return nodeExternal; case "node:depth": return nodeDepth; case "node:height": @@ -229,6 +230,8 @@ function maybeLinkValue(value) { return nodePath; case "node:internal": return nodeInternal; + case "node:external": + return nodeExternal; case "node:depth": return nodeDepth; case "node:height": @@ -257,6 +260,10 @@ function nodeInternal(node) { return !!node.children; } +function nodeExternal(node) { + return !node.children; +} + function parentValue(evaluate) { return (child, parent) => (parent == null ? undefined : evaluate(parent)); } diff --git a/test/output/flareIndent.svg b/test/output/flareIndent.svg index 2d09442c8e..9802e7970d 100644 --- a/test/output/flareIndent.svg +++ b/test/output/flareIndent.svg @@ -1,4 +1,4 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - /flare - /flare/analytics - /flare/animate - /flare/data - /flare/display - /flare/flex - /flare/physics - /flare/query - /flare/scale - /flare/util - /flare/vis - /flare/analytics/cluster - /flare/analytics/graph - /flare/analytics/optimization - /flare/animate/Easing - /flare/animate/FunctionSequence - /flare/animate/interpolate - /flare/animate/ISchedulable - /flare/animate/Parallel - /flare/animate/Pause - /flare/animate/Scheduler - /flare/animate/Sequence - /flare/animate/Transition - /flare/animate/Transitioner - /flare/animate/TransitionEvent - /flare/animate/Tween - /flare/data/converters - /flare/data/DataField - /flare/data/DataSchema - /flare/data/DataSet - /flare/data/DataSource - /flare/data/DataTable - /flare/data/DataUtil - /flare/display/DirtySprite - /flare/display/LineSprite - /flare/display/RectSprite - /flare/display/TextSprite - /flare/flex/FlareVis - /flare/physics/DragForce - /flare/physics/GravityForce - /flare/physics/IForce - /flare/physics/NBodyForce - /flare/physics/Particle - /flare/physics/Simulation - /flare/physics/Spring - /flare/physics/SpringForce - /flare/query/AggregateExpression - /flare/query/And - /flare/query/Arithmetic - /flare/query/Average - /flare/query/BinaryExpression - /flare/query/Comparison - /flare/query/CompositeExpression - /flare/query/Count - /flare/query/DateUtil - /flare/query/Distinct - /flare/query/Expression - /flare/query/ExpressionIterator - /flare/query/Fn - /flare/query/If - /flare/query/IsA - /flare/query/Literal - /flare/query/Match - /flare/query/Maximum - /flare/query/methods - /flare/query/Minimum - /flare/query/Not - /flare/query/Or - /flare/query/Query - /flare/query/Range - /flare/query/StringUtil - /flare/query/Sum - /flare/query/Variable - /flare/query/Variance - /flare/query/Xor - /flare/scale/IScaleMap - /flare/scale/LinearScale - /flare/scale/LogScale - /flare/scale/OrdinalScale - /flare/scale/QuantileScale - /flare/scale/QuantitativeScale - /flare/scale/RootScale - /flare/scale/Scale - /flare/scale/ScaleType - /flare/scale/TimeScale - /flare/util/Arrays - /flare/util/Colors - /flare/util/Dates - /flare/util/Displays - /flare/util/Filter - /flare/util/Geometry - /flare/util/heap - /flare/util/IEvaluable - /flare/util/IPredicate - /flare/util/IValueProxy - /flare/util/math - /flare/util/Maths - /flare/util/Orientation - /flare/util/palette - /flare/util/Property - /flare/util/Shapes - /flare/util/Sort - /flare/util/Stats - /flare/util/Strings - /flare/vis/axis - /flare/vis/controls - /flare/vis/data - /flare/vis/events - /flare/vis/legend - /flare/vis/operator - /flare/vis/Visualization - /flare/analytics/cluster/AgglomerativeCluster - /flare/analytics/cluster/CommunityStructure - /flare/analytics/cluster/HierarchicalCluster - /flare/analytics/cluster/MergeEdge - /flare/analytics/graph/BetweennessCentrality - /flare/analytics/graph/LinkDistance - /flare/analytics/graph/MaxFlowMinCut - /flare/analytics/graph/ShortestPaths - /flare/analytics/graph/SpanningTree - /flare/analytics/optimization/AspectRatioBanker - /flare/animate/interpolate/ArrayInterpolator - /flare/animate/interpolate/ColorInterpolator - /flare/animate/interpolate/DateInterpolator - /flare/animate/interpolate/Interpolator - /flare/animate/interpolate/MatrixInterpolator - /flare/animate/interpolate/NumberInterpolator - /flare/animate/interpolate/ObjectInterpolator - /flare/animate/interpolate/PointInterpolator - /flare/animate/interpolate/RectangleInterpolator - /flare/data/converters/Converters - /flare/data/converters/DelimitedTextConverter - /flare/data/converters/GraphMLConverter - /flare/data/converters/IDataConverter - /flare/data/converters/JSONConverter - /flare/query/methods/add - /flare/query/methods/and - /flare/query/methods/average - /flare/query/methods/count - /flare/query/methods/distinct - /flare/query/methods/div - /flare/query/methods/eq - /flare/query/methods/fn - /flare/query/methods/gt - /flare/query/methods/gte - /flare/query/methods/iff - /flare/query/methods/isa - /flare/query/methods/lt - /flare/query/methods/lte - /flare/query/methods/max - /flare/query/methods/min - /flare/query/methods/mod - /flare/query/methods/mul - /flare/query/methods/neq - /flare/query/methods/not - /flare/query/methods/or - /flare/query/methods/orderby - /flare/query/methods/range - /flare/query/methods/select - /flare/query/methods/stddev - /flare/query/methods/sub - /flare/query/methods/sum - /flare/query/methods/update - /flare/query/methods/variance - /flare/query/methods/where - /flare/query/methods/xor - /flare/query/methods/_ - /flare/util/heap/FibonacciHeap - /flare/util/heap/HeapNode - /flare/util/math/DenseMatrix - /flare/util/math/IMatrix - /flare/util/math/SparseMatrix - /flare/util/palette/ColorPalette - /flare/util/palette/Palette - /flare/util/palette/ShapePalette - /flare/util/palette/SizePalette - /flare/vis/axis/Axes - /flare/vis/axis/Axis - /flare/vis/axis/AxisGridLine - /flare/vis/axis/AxisLabel - /flare/vis/axis/CartesianAxes - /flare/vis/controls/AnchorControl - /flare/vis/controls/ClickControl - /flare/vis/controls/Control - /flare/vis/controls/ControlList - /flare/vis/controls/DragControl - /flare/vis/controls/ExpandControl - /flare/vis/controls/HoverControl - /flare/vis/controls/IControl - /flare/vis/controls/PanZoomControl - /flare/vis/controls/SelectionControl - /flare/vis/controls/TooltipControl - /flare/vis/data/Data - /flare/vis/data/DataList - /flare/vis/data/DataSprite - /flare/vis/data/EdgeSprite - /flare/vis/data/NodeSprite - /flare/vis/data/render - /flare/vis/data/ScaleBinding - /flare/vis/data/Tree - /flare/vis/data/TreeBuilder - /flare/vis/events/DataEvent - /flare/vis/events/SelectionEvent - /flare/vis/events/TooltipEvent - /flare/vis/events/VisualizationEvent - /flare/vis/legend/Legend - /flare/vis/legend/LegendItem - /flare/vis/legend/LegendRange - /flare/vis/operator/distortion - /flare/vis/operator/encoder - /flare/vis/operator/filter - /flare/vis/operator/IOperator - /flare/vis/operator/label - /flare/vis/operator/layout - /flare/vis/operator/Operator - /flare/vis/operator/OperatorList - /flare/vis/operator/OperatorSequence - /flare/vis/operator/OperatorSwitch - /flare/vis/operator/SortOperator - /flare/vis/data/render/ArrowType - /flare/vis/data/render/EdgeRenderer - /flare/vis/data/render/IRenderer - /flare/vis/data/render/ShapeRenderer - /flare/vis/operator/distortion/BifocalDistortion - /flare/vis/operator/distortion/Distortion - /flare/vis/operator/distortion/FisheyeDistortion - /flare/vis/operator/encoder/ColorEncoder - /flare/vis/operator/encoder/Encoder - /flare/vis/operator/encoder/PropertyEncoder - /flare/vis/operator/encoder/ShapeEncoder - /flare/vis/operator/encoder/SizeEncoder - /flare/vis/operator/filter/FisheyeTreeFilter - /flare/vis/operator/filter/GraphDistanceFilter - /flare/vis/operator/filter/VisibilityFilter - /flare/vis/operator/label/Labeler - /flare/vis/operator/label/RadialLabeler - /flare/vis/operator/label/StackedAreaLabeler - /flare/vis/operator/layout/AxisLayout - /flare/vis/operator/layout/BundledEdgeRouter - /flare/vis/operator/layout/CircleLayout - /flare/vis/operator/layout/CirclePackingLayout - /flare/vis/operator/layout/DendrogramLayout - /flare/vis/operator/layout/ForceDirectedLayout - /flare/vis/operator/layout/IcicleTreeLayout - /flare/vis/operator/layout/IndentedTreeLayout - /flare/vis/operator/layout/Layout - /flare/vis/operator/layout/NodeLinkTreeLayout - /flare/vis/operator/layout/PieLayout - /flare/vis/operator/layout/RadialTreeLayout - /flare/vis/operator/layout/RandomLayout - /flare/vis/operator/layout/StackedAreaLayout - /flare/vis/operator/layout/TreeMapLayout + /flare + /flare/analytics + /flare/animate + /flare/data + /flare/display + /flare/flex + /flare/physics + /flare/query + /flare/scale + /flare/util + /flare/vis + /flare/analytics/cluster + /flare/analytics/graph + /flare/analytics/optimization + /flare/animate/Easing + /flare/animate/FunctionSequence + /flare/animate/interpolate + /flare/animate/ISchedulable + /flare/animate/Parallel + /flare/animate/Pause + /flare/animate/Scheduler + /flare/animate/Sequence + /flare/animate/Transition + /flare/animate/Transitioner + /flare/animate/TransitionEvent + /flare/animate/Tween + /flare/data/converters + /flare/data/DataField + /flare/data/DataSchema + /flare/data/DataSet + /flare/data/DataSource + /flare/data/DataTable + /flare/data/DataUtil + /flare/display/DirtySprite + /flare/display/LineSprite + /flare/display/RectSprite + /flare/display/TextSprite + /flare/flex/FlareVis + /flare/physics/DragForce + /flare/physics/GravityForce + /flare/physics/IForce + /flare/physics/NBodyForce + /flare/physics/Particle + /flare/physics/Simulation + /flare/physics/Spring + /flare/physics/SpringForce + /flare/query/AggregateExpression + /flare/query/And + /flare/query/Arithmetic + /flare/query/Average + /flare/query/BinaryExpression + /flare/query/Comparison + /flare/query/CompositeExpression + /flare/query/Count + /flare/query/DateUtil + /flare/query/Distinct + /flare/query/Expression + /flare/query/ExpressionIterator + /flare/query/Fn + /flare/query/If + /flare/query/IsA + /flare/query/Literal + /flare/query/Match + /flare/query/Maximum + /flare/query/methods + /flare/query/Minimum + /flare/query/Not + /flare/query/Or + /flare/query/Query + /flare/query/Range + /flare/query/StringUtil + /flare/query/Sum + /flare/query/Variable + /flare/query/Variance + /flare/query/Xor + /flare/scale/IScaleMap + /flare/scale/LinearScale + /flare/scale/LogScale + /flare/scale/OrdinalScale + /flare/scale/QuantileScale + /flare/scale/QuantitativeScale + /flare/scale/RootScale + /flare/scale/Scale + /flare/scale/ScaleType + /flare/scale/TimeScale + /flare/util/Arrays + /flare/util/Colors + /flare/util/Dates + /flare/util/Displays + /flare/util/Filter + /flare/util/Geometry + /flare/util/heap + /flare/util/IEvaluable + /flare/util/IPredicate + /flare/util/IValueProxy + /flare/util/math + /flare/util/Maths + /flare/util/Orientation + /flare/util/palette + /flare/util/Property + /flare/util/Shapes + /flare/util/Sort + /flare/util/Stats + /flare/util/Strings + /flare/vis/axis + /flare/vis/controls + /flare/vis/data + /flare/vis/events + /flare/vis/legend + /flare/vis/operator + /flare/vis/Visualization + /flare/analytics/cluster/AgglomerativeCluster + /flare/analytics/cluster/CommunityStructure + /flare/analytics/cluster/HierarchicalCluster + /flare/analytics/cluster/MergeEdge + /flare/analytics/graph/BetweennessCentrality + /flare/analytics/graph/LinkDistance + /flare/analytics/graph/MaxFlowMinCut + /flare/analytics/graph/ShortestPaths + /flare/analytics/graph/SpanningTree + /flare/analytics/optimization/AspectRatioBanker + /flare/animate/interpolate/ArrayInterpolator + /flare/animate/interpolate/ColorInterpolator + /flare/animate/interpolate/DateInterpolator + /flare/animate/interpolate/Interpolator + /flare/animate/interpolate/MatrixInterpolator + /flare/animate/interpolate/NumberInterpolator + /flare/animate/interpolate/ObjectInterpolator + /flare/animate/interpolate/PointInterpolator + /flare/animate/interpolate/RectangleInterpolator + /flare/data/converters/Converters + /flare/data/converters/DelimitedTextConverter + /flare/data/converters/GraphMLConverter + /flare/data/converters/IDataConverter + /flare/data/converters/JSONConverter + /flare/query/methods/add + /flare/query/methods/and + /flare/query/methods/average + /flare/query/methods/count + /flare/query/methods/distinct + /flare/query/methods/div + /flare/query/methods/eq + /flare/query/methods/fn + /flare/query/methods/gt + /flare/query/methods/gte + /flare/query/methods/iff + /flare/query/methods/isa + /flare/query/methods/lt + /flare/query/methods/lte + /flare/query/methods/max + /flare/query/methods/min + /flare/query/methods/mod + /flare/query/methods/mul + /flare/query/methods/neq + /flare/query/methods/not + /flare/query/methods/or + /flare/query/methods/orderby + /flare/query/methods/range + /flare/query/methods/select + /flare/query/methods/stddev + /flare/query/methods/sub + /flare/query/methods/sum + /flare/query/methods/update + /flare/query/methods/variance + /flare/query/methods/where + /flare/query/methods/xor + /flare/query/methods/_ + /flare/util/heap/FibonacciHeap + /flare/util/heap/HeapNode + /flare/util/math/DenseMatrix + /flare/util/math/IMatrix + /flare/util/math/SparseMatrix + /flare/util/palette/ColorPalette + /flare/util/palette/Palette + /flare/util/palette/ShapePalette + /flare/util/palette/SizePalette + /flare/vis/axis/Axes + /flare/vis/axis/Axis + /flare/vis/axis/AxisGridLine + /flare/vis/axis/AxisLabel + /flare/vis/axis/CartesianAxes + /flare/vis/controls/AnchorControl + /flare/vis/controls/ClickControl + /flare/vis/controls/Control + /flare/vis/controls/ControlList + /flare/vis/controls/DragControl + /flare/vis/controls/ExpandControl + /flare/vis/controls/HoverControl + /flare/vis/controls/IControl + /flare/vis/controls/PanZoomControl + /flare/vis/controls/SelectionControl + /flare/vis/controls/TooltipControl + /flare/vis/data/Data + /flare/vis/data/DataList + /flare/vis/data/DataSprite + /flare/vis/data/EdgeSprite + /flare/vis/data/NodeSprite + /flare/vis/data/render + /flare/vis/data/ScaleBinding + /flare/vis/data/Tree + /flare/vis/data/TreeBuilder + /flare/vis/events/DataEvent + /flare/vis/events/SelectionEvent + /flare/vis/events/TooltipEvent + /flare/vis/events/VisualizationEvent + /flare/vis/legend/Legend + /flare/vis/legend/LegendItem + /flare/vis/legend/LegendRange + /flare/vis/operator/distortion + /flare/vis/operator/encoder + /flare/vis/operator/filter + /flare/vis/operator/IOperator + /flare/vis/operator/label + /flare/vis/operator/layout + /flare/vis/operator/Operator + /flare/vis/operator/OperatorList + /flare/vis/operator/OperatorSequence + /flare/vis/operator/OperatorSwitch + /flare/vis/operator/SortOperator + /flare/vis/data/render/ArrowType + /flare/vis/data/render/EdgeRenderer + /flare/vis/data/render/IRenderer + /flare/vis/data/render/ShapeRenderer + /flare/vis/operator/distortion/BifocalDistortion + /flare/vis/operator/distortion/Distortion + /flare/vis/operator/distortion/FisheyeDistortion + /flare/vis/operator/encoder/ColorEncoder + /flare/vis/operator/encoder/Encoder + /flare/vis/operator/encoder/PropertyEncoder + /flare/vis/operator/encoder/ShapeEncoder + /flare/vis/operator/encoder/SizeEncoder + /flare/vis/operator/filter/FisheyeTreeFilter + /flare/vis/operator/filter/GraphDistanceFilter + /flare/vis/operator/filter/VisibilityFilter + /flare/vis/operator/label/Labeler + /flare/vis/operator/label/RadialLabeler + /flare/vis/operator/label/StackedAreaLabeler + /flare/vis/operator/layout/AxisLayout + /flare/vis/operator/layout/BundledEdgeRouter + /flare/vis/operator/layout/CircleLayout + /flare/vis/operator/layout/CirclePackingLayout + /flare/vis/operator/layout/DendrogramLayout + /flare/vis/operator/layout/ForceDirectedLayout + /flare/vis/operator/layout/IcicleTreeLayout + /flare/vis/operator/layout/IndentedTreeLayout + /flare/vis/operator/layout/Layout + /flare/vis/operator/layout/NodeLinkTreeLayout + /flare/vis/operator/layout/PieLayout + /flare/vis/operator/layout/RadialTreeLayout + /flare/vis/operator/layout/RandomLayout + /flare/vis/operator/layout/StackedAreaLayout + /flare/vis/operator/layout/TreeMapLayout - Easing/flare/animate/Easing - FunctionSequence/flare/animate/FunctionSequence - ISchedulable/flare/animate/ISchedulable - Parallel/flare/animate/Parallel - Pause/flare/animate/Pause - Scheduler/flare/animate/Scheduler - Sequence/flare/animate/Sequence - Transition/flare/animate/Transition - Transitioner/flare/animate/Transitioner - TransitionEvent/flare/animate/TransitionEvent - Tween/flare/animate/Tween - DataField/flare/data/DataField - DataSchema/flare/data/DataSchema - DataSet/flare/data/DataSet - DataSource/flare/data/DataSource - DataTable/flare/data/DataTable - DataUtil/flare/data/DataUtil - DirtySprite/flare/display/DirtySprite - LineSprite/flare/display/LineSprite - RectSprite/flare/display/RectSprite - TextSprite/flare/display/TextSprite - FlareVis/flare/flex/FlareVis - DragForce/flare/physics/DragForce - GravityForce/flare/physics/GravityForce - IForce/flare/physics/IForce - NBodyForce/flare/physics/NBodyForce - Particle/flare/physics/Particle - Simulation/flare/physics/Simulation - Spring/flare/physics/Spring - SpringForce/flare/physics/SpringForce - AggregateExpression/flare/query/AggregateExpression - And/flare/query/And - Arithmetic/flare/query/Arithmetic - Average/flare/query/Average - BinaryExpression/flare/query/BinaryExpression - Comparison/flare/query/Comparison - CompositeExpression/flare/query/CompositeExpression - Count/flare/query/Count - DateUtil/flare/query/DateUtil - Distinct/flare/query/Distinct - Expression/flare/query/Expression - ExpressionIterator/flare/query/ExpressionIterator - Fn/flare/query/Fn - If/flare/query/If - IsA/flare/query/IsA - Literal/flare/query/Literal - Match/flare/query/Match - Maximum/flare/query/Maximum - Minimum/flare/query/Minimum - Not/flare/query/Not - Or/flare/query/Or - Query/flare/query/Query - Range/flare/query/Range - StringUtil/flare/query/StringUtil - Sum/flare/query/Sum - Variable/flare/query/Variable - Variance/flare/query/Variance - Xor/flare/query/Xor - IScaleMap/flare/scale/IScaleMap - LinearScale/flare/scale/LinearScale - LogScale/flare/scale/LogScale - OrdinalScale/flare/scale/OrdinalScale - QuantileScale/flare/scale/QuantileScale - QuantitativeScale/flare/scale/QuantitativeScale - RootScale/flare/scale/RootScale - Scale/flare/scale/Scale - ScaleType/flare/scale/ScaleType - TimeScale/flare/scale/TimeScale - Arrays/flare/util/Arrays - Colors/flare/util/Colors - Dates/flare/util/Dates - Displays/flare/util/Displays - Filter/flare/util/Filter - Geometry/flare/util/Geometry - IEvaluable/flare/util/IEvaluable - IPredicate/flare/util/IPredicate - IValueProxy/flare/util/IValueProxy - Maths/flare/util/Maths - Orientation/flare/util/Orientation - Property/flare/util/Property - Shapes/flare/util/Shapes - Sort/flare/util/Sort - Stats/flare/util/Stats - Strings/flare/util/Strings - Visualization/flare/vis/Visualization - AgglomerativeCluster/flare/analytics/cluster/AgglomerativeCluster - CommunityStructure/flare/analytics/cluster/CommunityStructure - HierarchicalCluster/flare/analytics/cluster/HierarchicalCluster - MergeEdge/flare/analytics/cluster/MergeEdge - BetweennessCentrality/flare/analytics/graph/BetweennessCentrality - LinkDistance/flare/analytics/graph/LinkDistance - MaxFlowMinCut/flare/analytics/graph/MaxFlowMinCut - ShortestPaths/flare/analytics/graph/ShortestPaths - SpanningTree/flare/analytics/graph/SpanningTree - AspectRatioBanker/flare/analytics/optimization/AspectRatioBanker - ArrayInterpolator/flare/animate/interpolate/ArrayInterpolator - ColorInterpolator/flare/animate/interpolate/ColorInterpolator - DateInterpolator/flare/animate/interpolate/DateInterpolator - Interpolator/flare/animate/interpolate/Interpolator - MatrixInterpolator/flare/animate/interpolate/MatrixInterpolator - NumberInterpolator/flare/animate/interpolate/NumberInterpolator - ObjectInterpolator/flare/animate/interpolate/ObjectInterpolator - PointInterpolator/flare/animate/interpolate/PointInterpolator - RectangleInterpolator/flare/animate/interpolate/RectangleInterpolator - Converters/flare/data/converters/Converters - DelimitedTextConverter/flare/data/converters/DelimitedTextConverter - GraphMLConverter/flare/data/converters/GraphMLConverter - IDataConverter/flare/data/converters/IDataConverter - JSONConverter/flare/data/converters/JSONConverter - add/flare/query/methods/add - and/flare/query/methods/and - average/flare/query/methods/average - count/flare/query/methods/count - distinct/flare/query/methods/distinct - div/flare/query/methods/div - eq/flare/query/methods/eq - fn/flare/query/methods/fn - gt/flare/query/methods/gt - gte/flare/query/methods/gte - iff/flare/query/methods/iff - isa/flare/query/methods/isa - lt/flare/query/methods/lt - lte/flare/query/methods/lte - max/flare/query/methods/max - min/flare/query/methods/min - mod/flare/query/methods/mod - mul/flare/query/methods/mul - neq/flare/query/methods/neq - not/flare/query/methods/not - or/flare/query/methods/or - orderby/flare/query/methods/orderby - range/flare/query/methods/range - select/flare/query/methods/select - stddev/flare/query/methods/stddev - sub/flare/query/methods/sub - sum/flare/query/methods/sum - update/flare/query/methods/update - variance/flare/query/methods/variance - where/flare/query/methods/where - xor/flare/query/methods/xor - _/flare/query/methods/_ - FibonacciHeap/flare/util/heap/FibonacciHeap - HeapNode/flare/util/heap/HeapNode - DenseMatrix/flare/util/math/DenseMatrix - IMatrix/flare/util/math/IMatrix - SparseMatrix/flare/util/math/SparseMatrix - ColorPalette/flare/util/palette/ColorPalette - Palette/flare/util/palette/Palette - ShapePalette/flare/util/palette/ShapePalette - SizePalette/flare/util/palette/SizePalette - Axes/flare/vis/axis/Axes - Axis/flare/vis/axis/Axis - AxisGridLine/flare/vis/axis/AxisGridLine - AxisLabel/flare/vis/axis/AxisLabel - CartesianAxes/flare/vis/axis/CartesianAxes - AnchorControl/flare/vis/controls/AnchorControl - ClickControl/flare/vis/controls/ClickControl - Control/flare/vis/controls/Control - ControlList/flare/vis/controls/ControlList - DragControl/flare/vis/controls/DragControl - ExpandControl/flare/vis/controls/ExpandControl - HoverControl/flare/vis/controls/HoverControl - IControl/flare/vis/controls/IControl - PanZoomControl/flare/vis/controls/PanZoomControl - SelectionControl/flare/vis/controls/SelectionControl - TooltipControl/flare/vis/controls/TooltipControl - Data/flare/vis/data/Data - DataList/flare/vis/data/DataList - DataSprite/flare/vis/data/DataSprite - EdgeSprite/flare/vis/data/EdgeSprite - NodeSprite/flare/vis/data/NodeSprite - ScaleBinding/flare/vis/data/ScaleBinding - Tree/flare/vis/data/Tree - TreeBuilder/flare/vis/data/TreeBuilder - DataEvent/flare/vis/events/DataEvent - SelectionEvent/flare/vis/events/SelectionEvent - TooltipEvent/flare/vis/events/TooltipEvent - VisualizationEvent/flare/vis/events/VisualizationEvent - Legend/flare/vis/legend/Legend - LegendItem/flare/vis/legend/LegendItem - LegendRange/flare/vis/legend/LegendRange - IOperator/flare/vis/operator/IOperator - Operator/flare/vis/operator/Operator - OperatorList/flare/vis/operator/OperatorList - OperatorSequence/flare/vis/operator/OperatorSequence - OperatorSwitch/flare/vis/operator/OperatorSwitch - SortOperator/flare/vis/operator/SortOperator - ArrowType/flare/vis/data/render/ArrowType - EdgeRenderer/flare/vis/data/render/EdgeRenderer - IRenderer/flare/vis/data/render/IRenderer - ShapeRenderer/flare/vis/data/render/ShapeRenderer - BifocalDistortion/flare/vis/operator/distortion/BifocalDistortion - Distortion/flare/vis/operator/distortion/Distortion - FisheyeDistortion/flare/vis/operator/distortion/FisheyeDistortion - ColorEncoder/flare/vis/operator/encoder/ColorEncoder - Encoder/flare/vis/operator/encoder/Encoder - PropertyEncoder/flare/vis/operator/encoder/PropertyEncoder - ShapeEncoder/flare/vis/operator/encoder/ShapeEncoder - SizeEncoder/flare/vis/operator/encoder/SizeEncoder - FisheyeTreeFilter/flare/vis/operator/filter/FisheyeTreeFilter - GraphDistanceFilter/flare/vis/operator/filter/GraphDistanceFilter - VisibilityFilter/flare/vis/operator/filter/VisibilityFilter - Labeler/flare/vis/operator/label/Labeler - RadialLabeler/flare/vis/operator/label/RadialLabeler - StackedAreaLabeler/flare/vis/operator/label/StackedAreaLabeler - AxisLayout/flare/vis/operator/layout/AxisLayout - BundledEdgeRouter/flare/vis/operator/layout/BundledEdgeRouter - CircleLayout/flare/vis/operator/layout/CircleLayout - CirclePackingLayout/flare/vis/operator/layout/CirclePackingLayout - DendrogramLayout/flare/vis/operator/layout/DendrogramLayout - ForceDirectedLayout/flare/vis/operator/layout/ForceDirectedLayout - IcicleTreeLayout/flare/vis/operator/layout/IcicleTreeLayout - IndentedTreeLayout/flare/vis/operator/layout/IndentedTreeLayout - Layout/flare/vis/operator/layout/Layout - NodeLinkTreeLayout/flare/vis/operator/layout/NodeLinkTreeLayout - PieLayout/flare/vis/operator/layout/PieLayout - RadialTreeLayout/flare/vis/operator/layout/RadialTreeLayout - RandomLayout/flare/vis/operator/layout/RandomLayout - StackedAreaLayout/flare/vis/operator/layout/StackedAreaLayout - TreeMapLayout/flare/vis/operator/layout/TreeMapLayout - - - flare/flare - analytics/flare/analytics - animate/flare/animate - data/flare/data - display/flare/display - flex/flare/flex - physics/flare/physics - query/flare/query - scale/flare/scale - util/flare/util - vis/flare/vis - cluster/flare/analytics/cluster - graph/flare/analytics/graph - optimization/flare/analytics/optimization - interpolate/flare/animate/interpolate - converters/flare/data/converters - methods/flare/query/methods - heap/flare/util/heap - math/flare/util/math - palette/flare/util/palette - axis/flare/vis/axis - controls/flare/vis/controls - data/flare/vis/data - events/flare/vis/events - legend/flare/vis/legend - operator/flare/vis/operator - render/flare/vis/data/render - distortion/flare/vis/operator/distortion - encoder/flare/vis/operator/encoder - filter/flare/vis/operator/filter - label/flare/vis/operator/label - layout/flare/vis/operator/layout + flare/flare + analytics/flare/analytics + animate/flare/animate + data/flare/data + display/flare/display + flex/flare/flex + physics/flare/physics + query/flare/query + scale/flare/scale + util/flare/util + vis/flare/vis + cluster/flare/analytics/cluster + graph/flare/analytics/graph + optimization/flare/analytics/optimization + Easing/flare/animate/Easing + FunctionSequence/flare/animate/FunctionSequence + interpolate/flare/animate/interpolate + ISchedulable/flare/animate/ISchedulable + Parallel/flare/animate/Parallel + Pause/flare/animate/Pause + Scheduler/flare/animate/Scheduler + Sequence/flare/animate/Sequence + Transition/flare/animate/Transition + Transitioner/flare/animate/Transitioner + TransitionEvent/flare/animate/TransitionEvent + Tween/flare/animate/Tween + converters/flare/data/converters + DataField/flare/data/DataField + DataSchema/flare/data/DataSchema + DataSet/flare/data/DataSet + DataSource/flare/data/DataSource + DataTable/flare/data/DataTable + DataUtil/flare/data/DataUtil + DirtySprite/flare/display/DirtySprite + LineSprite/flare/display/LineSprite + RectSprite/flare/display/RectSprite + TextSprite/flare/display/TextSprite + FlareVis/flare/flex/FlareVis + DragForce/flare/physics/DragForce + GravityForce/flare/physics/GravityForce + IForce/flare/physics/IForce + NBodyForce/flare/physics/NBodyForce + Particle/flare/physics/Particle + Simulation/flare/physics/Simulation + Spring/flare/physics/Spring + SpringForce/flare/physics/SpringForce + AggregateExpression/flare/query/AggregateExpression + And/flare/query/And + Arithmetic/flare/query/Arithmetic + Average/flare/query/Average + BinaryExpression/flare/query/BinaryExpression + Comparison/flare/query/Comparison + CompositeExpression/flare/query/CompositeExpression + Count/flare/query/Count + DateUtil/flare/query/DateUtil + Distinct/flare/query/Distinct + Expression/flare/query/Expression + ExpressionIterator/flare/query/ExpressionIterator + Fn/flare/query/Fn + If/flare/query/If + IsA/flare/query/IsA + Literal/flare/query/Literal + Match/flare/query/Match + Maximum/flare/query/Maximum + methods/flare/query/methods + Minimum/flare/query/Minimum + Not/flare/query/Not + Or/flare/query/Or + Query/flare/query/Query + Range/flare/query/Range + StringUtil/flare/query/StringUtil + Sum/flare/query/Sum + Variable/flare/query/Variable + Variance/flare/query/Variance + Xor/flare/query/Xor + IScaleMap/flare/scale/IScaleMap + LinearScale/flare/scale/LinearScale + LogScale/flare/scale/LogScale + OrdinalScale/flare/scale/OrdinalScale + QuantileScale/flare/scale/QuantileScale + QuantitativeScale/flare/scale/QuantitativeScale + RootScale/flare/scale/RootScale + Scale/flare/scale/Scale + ScaleType/flare/scale/ScaleType + TimeScale/flare/scale/TimeScale + Arrays/flare/util/Arrays + Colors/flare/util/Colors + Dates/flare/util/Dates + Displays/flare/util/Displays + Filter/flare/util/Filter + Geometry/flare/util/Geometry + heap/flare/util/heap + IEvaluable/flare/util/IEvaluable + IPredicate/flare/util/IPredicate + IValueProxy/flare/util/IValueProxy + math/flare/util/math + Maths/flare/util/Maths + Orientation/flare/util/Orientation + palette/flare/util/palette + Property/flare/util/Property + Shapes/flare/util/Shapes + Sort/flare/util/Sort + Stats/flare/util/Stats + Strings/flare/util/Strings + axis/flare/vis/axis + controls/flare/vis/controls + data/flare/vis/data + events/flare/vis/events + legend/flare/vis/legend + operator/flare/vis/operator + Visualization/flare/vis/Visualization + AgglomerativeCluster/flare/analytics/cluster/AgglomerativeCluster + CommunityStructure/flare/analytics/cluster/CommunityStructure + HierarchicalCluster/flare/analytics/cluster/HierarchicalCluster + MergeEdge/flare/analytics/cluster/MergeEdge + BetweennessCentrality/flare/analytics/graph/BetweennessCentrality + LinkDistance/flare/analytics/graph/LinkDistance + MaxFlowMinCut/flare/analytics/graph/MaxFlowMinCut + ShortestPaths/flare/analytics/graph/ShortestPaths + SpanningTree/flare/analytics/graph/SpanningTree + AspectRatioBanker/flare/analytics/optimization/AspectRatioBanker + ArrayInterpolator/flare/animate/interpolate/ArrayInterpolator + ColorInterpolator/flare/animate/interpolate/ColorInterpolator + DateInterpolator/flare/animate/interpolate/DateInterpolator + Interpolator/flare/animate/interpolate/Interpolator + MatrixInterpolator/flare/animate/interpolate/MatrixInterpolator + NumberInterpolator/flare/animate/interpolate/NumberInterpolator + ObjectInterpolator/flare/animate/interpolate/ObjectInterpolator + PointInterpolator/flare/animate/interpolate/PointInterpolator + RectangleInterpolator/flare/animate/interpolate/RectangleInterpolator + Converters/flare/data/converters/Converters + DelimitedTextConverter/flare/data/converters/DelimitedTextConverter + GraphMLConverter/flare/data/converters/GraphMLConverter + IDataConverter/flare/data/converters/IDataConverter + JSONConverter/flare/data/converters/JSONConverter + add/flare/query/methods/add + and/flare/query/methods/and + average/flare/query/methods/average + count/flare/query/methods/count + distinct/flare/query/methods/distinct + div/flare/query/methods/div + eq/flare/query/methods/eq + fn/flare/query/methods/fn + gt/flare/query/methods/gt + gte/flare/query/methods/gte + iff/flare/query/methods/iff + isa/flare/query/methods/isa + lt/flare/query/methods/lt + lte/flare/query/methods/lte + max/flare/query/methods/max + min/flare/query/methods/min + mod/flare/query/methods/mod + mul/flare/query/methods/mul + neq/flare/query/methods/neq + not/flare/query/methods/not + or/flare/query/methods/or + orderby/flare/query/methods/orderby + range/flare/query/methods/range + select/flare/query/methods/select + stddev/flare/query/methods/stddev + sub/flare/query/methods/sub + sum/flare/query/methods/sum + update/flare/query/methods/update + variance/flare/query/methods/variance + where/flare/query/methods/where + xor/flare/query/methods/xor + _/flare/query/methods/_ + FibonacciHeap/flare/util/heap/FibonacciHeap + HeapNode/flare/util/heap/HeapNode + DenseMatrix/flare/util/math/DenseMatrix + IMatrix/flare/util/math/IMatrix + SparseMatrix/flare/util/math/SparseMatrix + ColorPalette/flare/util/palette/ColorPalette + Palette/flare/util/palette/Palette + ShapePalette/flare/util/palette/ShapePalette + SizePalette/flare/util/palette/SizePalette + Axes/flare/vis/axis/Axes + Axis/flare/vis/axis/Axis + AxisGridLine/flare/vis/axis/AxisGridLine + AxisLabel/flare/vis/axis/AxisLabel + CartesianAxes/flare/vis/axis/CartesianAxes + AnchorControl/flare/vis/controls/AnchorControl + ClickControl/flare/vis/controls/ClickControl + Control/flare/vis/controls/Control + ControlList/flare/vis/controls/ControlList + DragControl/flare/vis/controls/DragControl + ExpandControl/flare/vis/controls/ExpandControl + HoverControl/flare/vis/controls/HoverControl + IControl/flare/vis/controls/IControl + PanZoomControl/flare/vis/controls/PanZoomControl + SelectionControl/flare/vis/controls/SelectionControl + TooltipControl/flare/vis/controls/TooltipControl + Data/flare/vis/data/Data + DataList/flare/vis/data/DataList + DataSprite/flare/vis/data/DataSprite + EdgeSprite/flare/vis/data/EdgeSprite + NodeSprite/flare/vis/data/NodeSprite + render/flare/vis/data/render + ScaleBinding/flare/vis/data/ScaleBinding + Tree/flare/vis/data/Tree + TreeBuilder/flare/vis/data/TreeBuilder + DataEvent/flare/vis/events/DataEvent + SelectionEvent/flare/vis/events/SelectionEvent + TooltipEvent/flare/vis/events/TooltipEvent + VisualizationEvent/flare/vis/events/VisualizationEvent + Legend/flare/vis/legend/Legend + LegendItem/flare/vis/legend/LegendItem + LegendRange/flare/vis/legend/LegendRange + distortion/flare/vis/operator/distortion + encoder/flare/vis/operator/encoder + filter/flare/vis/operator/filter + IOperator/flare/vis/operator/IOperator + label/flare/vis/operator/label + layout/flare/vis/operator/layout + Operator/flare/vis/operator/Operator + OperatorList/flare/vis/operator/OperatorList + OperatorSequence/flare/vis/operator/OperatorSequence + OperatorSwitch/flare/vis/operator/OperatorSwitch + SortOperator/flare/vis/operator/SortOperator + ArrowType/flare/vis/data/render/ArrowType + EdgeRenderer/flare/vis/data/render/EdgeRenderer + IRenderer/flare/vis/data/render/IRenderer + ShapeRenderer/flare/vis/data/render/ShapeRenderer + BifocalDistortion/flare/vis/operator/distortion/BifocalDistortion + Distortion/flare/vis/operator/distortion/Distortion + FisheyeDistortion/flare/vis/operator/distortion/FisheyeDistortion + ColorEncoder/flare/vis/operator/encoder/ColorEncoder + Encoder/flare/vis/operator/encoder/Encoder + PropertyEncoder/flare/vis/operator/encoder/PropertyEncoder + ShapeEncoder/flare/vis/operator/encoder/ShapeEncoder + SizeEncoder/flare/vis/operator/encoder/SizeEncoder + FisheyeTreeFilter/flare/vis/operator/filter/FisheyeTreeFilter + GraphDistanceFilter/flare/vis/operator/filter/GraphDistanceFilter + VisibilityFilter/flare/vis/operator/filter/VisibilityFilter + Labeler/flare/vis/operator/label/Labeler + RadialLabeler/flare/vis/operator/label/RadialLabeler + StackedAreaLabeler/flare/vis/operator/label/StackedAreaLabeler + AxisLayout/flare/vis/operator/layout/AxisLayout + BundledEdgeRouter/flare/vis/operator/layout/BundledEdgeRouter + CircleLayout/flare/vis/operator/layout/CircleLayout + CirclePackingLayout/flare/vis/operator/layout/CirclePackingLayout + DendrogramLayout/flare/vis/operator/layout/DendrogramLayout + ForceDirectedLayout/flare/vis/operator/layout/ForceDirectedLayout + IcicleTreeLayout/flare/vis/operator/layout/IcicleTreeLayout + IndentedTreeLayout/flare/vis/operator/layout/IndentedTreeLayout + Layout/flare/vis/operator/layout/Layout + NodeLinkTreeLayout/flare/vis/operator/layout/NodeLinkTreeLayout + PieLayout/flare/vis/operator/layout/PieLayout + RadialTreeLayout/flare/vis/operator/layout/RadialTreeLayout + RandomLayout/flare/vis/operator/layout/RandomLayout + StackedAreaLayout/flare/vis/operator/layout/StackedAreaLayout + TreeMapLayout/flare/vis/operator/layout/TreeMapLayout \ No newline at end of file From ab4cc8fc2f435752a773f4842082a90ae6efc505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Mon, 22 May 2023 18:46:28 +0200 Subject: [PATCH 3/7] restore flare-indent original test --- test/output/flareIndent.svg | 1512 +++++++++++++++++------------------ test/plots/flare-indent.ts | 3 +- 2 files changed, 757 insertions(+), 758 deletions(-) diff --git a/test/output/flareIndent.svg b/test/output/flareIndent.svg index 9802e7970d..c21599c161 100644 --- a/test/output/flareIndent.svg +++ b/test/output/flareIndent.svg @@ -1,4 +1,4 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - /flare - /flare/analytics - /flare/animate - /flare/data - /flare/display - /flare/flex - /flare/physics - /flare/query - /flare/scale - /flare/util - /flare/vis - /flare/analytics/cluster - /flare/analytics/graph - /flare/analytics/optimization - /flare/animate/Easing - /flare/animate/FunctionSequence - /flare/animate/interpolate - /flare/animate/ISchedulable - /flare/animate/Parallel - /flare/animate/Pause - /flare/animate/Scheduler - /flare/animate/Sequence - /flare/animate/Transition - /flare/animate/Transitioner - /flare/animate/TransitionEvent - /flare/animate/Tween - /flare/data/converters - /flare/data/DataField - /flare/data/DataSchema - /flare/data/DataSet - /flare/data/DataSource - /flare/data/DataTable - /flare/data/DataUtil - /flare/display/DirtySprite - /flare/display/LineSprite - /flare/display/RectSprite - /flare/display/TextSprite - /flare/flex/FlareVis - /flare/physics/DragForce - /flare/physics/GravityForce - /flare/physics/IForce - /flare/physics/NBodyForce - /flare/physics/Particle - /flare/physics/Simulation - /flare/physics/Spring - /flare/physics/SpringForce - /flare/query/AggregateExpression - /flare/query/And - /flare/query/Arithmetic - /flare/query/Average - /flare/query/BinaryExpression - /flare/query/Comparison - /flare/query/CompositeExpression - /flare/query/Count - /flare/query/DateUtil - /flare/query/Distinct - /flare/query/Expression - /flare/query/ExpressionIterator - /flare/query/Fn - /flare/query/If - /flare/query/IsA - /flare/query/Literal - /flare/query/Match - /flare/query/Maximum - /flare/query/methods - /flare/query/Minimum - /flare/query/Not - /flare/query/Or - /flare/query/Query - /flare/query/Range - /flare/query/StringUtil - /flare/query/Sum - /flare/query/Variable - /flare/query/Variance - /flare/query/Xor - /flare/scale/IScaleMap - /flare/scale/LinearScale - /flare/scale/LogScale - /flare/scale/OrdinalScale - /flare/scale/QuantileScale - /flare/scale/QuantitativeScale - /flare/scale/RootScale - /flare/scale/Scale - /flare/scale/ScaleType - /flare/scale/TimeScale - /flare/util/Arrays - /flare/util/Colors - /flare/util/Dates - /flare/util/Displays - /flare/util/Filter - /flare/util/Geometry - /flare/util/heap - /flare/util/IEvaluable - /flare/util/IPredicate - /flare/util/IValueProxy - /flare/util/math - /flare/util/Maths - /flare/util/Orientation - /flare/util/palette - /flare/util/Property - /flare/util/Shapes - /flare/util/Sort - /flare/util/Stats - /flare/util/Strings - /flare/vis/axis - /flare/vis/controls - /flare/vis/data - /flare/vis/events - /flare/vis/legend - /flare/vis/operator - /flare/vis/Visualization - /flare/analytics/cluster/AgglomerativeCluster - /flare/analytics/cluster/CommunityStructure - /flare/analytics/cluster/HierarchicalCluster - /flare/analytics/cluster/MergeEdge - /flare/analytics/graph/BetweennessCentrality - /flare/analytics/graph/LinkDistance - /flare/analytics/graph/MaxFlowMinCut - /flare/analytics/graph/ShortestPaths - /flare/analytics/graph/SpanningTree - /flare/analytics/optimization/AspectRatioBanker - /flare/animate/interpolate/ArrayInterpolator - /flare/animate/interpolate/ColorInterpolator - /flare/animate/interpolate/DateInterpolator - /flare/animate/interpolate/Interpolator - /flare/animate/interpolate/MatrixInterpolator - /flare/animate/interpolate/NumberInterpolator - /flare/animate/interpolate/ObjectInterpolator - /flare/animate/interpolate/PointInterpolator - /flare/animate/interpolate/RectangleInterpolator - /flare/data/converters/Converters - /flare/data/converters/DelimitedTextConverter - /flare/data/converters/GraphMLConverter - /flare/data/converters/IDataConverter - /flare/data/converters/JSONConverter - /flare/query/methods/add - /flare/query/methods/and - /flare/query/methods/average - /flare/query/methods/count - /flare/query/methods/distinct - /flare/query/methods/div - /flare/query/methods/eq - /flare/query/methods/fn - /flare/query/methods/gt - /flare/query/methods/gte - /flare/query/methods/iff - /flare/query/methods/isa - /flare/query/methods/lt - /flare/query/methods/lte - /flare/query/methods/max - /flare/query/methods/min - /flare/query/methods/mod - /flare/query/methods/mul - /flare/query/methods/neq - /flare/query/methods/not - /flare/query/methods/or - /flare/query/methods/orderby - /flare/query/methods/range - /flare/query/methods/select - /flare/query/methods/stddev - /flare/query/methods/sub - /flare/query/methods/sum - /flare/query/methods/update - /flare/query/methods/variance - /flare/query/methods/where - /flare/query/methods/xor - /flare/query/methods/_ - /flare/util/heap/FibonacciHeap - /flare/util/heap/HeapNode - /flare/util/math/DenseMatrix - /flare/util/math/IMatrix - /flare/util/math/SparseMatrix - /flare/util/palette/ColorPalette - /flare/util/palette/Palette - /flare/util/palette/ShapePalette - /flare/util/palette/SizePalette - /flare/vis/axis/Axes - /flare/vis/axis/Axis - /flare/vis/axis/AxisGridLine - /flare/vis/axis/AxisLabel - /flare/vis/axis/CartesianAxes - /flare/vis/controls/AnchorControl - /flare/vis/controls/ClickControl - /flare/vis/controls/Control - /flare/vis/controls/ControlList - /flare/vis/controls/DragControl - /flare/vis/controls/ExpandControl - /flare/vis/controls/HoverControl - /flare/vis/controls/IControl - /flare/vis/controls/PanZoomControl - /flare/vis/controls/SelectionControl - /flare/vis/controls/TooltipControl - /flare/vis/data/Data - /flare/vis/data/DataList - /flare/vis/data/DataSprite - /flare/vis/data/EdgeSprite - /flare/vis/data/NodeSprite - /flare/vis/data/render - /flare/vis/data/ScaleBinding - /flare/vis/data/Tree - /flare/vis/data/TreeBuilder - /flare/vis/events/DataEvent - /flare/vis/events/SelectionEvent - /flare/vis/events/TooltipEvent - /flare/vis/events/VisualizationEvent - /flare/vis/legend/Legend - /flare/vis/legend/LegendItem - /flare/vis/legend/LegendRange - /flare/vis/operator/distortion - /flare/vis/operator/encoder - /flare/vis/operator/filter - /flare/vis/operator/IOperator - /flare/vis/operator/label - /flare/vis/operator/layout - /flare/vis/operator/Operator - /flare/vis/operator/OperatorList - /flare/vis/operator/OperatorSequence - /flare/vis/operator/OperatorSwitch - /flare/vis/operator/SortOperator - /flare/vis/data/render/ArrowType - /flare/vis/data/render/EdgeRenderer - /flare/vis/data/render/IRenderer - /flare/vis/data/render/ShapeRenderer - /flare/vis/operator/distortion/BifocalDistortion - /flare/vis/operator/distortion/Distortion - /flare/vis/operator/distortion/FisheyeDistortion - /flare/vis/operator/encoder/ColorEncoder - /flare/vis/operator/encoder/Encoder - /flare/vis/operator/encoder/PropertyEncoder - /flare/vis/operator/encoder/ShapeEncoder - /flare/vis/operator/encoder/SizeEncoder - /flare/vis/operator/filter/FisheyeTreeFilter - /flare/vis/operator/filter/GraphDistanceFilter - /flare/vis/operator/filter/VisibilityFilter - /flare/vis/operator/label/Labeler - /flare/vis/operator/label/RadialLabeler - /flare/vis/operator/label/StackedAreaLabeler - /flare/vis/operator/layout/AxisLayout - /flare/vis/operator/layout/BundledEdgeRouter - /flare/vis/operator/layout/CircleLayout - /flare/vis/operator/layout/CirclePackingLayout - /flare/vis/operator/layout/DendrogramLayout - /flare/vis/operator/layout/ForceDirectedLayout - /flare/vis/operator/layout/IcicleTreeLayout - /flare/vis/operator/layout/IndentedTreeLayout - /flare/vis/operator/layout/Layout - /flare/vis/operator/layout/NodeLinkTreeLayout - /flare/vis/operator/layout/PieLayout - /flare/vis/operator/layout/RadialTreeLayout - /flare/vis/operator/layout/RandomLayout - /flare/vis/operator/layout/StackedAreaLayout - /flare/vis/operator/layout/TreeMapLayout + /flare + /flare/analytics + /flare/animate + /flare/data + /flare/display + /flare/flex + /flare/physics + /flare/query + /flare/scale + /flare/util + /flare/vis + /flare/analytics/cluster + /flare/analytics/graph + /flare/analytics/optimization + /flare/animate/Easing + /flare/animate/FunctionSequence + /flare/animate/interpolate + /flare/animate/ISchedulable + /flare/animate/Parallel + /flare/animate/Pause + /flare/animate/Scheduler + /flare/animate/Sequence + /flare/animate/Transition + /flare/animate/Transitioner + /flare/animate/TransitionEvent + /flare/animate/Tween + /flare/data/converters + /flare/data/DataField + /flare/data/DataSchema + /flare/data/DataSet + /flare/data/DataSource + /flare/data/DataTable + /flare/data/DataUtil + /flare/display/DirtySprite + /flare/display/LineSprite + /flare/display/RectSprite + /flare/display/TextSprite + /flare/flex/FlareVis + /flare/physics/DragForce + /flare/physics/GravityForce + /flare/physics/IForce + /flare/physics/NBodyForce + /flare/physics/Particle + /flare/physics/Simulation + /flare/physics/Spring + /flare/physics/SpringForce + /flare/query/AggregateExpression + /flare/query/And + /flare/query/Arithmetic + /flare/query/Average + /flare/query/BinaryExpression + /flare/query/Comparison + /flare/query/CompositeExpression + /flare/query/Count + /flare/query/DateUtil + /flare/query/Distinct + /flare/query/Expression + /flare/query/ExpressionIterator + /flare/query/Fn + /flare/query/If + /flare/query/IsA + /flare/query/Literal + /flare/query/Match + /flare/query/Maximum + /flare/query/methods + /flare/query/Minimum + /flare/query/Not + /flare/query/Or + /flare/query/Query + /flare/query/Range + /flare/query/StringUtil + /flare/query/Sum + /flare/query/Variable + /flare/query/Variance + /flare/query/Xor + /flare/scale/IScaleMap + /flare/scale/LinearScale + /flare/scale/LogScale + /flare/scale/OrdinalScale + /flare/scale/QuantileScale + /flare/scale/QuantitativeScale + /flare/scale/RootScale + /flare/scale/Scale + /flare/scale/ScaleType + /flare/scale/TimeScale + /flare/util/Arrays + /flare/util/Colors + /flare/util/Dates + /flare/util/Displays + /flare/util/Filter + /flare/util/Geometry + /flare/util/heap + /flare/util/IEvaluable + /flare/util/IPredicate + /flare/util/IValueProxy + /flare/util/math + /flare/util/Maths + /flare/util/Orientation + /flare/util/palette + /flare/util/Property + /flare/util/Shapes + /flare/util/Sort + /flare/util/Stats + /flare/util/Strings + /flare/vis/axis + /flare/vis/controls + /flare/vis/data + /flare/vis/events + /flare/vis/legend + /flare/vis/operator + /flare/vis/Visualization + /flare/analytics/cluster/AgglomerativeCluster + /flare/analytics/cluster/CommunityStructure + /flare/analytics/cluster/HierarchicalCluster + /flare/analytics/cluster/MergeEdge + /flare/analytics/graph/BetweennessCentrality + /flare/analytics/graph/LinkDistance + /flare/analytics/graph/MaxFlowMinCut + /flare/analytics/graph/ShortestPaths + /flare/analytics/graph/SpanningTree + /flare/analytics/optimization/AspectRatioBanker + /flare/animate/interpolate/ArrayInterpolator + /flare/animate/interpolate/ColorInterpolator + /flare/animate/interpolate/DateInterpolator + /flare/animate/interpolate/Interpolator + /flare/animate/interpolate/MatrixInterpolator + /flare/animate/interpolate/NumberInterpolator + /flare/animate/interpolate/ObjectInterpolator + /flare/animate/interpolate/PointInterpolator + /flare/animate/interpolate/RectangleInterpolator + /flare/data/converters/Converters + /flare/data/converters/DelimitedTextConverter + /flare/data/converters/GraphMLConverter + /flare/data/converters/IDataConverter + /flare/data/converters/JSONConverter + /flare/query/methods/add + /flare/query/methods/and + /flare/query/methods/average + /flare/query/methods/count + /flare/query/methods/distinct + /flare/query/methods/div + /flare/query/methods/eq + /flare/query/methods/fn + /flare/query/methods/gt + /flare/query/methods/gte + /flare/query/methods/iff + /flare/query/methods/isa + /flare/query/methods/lt + /flare/query/methods/lte + /flare/query/methods/max + /flare/query/methods/min + /flare/query/methods/mod + /flare/query/methods/mul + /flare/query/methods/neq + /flare/query/methods/not + /flare/query/methods/or + /flare/query/methods/orderby + /flare/query/methods/range + /flare/query/methods/select + /flare/query/methods/stddev + /flare/query/methods/sub + /flare/query/methods/sum + /flare/query/methods/update + /flare/query/methods/variance + /flare/query/methods/where + /flare/query/methods/xor + /flare/query/methods/_ + /flare/util/heap/FibonacciHeap + /flare/util/heap/HeapNode + /flare/util/math/DenseMatrix + /flare/util/math/IMatrix + /flare/util/math/SparseMatrix + /flare/util/palette/ColorPalette + /flare/util/palette/Palette + /flare/util/palette/ShapePalette + /flare/util/palette/SizePalette + /flare/vis/axis/Axes + /flare/vis/axis/Axis + /flare/vis/axis/AxisGridLine + /flare/vis/axis/AxisLabel + /flare/vis/axis/CartesianAxes + /flare/vis/controls/AnchorControl + /flare/vis/controls/ClickControl + /flare/vis/controls/Control + /flare/vis/controls/ControlList + /flare/vis/controls/DragControl + /flare/vis/controls/ExpandControl + /flare/vis/controls/HoverControl + /flare/vis/controls/IControl + /flare/vis/controls/PanZoomControl + /flare/vis/controls/SelectionControl + /flare/vis/controls/TooltipControl + /flare/vis/data/Data + /flare/vis/data/DataList + /flare/vis/data/DataSprite + /flare/vis/data/EdgeSprite + /flare/vis/data/NodeSprite + /flare/vis/data/render + /flare/vis/data/ScaleBinding + /flare/vis/data/Tree + /flare/vis/data/TreeBuilder + /flare/vis/events/DataEvent + /flare/vis/events/SelectionEvent + /flare/vis/events/TooltipEvent + /flare/vis/events/VisualizationEvent + /flare/vis/legend/Legend + /flare/vis/legend/LegendItem + /flare/vis/legend/LegendRange + /flare/vis/operator/distortion + /flare/vis/operator/encoder + /flare/vis/operator/filter + /flare/vis/operator/IOperator + /flare/vis/operator/label + /flare/vis/operator/layout + /flare/vis/operator/Operator + /flare/vis/operator/OperatorList + /flare/vis/operator/OperatorSequence + /flare/vis/operator/OperatorSwitch + /flare/vis/operator/SortOperator + /flare/vis/data/render/ArrowType + /flare/vis/data/render/EdgeRenderer + /flare/vis/data/render/IRenderer + /flare/vis/data/render/ShapeRenderer + /flare/vis/operator/distortion/BifocalDistortion + /flare/vis/operator/distortion/Distortion + /flare/vis/operator/distortion/FisheyeDistortion + /flare/vis/operator/encoder/ColorEncoder + /flare/vis/operator/encoder/Encoder + /flare/vis/operator/encoder/PropertyEncoder + /flare/vis/operator/encoder/ShapeEncoder + /flare/vis/operator/encoder/SizeEncoder + /flare/vis/operator/filter/FisheyeTreeFilter + /flare/vis/operator/filter/GraphDistanceFilter + /flare/vis/operator/filter/VisibilityFilter + /flare/vis/operator/label/Labeler + /flare/vis/operator/label/RadialLabeler + /flare/vis/operator/label/StackedAreaLabeler + /flare/vis/operator/layout/AxisLayout + /flare/vis/operator/layout/BundledEdgeRouter + /flare/vis/operator/layout/CircleLayout + /flare/vis/operator/layout/CirclePackingLayout + /flare/vis/operator/layout/DendrogramLayout + /flare/vis/operator/layout/ForceDirectedLayout + /flare/vis/operator/layout/IcicleTreeLayout + /flare/vis/operator/layout/IndentedTreeLayout + /flare/vis/operator/layout/Layout + /flare/vis/operator/layout/NodeLinkTreeLayout + /flare/vis/operator/layout/PieLayout + /flare/vis/operator/layout/RadialTreeLayout + /flare/vis/operator/layout/RandomLayout + /flare/vis/operator/layout/StackedAreaLayout + /flare/vis/operator/layout/TreeMapLayout - flare/flare - analytics/flare/analytics - animate/flare/animate - data/flare/data - display/flare/display - flex/flare/flex - physics/flare/physics - query/flare/query - scale/flare/scale - util/flare/util - vis/flare/vis - cluster/flare/analytics/cluster - graph/flare/analytics/graph - optimization/flare/analytics/optimization - Easing/flare/animate/Easing - FunctionSequence/flare/animate/FunctionSequence - interpolate/flare/animate/interpolate - ISchedulable/flare/animate/ISchedulable - Parallel/flare/animate/Parallel - Pause/flare/animate/Pause - Scheduler/flare/animate/Scheduler - Sequence/flare/animate/Sequence - Transition/flare/animate/Transition - Transitioner/flare/animate/Transitioner - TransitionEvent/flare/animate/TransitionEvent - Tween/flare/animate/Tween - converters/flare/data/converters - DataField/flare/data/DataField - DataSchema/flare/data/DataSchema - DataSet/flare/data/DataSet - DataSource/flare/data/DataSource - DataTable/flare/data/DataTable - DataUtil/flare/data/DataUtil - DirtySprite/flare/display/DirtySprite - LineSprite/flare/display/LineSprite - RectSprite/flare/display/RectSprite - TextSprite/flare/display/TextSprite - FlareVis/flare/flex/FlareVis - DragForce/flare/physics/DragForce - GravityForce/flare/physics/GravityForce - IForce/flare/physics/IForce - NBodyForce/flare/physics/NBodyForce - Particle/flare/physics/Particle - Simulation/flare/physics/Simulation - Spring/flare/physics/Spring - SpringForce/flare/physics/SpringForce - AggregateExpression/flare/query/AggregateExpression - And/flare/query/And - Arithmetic/flare/query/Arithmetic - Average/flare/query/Average - BinaryExpression/flare/query/BinaryExpression - Comparison/flare/query/Comparison - CompositeExpression/flare/query/CompositeExpression - Count/flare/query/Count - DateUtil/flare/query/DateUtil - Distinct/flare/query/Distinct - Expression/flare/query/Expression - ExpressionIterator/flare/query/ExpressionIterator - Fn/flare/query/Fn - If/flare/query/If - IsA/flare/query/IsA - Literal/flare/query/Literal - Match/flare/query/Match - Maximum/flare/query/Maximum - methods/flare/query/methods - Minimum/flare/query/Minimum - Not/flare/query/Not - Or/flare/query/Or - Query/flare/query/Query - Range/flare/query/Range - StringUtil/flare/query/StringUtil - Sum/flare/query/Sum - Variable/flare/query/Variable - Variance/flare/query/Variance - Xor/flare/query/Xor - IScaleMap/flare/scale/IScaleMap - LinearScale/flare/scale/LinearScale - LogScale/flare/scale/LogScale - OrdinalScale/flare/scale/OrdinalScale - QuantileScale/flare/scale/QuantileScale - QuantitativeScale/flare/scale/QuantitativeScale - RootScale/flare/scale/RootScale - Scale/flare/scale/Scale - ScaleType/flare/scale/ScaleType - TimeScale/flare/scale/TimeScale - Arrays/flare/util/Arrays - Colors/flare/util/Colors - Dates/flare/util/Dates - Displays/flare/util/Displays - Filter/flare/util/Filter - Geometry/flare/util/Geometry - heap/flare/util/heap - IEvaluable/flare/util/IEvaluable - IPredicate/flare/util/IPredicate - IValueProxy/flare/util/IValueProxy - math/flare/util/math - Maths/flare/util/Maths - Orientation/flare/util/Orientation - palette/flare/util/palette - Property/flare/util/Property - Shapes/flare/util/Shapes - Sort/flare/util/Sort - Stats/flare/util/Stats - Strings/flare/util/Strings - axis/flare/vis/axis - controls/flare/vis/controls - data/flare/vis/data - events/flare/vis/events - legend/flare/vis/legend - operator/flare/vis/operator - Visualization/flare/vis/Visualization - AgglomerativeCluster/flare/analytics/cluster/AgglomerativeCluster - CommunityStructure/flare/analytics/cluster/CommunityStructure - HierarchicalCluster/flare/analytics/cluster/HierarchicalCluster - MergeEdge/flare/analytics/cluster/MergeEdge - BetweennessCentrality/flare/analytics/graph/BetweennessCentrality - LinkDistance/flare/analytics/graph/LinkDistance - MaxFlowMinCut/flare/analytics/graph/MaxFlowMinCut - ShortestPaths/flare/analytics/graph/ShortestPaths - SpanningTree/flare/analytics/graph/SpanningTree - AspectRatioBanker/flare/analytics/optimization/AspectRatioBanker - ArrayInterpolator/flare/animate/interpolate/ArrayInterpolator - ColorInterpolator/flare/animate/interpolate/ColorInterpolator - DateInterpolator/flare/animate/interpolate/DateInterpolator - Interpolator/flare/animate/interpolate/Interpolator - MatrixInterpolator/flare/animate/interpolate/MatrixInterpolator - NumberInterpolator/flare/animate/interpolate/NumberInterpolator - ObjectInterpolator/flare/animate/interpolate/ObjectInterpolator - PointInterpolator/flare/animate/interpolate/PointInterpolator - RectangleInterpolator/flare/animate/interpolate/RectangleInterpolator - Converters/flare/data/converters/Converters - DelimitedTextConverter/flare/data/converters/DelimitedTextConverter - GraphMLConverter/flare/data/converters/GraphMLConverter - IDataConverter/flare/data/converters/IDataConverter - JSONConverter/flare/data/converters/JSONConverter - add/flare/query/methods/add - and/flare/query/methods/and - average/flare/query/methods/average - count/flare/query/methods/count - distinct/flare/query/methods/distinct - div/flare/query/methods/div - eq/flare/query/methods/eq - fn/flare/query/methods/fn - gt/flare/query/methods/gt - gte/flare/query/methods/gte - iff/flare/query/methods/iff - isa/flare/query/methods/isa - lt/flare/query/methods/lt - lte/flare/query/methods/lte - max/flare/query/methods/max - min/flare/query/methods/min - mod/flare/query/methods/mod - mul/flare/query/methods/mul - neq/flare/query/methods/neq - not/flare/query/methods/not - or/flare/query/methods/or - orderby/flare/query/methods/orderby - range/flare/query/methods/range - select/flare/query/methods/select - stddev/flare/query/methods/stddev - sub/flare/query/methods/sub - sum/flare/query/methods/sum - update/flare/query/methods/update - variance/flare/query/methods/variance - where/flare/query/methods/where - xor/flare/query/methods/xor - _/flare/query/methods/_ - FibonacciHeap/flare/util/heap/FibonacciHeap - HeapNode/flare/util/heap/HeapNode - DenseMatrix/flare/util/math/DenseMatrix - IMatrix/flare/util/math/IMatrix - SparseMatrix/flare/util/math/SparseMatrix - ColorPalette/flare/util/palette/ColorPalette - Palette/flare/util/palette/Palette - ShapePalette/flare/util/palette/ShapePalette - SizePalette/flare/util/palette/SizePalette - Axes/flare/vis/axis/Axes - Axis/flare/vis/axis/Axis - AxisGridLine/flare/vis/axis/AxisGridLine - AxisLabel/flare/vis/axis/AxisLabel - CartesianAxes/flare/vis/axis/CartesianAxes - AnchorControl/flare/vis/controls/AnchorControl - ClickControl/flare/vis/controls/ClickControl - Control/flare/vis/controls/Control - ControlList/flare/vis/controls/ControlList - DragControl/flare/vis/controls/DragControl - ExpandControl/flare/vis/controls/ExpandControl - HoverControl/flare/vis/controls/HoverControl - IControl/flare/vis/controls/IControl - PanZoomControl/flare/vis/controls/PanZoomControl - SelectionControl/flare/vis/controls/SelectionControl - TooltipControl/flare/vis/controls/TooltipControl - Data/flare/vis/data/Data - DataList/flare/vis/data/DataList - DataSprite/flare/vis/data/DataSprite - EdgeSprite/flare/vis/data/EdgeSprite - NodeSprite/flare/vis/data/NodeSprite - render/flare/vis/data/render - ScaleBinding/flare/vis/data/ScaleBinding - Tree/flare/vis/data/Tree - TreeBuilder/flare/vis/data/TreeBuilder - DataEvent/flare/vis/events/DataEvent - SelectionEvent/flare/vis/events/SelectionEvent - TooltipEvent/flare/vis/events/TooltipEvent - VisualizationEvent/flare/vis/events/VisualizationEvent - Legend/flare/vis/legend/Legend - LegendItem/flare/vis/legend/LegendItem - LegendRange/flare/vis/legend/LegendRange - distortion/flare/vis/operator/distortion - encoder/flare/vis/operator/encoder - filter/flare/vis/operator/filter - IOperator/flare/vis/operator/IOperator - label/flare/vis/operator/label - layout/flare/vis/operator/layout - Operator/flare/vis/operator/Operator - OperatorList/flare/vis/operator/OperatorList - OperatorSequence/flare/vis/operator/OperatorSequence - OperatorSwitch/flare/vis/operator/OperatorSwitch - SortOperator/flare/vis/operator/SortOperator - ArrowType/flare/vis/data/render/ArrowType - EdgeRenderer/flare/vis/data/render/EdgeRenderer - IRenderer/flare/vis/data/render/IRenderer - ShapeRenderer/flare/vis/data/render/ShapeRenderer - BifocalDistortion/flare/vis/operator/distortion/BifocalDistortion - Distortion/flare/vis/operator/distortion/Distortion - FisheyeDistortion/flare/vis/operator/distortion/FisheyeDistortion - ColorEncoder/flare/vis/operator/encoder/ColorEncoder - Encoder/flare/vis/operator/encoder/Encoder - PropertyEncoder/flare/vis/operator/encoder/PropertyEncoder - ShapeEncoder/flare/vis/operator/encoder/ShapeEncoder - SizeEncoder/flare/vis/operator/encoder/SizeEncoder - FisheyeTreeFilter/flare/vis/operator/filter/FisheyeTreeFilter - GraphDistanceFilter/flare/vis/operator/filter/GraphDistanceFilter - VisibilityFilter/flare/vis/operator/filter/VisibilityFilter - Labeler/flare/vis/operator/label/Labeler - RadialLabeler/flare/vis/operator/label/RadialLabeler - StackedAreaLabeler/flare/vis/operator/label/StackedAreaLabeler - AxisLayout/flare/vis/operator/layout/AxisLayout - BundledEdgeRouter/flare/vis/operator/layout/BundledEdgeRouter - CircleLayout/flare/vis/operator/layout/CircleLayout - CirclePackingLayout/flare/vis/operator/layout/CirclePackingLayout - DendrogramLayout/flare/vis/operator/layout/DendrogramLayout - ForceDirectedLayout/flare/vis/operator/layout/ForceDirectedLayout - IcicleTreeLayout/flare/vis/operator/layout/IcicleTreeLayout - IndentedTreeLayout/flare/vis/operator/layout/IndentedTreeLayout - Layout/flare/vis/operator/layout/Layout - NodeLinkTreeLayout/flare/vis/operator/layout/NodeLinkTreeLayout - PieLayout/flare/vis/operator/layout/PieLayout - RadialTreeLayout/flare/vis/operator/layout/RadialTreeLayout - RandomLayout/flare/vis/operator/layout/RandomLayout - StackedAreaLayout/flare/vis/operator/layout/StackedAreaLayout - TreeMapLayout/flare/vis/operator/layout/TreeMapLayout + flare/flare + analytics/flare/analytics + animate/flare/animate + data/flare/data + display/flare/display + flex/flare/flex + physics/flare/physics + query/flare/query + scale/flare/scale + util/flare/util + vis/flare/vis + cluster/flare/analytics/cluster + graph/flare/analytics/graph + optimization/flare/analytics/optimization + Easing/flare/animate/Easing + FunctionSequence/flare/animate/FunctionSequence + interpolate/flare/animate/interpolate + ISchedulable/flare/animate/ISchedulable + Parallel/flare/animate/Parallel + Pause/flare/animate/Pause + Scheduler/flare/animate/Scheduler + Sequence/flare/animate/Sequence + Transition/flare/animate/Transition + Transitioner/flare/animate/Transitioner + TransitionEvent/flare/animate/TransitionEvent + Tween/flare/animate/Tween + converters/flare/data/converters + DataField/flare/data/DataField + DataSchema/flare/data/DataSchema + DataSet/flare/data/DataSet + DataSource/flare/data/DataSource + DataTable/flare/data/DataTable + DataUtil/flare/data/DataUtil + DirtySprite/flare/display/DirtySprite + LineSprite/flare/display/LineSprite + RectSprite/flare/display/RectSprite + TextSprite/flare/display/TextSprite + FlareVis/flare/flex/FlareVis + DragForce/flare/physics/DragForce + GravityForce/flare/physics/GravityForce + IForce/flare/physics/IForce + NBodyForce/flare/physics/NBodyForce + Particle/flare/physics/Particle + Simulation/flare/physics/Simulation + Spring/flare/physics/Spring + SpringForce/flare/physics/SpringForce + AggregateExpression/flare/query/AggregateExpression + And/flare/query/And + Arithmetic/flare/query/Arithmetic + Average/flare/query/Average + BinaryExpression/flare/query/BinaryExpression + Comparison/flare/query/Comparison + CompositeExpression/flare/query/CompositeExpression + Count/flare/query/Count + DateUtil/flare/query/DateUtil + Distinct/flare/query/Distinct + Expression/flare/query/Expression + ExpressionIterator/flare/query/ExpressionIterator + Fn/flare/query/Fn + If/flare/query/If + IsA/flare/query/IsA + Literal/flare/query/Literal + Match/flare/query/Match + Maximum/flare/query/Maximum + methods/flare/query/methods + Minimum/flare/query/Minimum + Not/flare/query/Not + Or/flare/query/Or + Query/flare/query/Query + Range/flare/query/Range + StringUtil/flare/query/StringUtil + Sum/flare/query/Sum + Variable/flare/query/Variable + Variance/flare/query/Variance + Xor/flare/query/Xor + IScaleMap/flare/scale/IScaleMap + LinearScale/flare/scale/LinearScale + LogScale/flare/scale/LogScale + OrdinalScale/flare/scale/OrdinalScale + QuantileScale/flare/scale/QuantileScale + QuantitativeScale/flare/scale/QuantitativeScale + RootScale/flare/scale/RootScale + Scale/flare/scale/Scale + ScaleType/flare/scale/ScaleType + TimeScale/flare/scale/TimeScale + Arrays/flare/util/Arrays + Colors/flare/util/Colors + Dates/flare/util/Dates + Displays/flare/util/Displays + Filter/flare/util/Filter + Geometry/flare/util/Geometry + heap/flare/util/heap + IEvaluable/flare/util/IEvaluable + IPredicate/flare/util/IPredicate + IValueProxy/flare/util/IValueProxy + math/flare/util/math + Maths/flare/util/Maths + Orientation/flare/util/Orientation + palette/flare/util/palette + Property/flare/util/Property + Shapes/flare/util/Shapes + Sort/flare/util/Sort + Stats/flare/util/Stats + Strings/flare/util/Strings + axis/flare/vis/axis + controls/flare/vis/controls + data/flare/vis/data + events/flare/vis/events + legend/flare/vis/legend + operator/flare/vis/operator + Visualization/flare/vis/Visualization + AgglomerativeCluster/flare/analytics/cluster/AgglomerativeCluster + CommunityStructure/flare/analytics/cluster/CommunityStructure + HierarchicalCluster/flare/analytics/cluster/HierarchicalCluster + MergeEdge/flare/analytics/cluster/MergeEdge + BetweennessCentrality/flare/analytics/graph/BetweennessCentrality + LinkDistance/flare/analytics/graph/LinkDistance + MaxFlowMinCut/flare/analytics/graph/MaxFlowMinCut + ShortestPaths/flare/analytics/graph/ShortestPaths + SpanningTree/flare/analytics/graph/SpanningTree + AspectRatioBanker/flare/analytics/optimization/AspectRatioBanker + ArrayInterpolator/flare/animate/interpolate/ArrayInterpolator + ColorInterpolator/flare/animate/interpolate/ColorInterpolator + DateInterpolator/flare/animate/interpolate/DateInterpolator + Interpolator/flare/animate/interpolate/Interpolator + MatrixInterpolator/flare/animate/interpolate/MatrixInterpolator + NumberInterpolator/flare/animate/interpolate/NumberInterpolator + ObjectInterpolator/flare/animate/interpolate/ObjectInterpolator + PointInterpolator/flare/animate/interpolate/PointInterpolator + RectangleInterpolator/flare/animate/interpolate/RectangleInterpolator + Converters/flare/data/converters/Converters + DelimitedTextConverter/flare/data/converters/DelimitedTextConverter + GraphMLConverter/flare/data/converters/GraphMLConverter + IDataConverter/flare/data/converters/IDataConverter + JSONConverter/flare/data/converters/JSONConverter + add/flare/query/methods/add + and/flare/query/methods/and + average/flare/query/methods/average + count/flare/query/methods/count + distinct/flare/query/methods/distinct + div/flare/query/methods/div + eq/flare/query/methods/eq + fn/flare/query/methods/fn + gt/flare/query/methods/gt + gte/flare/query/methods/gte + iff/flare/query/methods/iff + isa/flare/query/methods/isa + lt/flare/query/methods/lt + lte/flare/query/methods/lte + max/flare/query/methods/max + min/flare/query/methods/min + mod/flare/query/methods/mod + mul/flare/query/methods/mul + neq/flare/query/methods/neq + not/flare/query/methods/not + or/flare/query/methods/or + orderby/flare/query/methods/orderby + range/flare/query/methods/range + select/flare/query/methods/select + stddev/flare/query/methods/stddev + sub/flare/query/methods/sub + sum/flare/query/methods/sum + update/flare/query/methods/update + variance/flare/query/methods/variance + where/flare/query/methods/where + xor/flare/query/methods/xor + _/flare/query/methods/_ + FibonacciHeap/flare/util/heap/FibonacciHeap + HeapNode/flare/util/heap/HeapNode + DenseMatrix/flare/util/math/DenseMatrix + IMatrix/flare/util/math/IMatrix + SparseMatrix/flare/util/math/SparseMatrix + ColorPalette/flare/util/palette/ColorPalette + Palette/flare/util/palette/Palette + ShapePalette/flare/util/palette/ShapePalette + SizePalette/flare/util/palette/SizePalette + Axes/flare/vis/axis/Axes + Axis/flare/vis/axis/Axis + AxisGridLine/flare/vis/axis/AxisGridLine + AxisLabel/flare/vis/axis/AxisLabel + CartesianAxes/flare/vis/axis/CartesianAxes + AnchorControl/flare/vis/controls/AnchorControl + ClickControl/flare/vis/controls/ClickControl + Control/flare/vis/controls/Control + ControlList/flare/vis/controls/ControlList + DragControl/flare/vis/controls/DragControl + ExpandControl/flare/vis/controls/ExpandControl + HoverControl/flare/vis/controls/HoverControl + IControl/flare/vis/controls/IControl + PanZoomControl/flare/vis/controls/PanZoomControl + SelectionControl/flare/vis/controls/SelectionControl + TooltipControl/flare/vis/controls/TooltipControl + Data/flare/vis/data/Data + DataList/flare/vis/data/DataList + DataSprite/flare/vis/data/DataSprite + EdgeSprite/flare/vis/data/EdgeSprite + NodeSprite/flare/vis/data/NodeSprite + render/flare/vis/data/render + ScaleBinding/flare/vis/data/ScaleBinding + Tree/flare/vis/data/Tree + TreeBuilder/flare/vis/data/TreeBuilder + DataEvent/flare/vis/events/DataEvent + SelectionEvent/flare/vis/events/SelectionEvent + TooltipEvent/flare/vis/events/TooltipEvent + VisualizationEvent/flare/vis/events/VisualizationEvent + Legend/flare/vis/legend/Legend + LegendItem/flare/vis/legend/LegendItem + LegendRange/flare/vis/legend/LegendRange + distortion/flare/vis/operator/distortion + encoder/flare/vis/operator/encoder + filter/flare/vis/operator/filter + IOperator/flare/vis/operator/IOperator + label/flare/vis/operator/label + layout/flare/vis/operator/layout + Operator/flare/vis/operator/Operator + OperatorList/flare/vis/operator/OperatorList + OperatorSequence/flare/vis/operator/OperatorSequence + OperatorSwitch/flare/vis/operator/OperatorSwitch + SortOperator/flare/vis/operator/SortOperator + ArrowType/flare/vis/data/render/ArrowType + EdgeRenderer/flare/vis/data/render/EdgeRenderer + IRenderer/flare/vis/data/render/IRenderer + ShapeRenderer/flare/vis/data/render/ShapeRenderer + BifocalDistortion/flare/vis/operator/distortion/BifocalDistortion + Distortion/flare/vis/operator/distortion/Distortion + FisheyeDistortion/flare/vis/operator/distortion/FisheyeDistortion + ColorEncoder/flare/vis/operator/encoder/ColorEncoder + Encoder/flare/vis/operator/encoder/Encoder + PropertyEncoder/flare/vis/operator/encoder/PropertyEncoder + ShapeEncoder/flare/vis/operator/encoder/ShapeEncoder + SizeEncoder/flare/vis/operator/encoder/SizeEncoder + FisheyeTreeFilter/flare/vis/operator/filter/FisheyeTreeFilter + GraphDistanceFilter/flare/vis/operator/filter/GraphDistanceFilter + VisibilityFilter/flare/vis/operator/filter/VisibilityFilter + Labeler/flare/vis/operator/label/Labeler + RadialLabeler/flare/vis/operator/label/RadialLabeler + StackedAreaLabeler/flare/vis/operator/label/StackedAreaLabeler + AxisLayout/flare/vis/operator/layout/AxisLayout + BundledEdgeRouter/flare/vis/operator/layout/BundledEdgeRouter + CircleLayout/flare/vis/operator/layout/CircleLayout + CirclePackingLayout/flare/vis/operator/layout/CirclePackingLayout + DendrogramLayout/flare/vis/operator/layout/DendrogramLayout + ForceDirectedLayout/flare/vis/operator/layout/ForceDirectedLayout + IcicleTreeLayout/flare/vis/operator/layout/IcicleTreeLayout + IndentedTreeLayout/flare/vis/operator/layout/IndentedTreeLayout + Layout/flare/vis/operator/layout/Layout + NodeLinkTreeLayout/flare/vis/operator/layout/NodeLinkTreeLayout + PieLayout/flare/vis/operator/layout/PieLayout + RadialTreeLayout/flare/vis/operator/layout/RadialTreeLayout + RandomLayout/flare/vis/operator/layout/RandomLayout + StackedAreaLayout/flare/vis/operator/layout/StackedAreaLayout + TreeMapLayout/flare/vis/operator/layout/TreeMapLayout \ No newline at end of file diff --git a/test/plots/flare-indent.ts b/test/plots/flare-indent.ts index 163414ed86..a4fa8bdf08 100644 --- a/test/plots/flare-indent.ts +++ b/test/plots/flare-indent.ts @@ -6,10 +6,9 @@ export async function flareIndent() { return Plot.plot({ axis: null, inset: 10, - insetLeft: 70, insetRight: 120, round: true, - width: 300, + width: 200, height: 3600, marks: Plot.tree(flare, { strokeWidth: 1, From 07693f4f76a7111ce7b60f80a4aa62815f964741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Tue, 23 May 2023 10:23:25 +0200 Subject: [PATCH 4/7] textBalanced option --- docs/marks/tree.md | 7 +++++-- src/marks/tree.d.ts | 6 ++++++ src/marks/tree.js | 5 +++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/marks/tree.md b/docs/marks/tree.md index e66f84c7ec..2290de570f 100644 --- a/docs/marks/tree.md +++ b/docs/marks/tree.md @@ -32,7 +32,7 @@ function indent() { # Tree mark -The **tree mark** produces tree diagrams using the [tree transform](../transforms/tree.md). It is a [composite mark](../features/marks.md#marks-marks), consisting of a [link](./link.md) to render links from parent to child, an optional [dot](./dot.md) for nodes, and a [text](./text.md) for node labels. The link mark uses the [treeLink transform](../transforms/tree.md#treelink-options), while the dot and text marks use the [treeNode transform](../transforms/tree.md#treenode-options). +The **tree mark** produces tree diagrams using the [tree transform](../transforms/tree.md). It is a [composite mark](../features/marks.md#marks-marks), consisting of a [link](./link.md) to render links from parent to child, an optional [dot](./dot.md) for nodes, and a [text](./text.md) for node labels—or two if the **textBalanced** option is truthy, drawing leaf node labels to the right and non-leaf node labels to the left of the node. The link mark uses the [treeLink transform](../transforms/tree.md#treelink-options), while the dot and text marks use the [treeNode transform](../transforms/tree.md#treenode-options). For example, here is a little family tree of Greek gods. @@ -75,7 +75,7 @@ Plot.plot({ ``` ::: -The **treeLayout** option specifies the layout algorithm. The tree mark uses the Reingold–Tilford “tidy” tree algorithm, [d3.tree](https://github.com/d3/d3-hierarchy/blob/main/README.md#tree), by default. The [cluster](#cluster-data-options) convenience method sets **treeLayout** to [d3.cluster](https://github.com/d3/d3-hierarchy/blob/main/README.md#cluster), aligning the leaf nodes. +The **treeLayout** option specifies the layout algorithm. The tree mark uses the Reingold–Tilford “tidy” tree algorithm, [d3.tree](https://github.com/d3/d3-hierarchy/blob/main/README.md#tree), by default. The [cluster](#cluster-data-options) convenience method sets **treeLayout** to [d3.cluster](https://github.com/d3/d3-hierarchy/blob/main/README.md#cluster), aligning the leaf nodes. Both default **textBalanced** to true. :::plot https://observablehq.com/@observablehq/plot-cluster-flare ```js @@ -151,11 +151,14 @@ The following options are supported: * **title** - the text and dot title; defaults to *node:path* * **text** - the text label; defaults to *node:name* * **textStroke** - the text stroke; defaults to *white* +* **textBalanced** - the node label orientation * **dx** - the text horizontal offset; defaults to 6 if left-anchored, or -6 if right-anchored * **dy** - the text vertical offset; defaults to 0 Any additional *options* are passed through to the constituent link, dot, and text marks and their corresponding treeLink or treeNode transform. +Text labels for leaf nodes are drawn to the right of the node; the **textBalanced** option controls whether labels for non-leaf nodes are drawn to the left of the node. It defaults to true, unless a **treeLayout** is specified (*e.g.*, the custom indent layout above). + ## tree(*data*, *options*) ```js diff --git a/src/marks/tree.d.ts b/src/marks/tree.d.ts index 62bae7213d..923faccc23 100644 --- a/src/marks/tree.d.ts +++ b/src/marks/tree.d.ts @@ -19,6 +19,12 @@ export interface TreeOptions extends DotOptions, LinkOptions, TextOptions, TreeT * atop other marks by creating a halo effect; defaults to *white*. */ textStroke?: MarkOptions["stroke"]; + + /** + * Whether labels for non-leaf nodes are drawn to the left of the node; + * defaults to true unless a **treeLayout** is specified. + */ + textBalanced?: boolean; } /** diff --git a/src/marks/tree.js b/src/marks/tree.js index fa92136653..e4b0dc8d8a 100644 --- a/src/marks/tree.js +++ b/src/marks/tree.js @@ -28,13 +28,14 @@ export function tree( dx, dy, textAnchor, + textBalanced, ...options } = {} ) { const {treeLayout = Tree} = options; if (dx === undefined) dx = maybeTreeAnchor(options.treeAnchor).dx; if (textAnchor !== undefined) throw new Error("textAnchor is not a configurable tree option"); - + if (textBalanced === undefined) textBalanced = treeLayout === Tree || treeLayout === Cluster; function treeText(textOptions) { return text( data, @@ -70,7 +71,7 @@ export function tree( ), dotDot ? dot(data, treeNode({fill: fill === undefined ? "node:internal" : fill, title, ...options})) : null, textText != null - ? treeLayout === Tree || treeLayout === Cluster + ? textBalanced ? [ treeText({textAnchor: "start", treeFilter: "node:external"}), treeText({textAnchor: "end", treeFilter: "node:internal", dx: -dx}) From 023ca17ca848d9baf82460db2f7af5e7f3f88fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Tue, 23 May 2023 10:27:57 +0200 Subject: [PATCH 5/7] lighter copy --- docs/marks/tree.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/marks/tree.md b/docs/marks/tree.md index 2290de570f..b3e19b1208 100644 --- a/docs/marks/tree.md +++ b/docs/marks/tree.md @@ -32,7 +32,7 @@ function indent() { # Tree mark -The **tree mark** produces tree diagrams using the [tree transform](../transforms/tree.md). It is a [composite mark](../features/marks.md#marks-marks), consisting of a [link](./link.md) to render links from parent to child, an optional [dot](./dot.md) for nodes, and a [text](./text.md) for node labels—or two if the **textBalanced** option is truthy, drawing leaf node labels to the right and non-leaf node labels to the left of the node. The link mark uses the [treeLink transform](../transforms/tree.md#treelink-options), while the dot and text marks use the [treeNode transform](../transforms/tree.md#treenode-options). +The **tree mark** produces tree diagrams using the [tree transform](../transforms/tree.md). It is a [composite mark](../features/marks.md#marks-marks), consisting of a [link](./link.md) to render links from parent to child, an optional [dot](./dot.md) for nodes, and one or two [text](./text.md) for node labels. The link mark uses the [treeLink transform](../transforms/tree.md#treelink-options), while the dot and text marks use the [treeNode transform](../transforms/tree.md#treenode-options). For example, here is a little family tree of Greek gods. @@ -75,7 +75,7 @@ Plot.plot({ ``` ::: -The **treeLayout** option specifies the layout algorithm. The tree mark uses the Reingold–Tilford “tidy” tree algorithm, [d3.tree](https://github.com/d3/d3-hierarchy/blob/main/README.md#tree), by default. The [cluster](#cluster-data-options) convenience method sets **treeLayout** to [d3.cluster](https://github.com/d3/d3-hierarchy/blob/main/README.md#cluster), aligning the leaf nodes. Both default **textBalanced** to true. +The **treeLayout** option specifies the layout algorithm. The tree mark uses the Reingold–Tilford “tidy” tree algorithm, [d3.tree](https://github.com/d3/d3-hierarchy/blob/main/README.md#tree), by default. The [cluster](#cluster-data-options) convenience method sets **treeLayout** to [d3.cluster](https://github.com/d3/d3-hierarchy/blob/main/README.md#cluster), aligning the leaf nodes. Both default the **textBalanced** option to true, drawing non-leaf node labels to the left of the node. :::plot https://observablehq.com/@observablehq/plot-cluster-flare ```js @@ -151,7 +151,7 @@ The following options are supported: * **title** - the text and dot title; defaults to *node:path* * **text** - the text label; defaults to *node:name* * **textStroke** - the text stroke; defaults to *white* -* **textBalanced** - the node label orientation +* **textBalanced** - the orientation of non-leaf labels * **dx** - the text horizontal offset; defaults to 6 if left-anchored, or -6 if right-anchored * **dy** - the text vertical offset; defaults to 0 From c601427d712a3d90e19860ce00cde9516d0b5560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Rivi=C3=A8re?= Date: Wed, 24 May 2023 06:30:56 +0200 Subject: [PATCH 6/7] textLayout option --- docs/marks/tree.md | 13 ++++++++----- src/marks/tree.d.ts | 10 ++++++---- src/marks/tree.js | 16 ++++++++++------ 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/docs/marks/tree.md b/docs/marks/tree.md index b3e19b1208..a6b33e0a78 100644 --- a/docs/marks/tree.md +++ b/docs/marks/tree.md @@ -75,7 +75,7 @@ Plot.plot({ ``` ::: -The **treeLayout** option specifies the layout algorithm. The tree mark uses the Reingold–Tilford “tidy” tree algorithm, [d3.tree](https://github.com/d3/d3-hierarchy/blob/main/README.md#tree), by default. The [cluster](#cluster-data-options) convenience method sets **treeLayout** to [d3.cluster](https://github.com/d3/d3-hierarchy/blob/main/README.md#cluster), aligning the leaf nodes. Both default the **textBalanced** option to true, drawing non-leaf node labels to the left of the node. +The **treeLayout** option specifies the layout algorithm. The tree mark uses the Reingold–Tilford “tidy” tree algorithm, [d3.tree](https://github.com/d3/d3-hierarchy/blob/main/README.md#tree), by default. The [cluster](#cluster-data-options) convenience method sets **treeLayout** to [d3.cluster](https://github.com/d3/d3-hierarchy/blob/main/README.md#cluster), aligning the leaf nodes. :::plot https://observablehq.com/@observablehq/plot-cluster-flare ```js @@ -151,13 +151,16 @@ The following options are supported: * **title** - the text and dot title; defaults to *node:path* * **text** - the text label; defaults to *node:name* * **textStroke** - the text stroke; defaults to *white* -* **textBalanced** - the orientation of non-leaf labels -* **dx** - the text horizontal offset; defaults to 6 if left-anchored, or -6 if right-anchored +* **textLayout** - the text anchoring layout +* **dx** - the text horizontal offset; defaults to 6 * **dy** - the text vertical offset; defaults to 0 Any additional *options* are passed through to the constituent link, dot, and text marks and their corresponding treeLink or treeNode transform. -Text labels for leaf nodes are drawn to the right of the node; the **textBalanced** option controls whether labels for non-leaf nodes are drawn to the left of the node. It defaults to true, unless a **treeLayout** is specified (*e.g.*, the custom indent layout above). +The **textLayout** option controls how text labels are anchored to the node. Two layouts are supported: + +* *mirrored* - leaf-node labels are left-anchored, and non-leaf nodes right-anchored (with a -dx offset); default unless a **treeLayout** is specified +* *normal* - all labels are left-anchored; default if a **treeLayout** is specified ## tree(*data*, *options*) @@ -173,4 +176,4 @@ Returns a new tree mark with the given *data* and *options*. Plot.cluster(flare, {path: "name", delimiter: "."}) ``` -Like [tree](#tree-data-options), except sets the **treeLayout** option to [d3.cluster](https://github.com/d3/d3-hierarchy/blob/main/README.md#cluster), aligning leaf nodes. +Like [tree](#tree-data-options), except sets the **treeLayout** option to [d3.cluster](https://github.com/d3/d3-hierarchy/blob/main/README.md#cluster), aligning leaf nodes, and defaults the **textLayout** option to *mirrored*. diff --git a/src/marks/tree.d.ts b/src/marks/tree.d.ts index 923faccc23..de24023add 100644 --- a/src/marks/tree.d.ts +++ b/src/marks/tree.d.ts @@ -21,10 +21,12 @@ export interface TreeOptions extends DotOptions, LinkOptions, TextOptions, TreeT textStroke?: MarkOptions["stroke"]; /** - * Whether labels for non-leaf nodes are drawn to the left of the node; - * defaults to true unless a **treeLayout** is specified. + * Layout for node labels: if *mirrored*, leaf-node labels are left-anchored, + * and non-leaf nodes right-anchored (with a -dx offset). If *normal*, all + * labels are left-anchored. Defaults to *mirrored* unless a **treeLayout** + * has been specified. */ - textBalanced?: boolean; + textLayout?: "mirrored" | "normal"; } /** @@ -46,7 +48,7 @@ export function tree(data?: Data, options?: TreeOptions): CompoundMark; * option, placing leaf nodes of the tree at the same depth. Equivalent to: * * ```js - * Plot.tree(data, {...options, treeLayout: d3.cluster}) + * Plot.tree(data, {...options, treeLayout: d3.cluster, textLayout: "mirrored"}) * ``` * * [1]: https://github.com/d3/d3-hierarchy/blob/main/README.md#cluster diff --git a/src/marks/tree.js b/src/marks/tree.js index e4b0dc8d8a..b6ef34026e 100644 --- a/src/marks/tree.js +++ b/src/marks/tree.js @@ -1,10 +1,11 @@ -import {tree as Tree, cluster as Cluster} from "d3"; +import {cluster as Cluster} from "d3"; import {marks} from "../mark.js"; import {isNoneish} from "../options.js"; import {maybeTreeAnchor, treeLink, treeNode} from "../transforms/tree.js"; import {dot} from "./dot.js"; import {link} from "./link.js"; import {text} from "./text.js"; +import {keyword} from "../options.js"; export function tree( data, @@ -28,14 +29,17 @@ export function tree( dx, dy, textAnchor, - textBalanced, + textLayout, ...options } = {} ) { - const {treeLayout = Tree} = options; if (dx === undefined) dx = maybeTreeAnchor(options.treeAnchor).dx; if (textAnchor !== undefined) throw new Error("textAnchor is not a configurable tree option"); - if (textBalanced === undefined) textBalanced = treeLayout === Tree || treeLayout === Cluster; + textLayout = keyword( + textLayout === undefined ? (options.treeLayout === undefined ? "mirrored" : "normal") : textLayout, + "textLayout", + ["mirrored", "normal"] + ); function treeText(textOptions) { return text( data, @@ -71,7 +75,7 @@ export function tree( ), dotDot ? dot(data, treeNode({fill: fill === undefined ? "node:internal" : fill, title, ...options})) : null, textText != null - ? textBalanced + ? textLayout === "mirrored" ? [ treeText({textAnchor: "start", treeFilter: "node:external"}), treeText({textAnchor: "end", treeFilter: "node:internal", dx: -dx}) @@ -82,5 +86,5 @@ export function tree( } export function cluster(data, options) { - return tree(data, {...options, treeLayout: Cluster}); + return tree(data, {textLayout: "mirrored", ...options, treeLayout: Cluster}); } From 8cb8b4383e7bc2fb2508fdfc4bd98a60cb98cf75 Mon Sep 17 00:00:00 2001 From: Mike Bostock Date: Thu, 15 Jun 2023 16:18:42 -0700 Subject: [PATCH 7/7] tweak textLayout default --- docs/marks/tree.md | 6 ++++-- src/marks/tree.js | 20 +++++++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/docs/marks/tree.md b/docs/marks/tree.md index a6b33e0a78..be67690ce5 100644 --- a/docs/marks/tree.md +++ b/docs/marks/tree.md @@ -159,8 +159,10 @@ Any additional *options* are passed through to the constituent link, dot, and te The **textLayout** option controls how text labels are anchored to the node. Two layouts are supported: -* *mirrored* - leaf-node labels are left-anchored, and non-leaf nodes right-anchored (with a -dx offset); default unless a **treeLayout** is specified -* *normal* - all labels are left-anchored; default if a **treeLayout** is specified +* *mirrored* - leaf-node labels are left-anchored, and non-leaf nodes right-anchored +* *normal* - all labels are left-anchored + +If the **treeLayout** is d3.tree or d3.cluster, the **textLayout** defaults to *mirrored*; otherwise it defaults to *normal*. ## tree(*data*, *options*) diff --git a/src/marks/tree.js b/src/marks/tree.js index b6ef34026e..4345f08de4 100644 --- a/src/marks/tree.js +++ b/src/marks/tree.js @@ -1,4 +1,4 @@ -import {cluster as Cluster} from "d3"; +import {cluster as Cluster, tree as Tree} from "d3"; import {marks} from "../mark.js"; import {isNoneish} from "../options.js"; import {maybeTreeAnchor, treeLink, treeNode} from "../transforms/tree.js"; @@ -29,21 +29,20 @@ export function tree( dx, dy, textAnchor, - textLayout, + treeLayout = Tree, + textLayout = treeLayout === Tree || treeLayout === Cluster ? "mirrored" : "normal", ...options } = {} ) { if (dx === undefined) dx = maybeTreeAnchor(options.treeAnchor).dx; if (textAnchor !== undefined) throw new Error("textAnchor is not a configurable tree option"); - textLayout = keyword( - textLayout === undefined ? (options.treeLayout === undefined ? "mirrored" : "normal") : textLayout, - "textLayout", - ["mirrored", "normal"] - ); + textLayout = keyword(textLayout, "textLayout", ["mirrored", "normal"]); + function treeText(textOptions) { return text( data, treeNode({ + treeLayout, text: textText, fill: fill === undefined ? "currentColor" : fill, stroke: textStroke, @@ -60,6 +59,7 @@ export function tree( link( data, treeLink({ + treeLayout, markerStart, markerEnd, stroke: stroke !== undefined ? stroke : fill === undefined ? "node:internal" : fill, @@ -73,7 +73,9 @@ export function tree( ...options }) ), - dotDot ? dot(data, treeNode({fill: fill === undefined ? "node:internal" : fill, title, ...options})) : null, + dotDot + ? dot(data, treeNode({treeLayout, fill: fill === undefined ? "node:internal" : fill, title, ...options})) + : null, textText != null ? textLayout === "mirrored" ? [ @@ -86,5 +88,5 @@ export function tree( } export function cluster(data, options) { - return tree(data, {textLayout: "mirrored", ...options, treeLayout: Cluster}); + return tree(data, {...options, treeLayout: Cluster}); }