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