stream-charts 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +758 -345
- package/changes.md +10 -0
- package/dist/src/app/charts/Chart.d.ts +116 -87
- package/dist/src/app/charts/Chart.js +96 -101
- package/dist/src/app/charts/Chart.js.map +1 -1
- package/dist/src/app/charts/axes/AxesState.d.ts +64 -0
- package/dist/src/app/charts/axes/AxesState.js +97 -0
- package/dist/src/app/charts/axes/AxesState.js.map +1 -0
- package/dist/src/app/charts/axes/AxesState.test.js +30 -0
- package/dist/src/app/charts/axes/AxesState.test.js.map +1 -0
- package/dist/src/app/charts/axes/AxisInterval.d.ts +92 -0
- package/dist/src/app/charts/axes/AxisInterval.js +126 -0
- package/dist/src/app/charts/axes/AxisInterval.js.map +1 -0
- package/dist/src/app/charts/axes/AxisInterval.test.js +120 -0
- package/dist/src/app/charts/axes/AxisInterval.test.js.map +1 -0
- package/dist/src/app/charts/axes/BaseAxisRange.d.ts +83 -0
- package/dist/src/app/charts/axes/BaseAxisRange.js +58 -0
- package/dist/src/app/charts/axes/BaseAxisRange.js.map +1 -0
- package/dist/src/app/charts/axes/ContinuousAxis.d.ts +22 -0
- package/dist/src/app/charts/axes/ContinuousAxis.js +96 -0
- package/dist/src/app/charts/axes/ContinuousAxis.js.map +1 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.d.ts +59 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.js +84 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.js.map +1 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.test.js +47 -0
- package/dist/src/app/charts/axes/ContinuousAxisRange.test.js.map +1 -0
- package/dist/src/app/charts/axes/OrdinalAxis.d.ts +23 -0
- package/dist/src/app/charts/axes/OrdinalAxis.js +124 -0
- package/dist/src/app/charts/axes/OrdinalAxis.js.map +1 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.d.ts +69 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.js +100 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.js.map +1 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.test.js +48 -0
- package/dist/src/app/charts/axes/OrdinalAxisRange.test.js.map +1 -0
- package/dist/src/app/charts/axes/axes.d.ts +391 -0
- package/dist/src/app/charts/axes/axes.js +1046 -0
- package/dist/src/app/charts/axes/axes.js.map +1 -0
- package/dist/src/app/charts/d3types.d.ts +10 -10
- package/dist/src/app/charts/filters/regexFilter.d.ts +9 -0
- package/dist/src/app/charts/filters/regexFilter.js +18 -0
- package/dist/src/app/charts/filters/regexFilter.js.map +1 -0
- package/dist/src/app/charts/filters/regexFilter.test.d.ts +1 -0
- package/dist/src/app/charts/filters/regexFilter.test.js +11 -0
- package/dist/src/app/charts/filters/regexFilter.test.js.map +1 -0
- package/dist/src/app/charts/hooks/useAxes.d.ts +144 -0
- package/dist/src/app/charts/hooks/useAxes.js +187 -0
- package/dist/src/app/charts/hooks/useAxes.js.map +1 -0
- package/dist/src/app/charts/hooks/useChart.d.ts +30 -201
- package/dist/src/app/charts/hooks/useChart.js +33 -134
- package/dist/src/app/charts/hooks/useChart.js.map +1 -1
- package/dist/src/app/charts/hooks/useDataObservable.d.ts +74 -0
- package/dist/src/app/charts/hooks/useDataObservable.js +76 -0
- package/dist/src/app/charts/hooks/useDataObservable.js.map +1 -0
- package/dist/src/app/charts/hooks/useInitialData.d.ts +38 -0
- package/dist/src/app/charts/hooks/useInitialData.js +29 -0
- package/dist/src/app/charts/hooks/useInitialData.js.map +1 -0
- package/dist/src/app/charts/hooks/useMouse.d.ts +53 -0
- package/dist/src/app/charts/hooks/useMouse.js +65 -0
- package/dist/src/app/charts/hooks/useMouse.js.map +1 -0
- package/dist/src/app/charts/hooks/usePlotDimensions.d.ts +34 -0
- package/dist/src/app/charts/hooks/usePlotDimensions.js +73 -0
- package/dist/src/app/charts/hooks/usePlotDimensions.js.map +1 -0
- package/dist/src/app/charts/hooks/useTooltip.d.ts +64 -0
- package/dist/src/app/charts/hooks/useTooltip.js +52 -0
- package/dist/src/app/charts/hooks/useTooltip.js.map +1 -0
- package/dist/src/app/charts/observables/ChartData.d.ts +23 -0
- package/dist/src/app/charts/observables/ChartData.js +20 -0
- package/dist/src/app/charts/observables/ChartData.js.map +1 -0
- package/dist/src/app/charts/observables/iterates.d.ts +52 -0
- package/dist/src/app/charts/observables/iterates.js +121 -0
- package/dist/src/app/charts/observables/iterates.js.map +1 -0
- package/dist/src/app/charts/observables/iterates.test.d.ts +1 -0
- package/dist/src/app/charts/observables/iterates.test.js +180 -0
- package/dist/src/app/charts/observables/iterates.test.js.map +1 -0
- package/dist/src/app/charts/observables/ordinals.d.ts +75 -0
- package/dist/src/app/charts/observables/ordinals.js +141 -0
- package/dist/src/app/charts/observables/ordinals.js.map +1 -0
- package/dist/src/app/charts/observables/ordinals.test.d.ts +1 -0
- package/dist/src/app/charts/observables/ordinals.test.js +102 -0
- package/dist/src/app/charts/observables/ordinals.test.js.map +1 -0
- package/dist/src/app/charts/plots/BarPlot.d.ts +81 -0
- package/dist/src/app/charts/plots/BarPlot.js +557 -0
- package/dist/src/app/charts/plots/BarPlot.js.map +1 -0
- package/dist/src/app/charts/plots/PoincarePlot.d.ts +78 -0
- package/dist/src/app/charts/plots/PoincarePlot.js +504 -0
- package/dist/src/app/charts/plots/PoincarePlot.js.map +1 -0
- package/dist/src/app/charts/{RasterPlot.d.ts → plots/RasterPlot.d.ts} +1 -1
- package/dist/src/app/charts/{RasterPlot.js → plots/RasterPlot.js} +152 -133
- package/dist/src/app/charts/plots/RasterPlot.js.map +1 -0
- package/dist/src/app/charts/{ScatterPlot.d.ts → plots/ScatterPlot.d.ts} +10 -8
- package/dist/src/app/charts/plots/ScatterPlot.js +379 -0
- package/dist/src/app/charts/plots/ScatterPlot.js.map +1 -0
- package/dist/src/app/charts/{plot.d.ts → plots/plot.d.ts} +12 -14
- package/dist/src/app/charts/{plot.js → plots/plot.js} +19 -17
- package/dist/src/app/charts/plots/plot.js.map +1 -0
- package/dist/src/app/charts/series/baseSeries.d.ts +38 -0
- package/dist/src/app/charts/series/baseSeries.js +36 -0
- package/dist/src/app/charts/series/baseSeries.js.map +1 -0
- package/dist/src/app/charts/series/datumSeries.test.d.ts +1 -0
- package/dist/src/app/charts/series/datumSeries.test.js +50 -0
- package/dist/src/app/charts/series/datumSeries.test.js.map +1 -0
- package/dist/src/app/charts/series/iterateSeries.d.ts +42 -0
- package/dist/src/app/charts/series/iterateSeries.js +34 -0
- package/dist/src/app/charts/series/iterateSeries.js.map +1 -0
- package/dist/src/app/charts/series/ordinalSeries.d.ts +54 -0
- package/dist/src/app/charts/series/ordinalSeries.js +98 -0
- package/dist/src/app/charts/series/ordinalSeries.js.map +1 -0
- package/dist/src/app/charts/series/timeSeries.d.ts +30 -0
- package/dist/src/app/charts/series/timeSeries.js +19 -0
- package/dist/src/app/charts/series/timeSeries.js.map +1 -0
- package/dist/src/app/charts/{chartData.d.ts → series/timeSeriesChartData.d.ts} +11 -6
- package/dist/src/app/charts/series/timeSeriesChartData.js +32 -0
- package/dist/src/app/charts/series/timeSeriesChartData.js.map +1 -0
- package/dist/src/app/charts/styling/barPlotStyle.d.ts +41 -0
- package/dist/src/app/charts/styling/barPlotStyle.js +84 -0
- package/dist/src/app/charts/styling/barPlotStyle.js.map +1 -0
- package/dist/src/app/charts/{margins.d.ts → styling/margins.d.ts} +7 -5
- package/dist/src/app/charts/{margins.js → styling/margins.js} +19 -9
- package/dist/src/app/charts/styling/margins.js.map +1 -0
- package/dist/src/app/charts/styling/margins.test.d.ts +1 -0
- package/dist/src/app/charts/styling/margins.test.js +19 -0
- package/dist/src/app/charts/styling/margins.test.js.map +1 -0
- package/dist/src/app/charts/styling/svgStyle.d.ts +76 -0
- package/dist/src/app/charts/styling/svgStyle.js +84 -0
- package/dist/src/app/charts/styling/svgStyle.js.map +1 -0
- package/dist/src/app/charts/subscriptions/subscription.test.d.ts +1 -0
- package/dist/src/app/charts/subscriptions/subscription.test.js +395 -0
- package/dist/src/app/charts/subscriptions/subscription.test.js.map +1 -0
- package/dist/src/app/charts/subscriptions/subscriptions.d.ts +100 -0
- package/dist/src/app/charts/subscriptions/subscriptions.js +449 -0
- package/dist/src/app/charts/subscriptions/subscriptions.js.map +1 -0
- package/dist/src/app/charts/tooltips/BarPlotTooltipContent.d.ts +90 -0
- package/dist/src/app/charts/tooltips/BarPlotTooltipContent.js +302 -0
- package/dist/src/app/charts/tooltips/BarPlotTooltipContent.js.map +1 -0
- package/dist/src/app/charts/tooltips/PoincarePlotTooltipContent.d.ts +100 -0
- package/dist/src/app/charts/tooltips/PoincarePlotTooltipContent.js +190 -0
- package/dist/src/app/charts/tooltips/PoincarePlotTooltipContent.js.map +1 -0
- package/dist/src/app/charts/{RasterPlotTooltipContent.js → tooltips/RasterPlotTooltipContent.js} +40 -44
- package/dist/src/app/charts/tooltips/RasterPlotTooltipContent.js.map +1 -0
- package/dist/src/app/charts/tooltips/ScatterPlotTooltipContent.js +154 -0
- package/dist/src/app/charts/tooltips/ScatterPlotTooltipContent.js.map +1 -0
- package/dist/src/app/charts/{Tooltip.d.ts → tooltips/Tooltip.d.ts} +4 -2
- package/dist/src/app/charts/{Tooltip.js → tooltips/Tooltip.js} +23 -28
- package/dist/src/app/charts/tooltips/Tooltip.js.map +1 -0
- package/dist/src/app/charts/{tooltipUtils.d.ts → tooltips/tooltipUtils.d.ts} +17 -11
- package/dist/src/app/charts/{tooltipUtils.js → tooltips/tooltipUtils.js} +52 -25
- package/dist/src/app/charts/tooltips/tooltipUtils.js.map +1 -0
- package/dist/src/app/charts/{Tracker.d.ts → trackers/Tracker.d.ts} +6 -5
- package/dist/src/app/charts/trackers/Tracker.js +60 -0
- package/dist/src/app/charts/trackers/Tracker.js.map +1 -0
- package/dist/src/app/charts/{trackerUtils.d.ts → trackers/trackerUtils.d.ts} +13 -8
- package/dist/src/app/charts/trackers/trackerUtils.js +359 -0
- package/dist/src/app/charts/trackers/trackerUtils.js.map +1 -0
- package/dist/src/app/charts/utils.d.ts +22 -32
- package/dist/src/app/charts/utils.js +36 -37
- package/dist/src/app/charts/utils.js.map +1 -1
- package/dist/src/index.d.ts +48 -15
- package/dist/src/index.js +71 -15
- package/dist/src/index.js.map +1 -1
- package/package.json +30 -20
- package/src/app/charts/Chart.tsx +334 -0
- package/src/app/charts/axes/AxesState.test.ts +34 -0
- package/src/app/charts/axes/AxesState.ts +112 -0
- package/src/app/charts/axes/AxisInterval.test.ts +143 -0
- package/src/app/charts/axes/AxisInterval.ts +139 -0
- package/src/app/charts/axes/BaseAxisRange.ts +113 -0
- package/src/app/charts/axes/ContinuousAxis.tsx +192 -0
- package/src/app/charts/axes/ContinuousAxisRange.test.ts +55 -0
- package/src/app/charts/axes/ContinuousAxisRange.ts +96 -0
- package/src/app/charts/axes/OrdinalAxis.tsx +223 -0
- package/src/app/charts/axes/OrdinalAxisRange.test.ts +55 -0
- package/src/app/charts/axes/OrdinalAxisRange.ts +112 -0
- package/src/app/charts/axes/axes.ts +1569 -0
- package/src/app/charts/d3types.ts +16 -0
- package/src/app/charts/filters/regexFilter.test.ts +13 -0
- package/src/app/charts/filters/regexFilter.ts +17 -0
- package/src/app/charts/hooks/useAxes.tsx +341 -0
- package/src/app/charts/hooks/useChart.tsx +159 -0
- package/src/app/charts/hooks/useDataObservable.tsx +175 -0
- package/src/app/charts/hooks/useInitialData.tsx +65 -0
- package/src/app/charts/hooks/useMouse.tsx +125 -0
- package/src/app/charts/hooks/usePlotDimensions.tsx +120 -0
- package/src/app/charts/hooks/useTooltip.tsx +112 -0
- package/src/app/charts/observables/ChartData.ts +31 -0
- package/src/app/charts/observables/iterates.test.ts +201 -0
- package/src/app/charts/observables/iterates.ts +203 -0
- package/src/app/charts/observables/ordinals.test.ts +135 -0
- package/src/app/charts/observables/ordinals.ts +248 -0
- package/src/app/charts/plots/BarPlot.tsx +1088 -0
- package/src/app/charts/plots/PoincarePlot.tsx +832 -0
- package/src/app/charts/plots/RasterPlot.tsx +676 -0
- package/src/app/charts/plots/ScatterPlot.tsx +653 -0
- package/src/app/charts/plots/plot.ts +75 -0
- package/src/app/charts/series/baseSeries.ts +52 -0
- package/src/app/charts/series/datumSeries.test.ts +60 -0
- package/src/app/charts/series/iterateSeries.ts +56 -0
- package/src/app/charts/series/ordinalSeries.ts +164 -0
- package/src/app/charts/series/timeSeries.ts +40 -0
- package/src/app/charts/series/timeSeriesChartData.ts +68 -0
- package/src/app/charts/styling/barPlotStyle.ts +126 -0
- package/src/app/charts/styling/margins.test.ts +22 -0
- package/src/app/charts/styling/margins.ts +58 -0
- package/src/app/charts/styling/svgStyle.ts +118 -0
- package/src/app/charts/subscriptions/subscription.test.ts +499 -0
- package/src/app/charts/subscriptions/subscriptions.ts +635 -0
- package/src/app/charts/tooltips/BarPlotTooltipContent.tsx +440 -0
- package/src/app/charts/tooltips/PoincarePlotTooltipContent.tsx +352 -0
- package/src/app/charts/tooltips/RasterPlotTooltipContent.tsx +274 -0
- package/src/app/charts/tooltips/ScatterPlotTooltipContent.tsx +319 -0
- package/src/app/charts/tooltips/Tooltip.tsx +148 -0
- package/src/app/charts/tooltips/tooltipUtils.ts +216 -0
- package/src/app/charts/trackers/Tracker.tsx +129 -0
- package/src/app/charts/trackers/trackerUtils.ts +494 -0
- package/src/app/charts/utils.ts +109 -0
- package/dist/src/app/charts/CategoryAxis.d.ts +0 -20
- package/dist/src/app/charts/CategoryAxis.js +0 -112
- package/dist/src/app/charts/CategoryAxis.js.map +0 -1
- package/dist/src/app/charts/ContinuousAxis.d.ts +0 -16
- package/dist/src/app/charts/ContinuousAxis.js +0 -186
- package/dist/src/app/charts/ContinuousAxis.js.map +0 -1
- package/dist/src/app/charts/RasterPlot.js.map +0 -1
- package/dist/src/app/charts/RasterPlotTooltipContent.js.map +0 -1
- package/dist/src/app/charts/ScatterPlot.js +0 -351
- package/dist/src/app/charts/ScatterPlot.js.map +0 -1
- package/dist/src/app/charts/ScatterPlotTooltipContent.js +0 -163
- package/dist/src/app/charts/ScatterPlotTooltipContent.js.map +0 -1
- package/dist/src/app/charts/Tooltip.js.map +0 -1
- package/dist/src/app/charts/Tracker.js +0 -65
- package/dist/src/app/charts/Tracker.js.map +0 -1
- package/dist/src/app/charts/axes.d.ts +0 -132
- package/dist/src/app/charts/axes.js +0 -265
- package/dist/src/app/charts/axes.js.map +0 -1
- package/dist/src/app/charts/chartData.js +0 -32
- package/dist/src/app/charts/chartData.js.map +0 -1
- package/dist/src/app/charts/continuousAxisRangeFor.d.ts +0 -20
- package/dist/src/app/charts/continuousAxisRangeFor.js +0 -68
- package/dist/src/app/charts/continuousAxisRangeFor.js.map +0 -1
- package/dist/src/app/charts/datumSeries.d.ts +0 -59
- package/dist/src/app/charts/datumSeries.js +0 -55
- package/dist/src/app/charts/datumSeries.js.map +0 -1
- package/dist/src/app/charts/datumSeries.test.js +0 -50
- package/dist/src/app/charts/datumSeries.test.js.map +0 -1
- package/dist/src/app/charts/hooks/AxesState.d.ts +0 -37
- package/dist/src/app/charts/hooks/AxesState.js +0 -44
- package/dist/src/app/charts/hooks/AxesState.js.map +0 -1
- package/dist/src/app/charts/margins.js.map +0 -1
- package/dist/src/app/charts/margins.test.js +0 -14
- package/dist/src/app/charts/margins.test.js.map +0 -1
- package/dist/src/app/charts/plot.js.map +0 -1
- package/dist/src/app/charts/regexFilter.d.ts +0 -9
- package/dist/src/app/charts/regexFilter.js +0 -17
- package/dist/src/app/charts/regexFilter.js.map +0 -1
- package/dist/src/app/charts/regexFilter.test.js +0 -11
- package/dist/src/app/charts/regexFilter.test.js.map +0 -1
- package/dist/src/app/charts/subscriptions.d.ts +0 -43
- package/dist/src/app/charts/subscriptions.js +0 -213
- package/dist/src/app/charts/subscriptions.js.map +0 -1
- package/dist/src/app/charts/svgStyle.d.ts +0 -27
- package/dist/src/app/charts/svgStyle.js +0 -32
- package/dist/src/app/charts/svgStyle.js.map +0 -1
- package/dist/src/app/charts/timeRange.test.js +0 -54
- package/dist/src/app/charts/timeRange.test.js.map +0 -1
- package/dist/src/app/charts/tooltipUtils.js.map +0 -1
- package/dist/src/app/charts/trackerUtils.js +0 -130
- package/dist/src/app/charts/trackerUtils.js.map +0 -1
- /package/dist/src/app/charts/{datumSeries.test.d.ts → axes/AxesState.test.d.ts} +0 -0
- /package/dist/src/app/charts/{margins.test.d.ts → axes/AxisInterval.test.d.ts} +0 -0
- /package/dist/src/app/charts/{regexFilter.test.d.ts → axes/ContinuousAxisRange.test.d.ts} +0 -0
- /package/dist/src/app/charts/{timeRange.test.d.ts → axes/OrdinalAxisRange.test.d.ts} +0 -0
- /package/dist/src/app/charts/{RasterPlotTooltipContent.d.ts → tooltips/RasterPlotTooltipContent.d.ts} +0 -0
- /package/dist/src/app/charts/{ScatterPlotTooltipContent.d.ts → tooltips/ScatterPlotTooltipContent.d.ts} +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as d3 from "d3";
|
|
2
|
+
import { CurveFactory } from "d3";
|
|
3
|
+
export declare const NoCurveFactory: CurveFactory;
|
|
4
|
+
interface Props {
|
|
5
|
+
/**
|
|
6
|
+
* The line interpolation curve factory. See the d3 documentation for curves at
|
|
7
|
+
* {@link https://github.com/d3/d3-shape#curves} for information on available interpolations
|
|
8
|
+
*/
|
|
9
|
+
interpolation?: d3.CurveFactory;
|
|
10
|
+
/**
|
|
11
|
+
* When set to `true` plots the data points as well as the line.
|
|
12
|
+
*/
|
|
13
|
+
showPoints?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* The number of milliseconds of data to hold in memory before dropping it. Defaults to
|
|
16
|
+
* infinity (i.e. no data is dropped)
|
|
17
|
+
*/
|
|
18
|
+
dropDataAfter?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Enables panning (default is false)
|
|
21
|
+
*/
|
|
22
|
+
panEnabled?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Enables zooming (default is false)
|
|
25
|
+
*/
|
|
26
|
+
zoomEnabled?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* When true, requires that the shift or control key be pressed while scrolling
|
|
29
|
+
* in order to activate the zoom
|
|
30
|
+
*/
|
|
31
|
+
zoomKeyModifiersRequired?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* The smallest scale factor allowed for zooming (in). For example, a setting of 0.5 means
|
|
34
|
+
* that the largest zoom amount is 2 times the current size, or put another way, an interval
|
|
35
|
+
* of length 1 unit covers twice as may pixels after the zoom. Effectively, the smaller this
|
|
36
|
+
* factor, the more the user can "zoom in". Default value is 0.0.
|
|
37
|
+
*/
|
|
38
|
+
zoomMinScaleFactor?: number;
|
|
39
|
+
/**
|
|
40
|
+
* The largest scale factor allowed for zooming (out). For example, a setting of 2.0 means
|
|
41
|
+
* that at this value, the length of 1 unit covers 1/2 the number of pixels. Effectively,
|
|
42
|
+
* the larger this factor, the more the user can "zoom out". Default value is 1.0.
|
|
43
|
+
*/
|
|
44
|
+
zoomMaxScaleFactor?: number;
|
|
45
|
+
/**
|
|
46
|
+
* When set, uses a cadence with the specified refresh period (in milliseconds). For plots
|
|
47
|
+
* where the updates are slow (> 100 ms) using a cadence of 10 to 25 ms smooths out the
|
|
48
|
+
* updates and makes the plot updates look cleaner. When updates are around 25 ms or less,
|
|
49
|
+
* then setting the cadence period too small will result in poor update performance. Generally
|
|
50
|
+
* at high update speeds, the cadence is unnecessary. Finally, using cadence, sets the max time
|
|
51
|
+
* to the current time.
|
|
52
|
+
*/
|
|
53
|
+
withCadenceOf?: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Renders a streaming Poincare (iterates) plot for the series in the initial data and those sourced by the
|
|
57
|
+
* observable specified as a property in the {@link Chart}. This component uses the {@link useChart}
|
|
58
|
+
* hook, and therefore must be a child of the {@link Chart} in order to be plugged in to the
|
|
59
|
+
* chart ecosystem (axes, tracker, tooltip).
|
|
60
|
+
*
|
|
61
|
+
* @param props The properties associated with the scatter plot
|
|
62
|
+
* @constructor
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* <ScatterPlot
|
|
66
|
+
* interpolation={interpolation}
|
|
67
|
+
* axisAssignments={new Map([
|
|
68
|
+
* ['test2', assignAxes("x-axis-2", "y-axis-2")],
|
|
69
|
+
* ])}
|
|
70
|
+
* dropDataAfter={10000}
|
|
71
|
+
* panEnabled={true}
|
|
72
|
+
* zoomEnabled={true}
|
|
73
|
+
* zoomKeyModifiersRequired={true}
|
|
74
|
+
* />
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function PoincarePlot(props: Props): null;
|
|
78
|
+
export {};
|
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
3
|
+
import { useChart } from "../hooks/useChart";
|
|
4
|
+
import * as d3 from "d3";
|
|
5
|
+
import { setClipPathG } from "./plot";
|
|
6
|
+
import { axesZoomHandler, defaultLineStyle, panHandler2D } from "../axes/axes";
|
|
7
|
+
import { formatTime, noop, textDimensions } from "../utils";
|
|
8
|
+
import { subscriptionIteratesFor } from "../subscriptions/subscriptions";
|
|
9
|
+
import { useDataObservable } from "../hooks/useDataObservable";
|
|
10
|
+
import { usePlotDimensions } from "../hooks/usePlotDimensions";
|
|
11
|
+
import { useInitialData } from "../hooks/useInitialData";
|
|
12
|
+
import { useTooltip } from "../hooks/useTooltip";
|
|
13
|
+
import { ContinuousAxisRange } from "../axes/ContinuousAxisRange";
|
|
14
|
+
function generateAxisRangeMap(axes) {
|
|
15
|
+
return new Map(Array.from(axes.entries()).map(([id, axis]) => {
|
|
16
|
+
const [start, end] = axis.scale.domain();
|
|
17
|
+
return [id, ContinuousAxisRange.from(start, end)];
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
// A sentinel that represents that no curve factory is to be used, which means
|
|
21
|
+
// that no line will be drawn between the iterates (kinda gross)
|
|
22
|
+
export const NoCurveFactory = undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Renders a streaming Poincare (iterates) plot for the series in the initial data and those sourced by the
|
|
25
|
+
* observable specified as a property in the {@link Chart}. This component uses the {@link useChart}
|
|
26
|
+
* hook, and therefore must be a child of the {@link Chart} in order to be plugged in to the
|
|
27
|
+
* chart ecosystem (axes, tracker, tooltip).
|
|
28
|
+
*
|
|
29
|
+
* @param props The properties associated with the scatter plot
|
|
30
|
+
* @constructor
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* <ScatterPlot
|
|
34
|
+
* interpolation={interpolation}
|
|
35
|
+
* axisAssignments={new Map([
|
|
36
|
+
* ['test2', assignAxes("x-axis-2", "y-axis-2")],
|
|
37
|
+
* ])}
|
|
38
|
+
* dropDataAfter={10000}
|
|
39
|
+
* panEnabled={true}
|
|
40
|
+
* zoomEnabled={true}
|
|
41
|
+
* zoomKeyModifiersRequired={true}
|
|
42
|
+
* />
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export function PoincarePlot(props) {
|
|
46
|
+
const { chartId, container, mainG, axes, backgroundColor, seriesStyles, seriesFilter, mouse } = useChart();
|
|
47
|
+
const { xAxesState, yAxesState, setAxisIntervalFor, updateAxisRanges = noop, axisRangeFor, addAxesRangesUpdateHandler, removeAxesRangesUpdateHandler, } = axes;
|
|
48
|
+
const { mouseOverHandlerFor, mouseLeaveHandlerFor } = mouse;
|
|
49
|
+
const { plotDimensions, margin, } = usePlotDimensions();
|
|
50
|
+
const { seriesObservable, windowingTime = 100, shouldSubscribe, onSubscribe = noop, onUpdateData, onUpdateChartTime = noop, } = useDataObservable();
|
|
51
|
+
const { initialData } = useInitialData();
|
|
52
|
+
const { visibilityState: tooltipVisible } = useTooltip();
|
|
53
|
+
const { interpolation, showPoints = true, dropDataAfter = 1000, panEnabled = false, zoomEnabled = false, zoomKeyModifiersRequired = true, zoomMinScaleFactor = 0, zoomMaxScaleFactor = 1, } = props;
|
|
54
|
+
// why do "dataRef" and "seriesRef" both hold on to the same underlying data? for performance.
|
|
55
|
+
//
|
|
56
|
+
// the "dataRef" and "seriesRef" both point to the same underlying data, a collection
|
|
57
|
+
// of series. The series in "dataRef" are bound to the DOM elements through d3. The "seriesRef" series
|
|
58
|
+
// are the ones that are updated as new data is streamed in.
|
|
59
|
+
//
|
|
60
|
+
// the "dataRef" object holds on to a copy of the initial data (which is an array of
|
|
61
|
+
// time-series, e.i. an array of BaseSeries<OrdinalDatum> objects). The slice just creates a copy of
|
|
62
|
+
// the array, but the references to the BaseSeries objects are the same and still point to the same
|
|
63
|
+
// data as the "initialData" array.
|
|
64
|
+
//
|
|
65
|
+
// the "seriesRef" object is a reference to a map (series_name -> BaseSeries<OrdinalDatum>) which is
|
|
66
|
+
// used to update the data in the series. When new data enters, it is appended to one or more series.
|
|
67
|
+
//
|
|
68
|
+
// the series in the "dataRef" object are the ones bound to the DOM elements in d3, and so as these
|
|
69
|
+
// are updated, d3 will update the DOM elements (the elements in this plot).
|
|
70
|
+
const dataRef = useRef(initialData.slice());
|
|
71
|
+
const seriesRef = useRef(new Map(initialData.map(series => [series.name, series])));
|
|
72
|
+
// map(axis_id -> current_time) -- maps the axis ID to the current time for that axis
|
|
73
|
+
const currentTimeRef = useRef(0);
|
|
74
|
+
const xAxisRangesRef = useRef(new Map());
|
|
75
|
+
const yAxisRangesRef = useRef(new Map());
|
|
76
|
+
const subscriptionRef = useRef(undefined);
|
|
77
|
+
const isSubscriptionClosed = () => subscriptionRef.current === undefined || subscriptionRef.current.closed;
|
|
78
|
+
const allowTooltip = useRef(isSubscriptionClosed());
|
|
79
|
+
// so that we can reset the zoom when the axes-bounds change, we hold on to the zoom-behaviour
|
|
80
|
+
// and the zoom-selection so that we can reset the transform to the identity
|
|
81
|
+
const zoomRef = useRef(undefined);
|
|
82
|
+
const zoomSelectionRef = useRef(undefined);
|
|
83
|
+
// calculates the distinct axis IDs that cover all the series in the plot
|
|
84
|
+
const xAxesForSeries = useMemo(() => xAxesState.axisIds(), [xAxesState]);
|
|
85
|
+
const yAxesForSeries = useMemo(() => yAxesState.axisIds(), [yAxesState]);
|
|
86
|
+
// when the axes are available, then set the reference, but only once
|
|
87
|
+
useEffect(() => {
|
|
88
|
+
if (xAxesState.axes.size > 0 && xAxisRangesRef.current.size === 0) {
|
|
89
|
+
xAxisRangesRef.current = generateAxisRangeMap(xAxesState.axes);
|
|
90
|
+
}
|
|
91
|
+
if (yAxesState.axes.size > 0 && yAxisRangesRef.current.size === 0) {
|
|
92
|
+
yAxisRangesRef.current = generateAxisRangeMap(yAxesState.axes);
|
|
93
|
+
}
|
|
94
|
+
}, [xAxesState, yAxesState]);
|
|
95
|
+
// update the plot with the new axes bounds
|
|
96
|
+
const updateRangesAndPlot = useCallback(() => {
|
|
97
|
+
if (mainG !== null) {
|
|
98
|
+
updatePlotRef.current(mainG);
|
|
99
|
+
}
|
|
100
|
+
}, [mainG]);
|
|
101
|
+
// todo find better way
|
|
102
|
+
// when the initial data changes, then reset the plot. note that the initial data doesn't change
|
|
103
|
+
// during the normal course of updates from the observable, only when the plot is restarted.
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
dataRef.current = initialData.slice();
|
|
106
|
+
seriesRef.current = new Map(initialData.map(series => [series.name, series]));
|
|
107
|
+
currentTimeRef.current = 0;
|
|
108
|
+
updateRangesAndPlot();
|
|
109
|
+
}, [initialData, updateRangesAndPlot]);
|
|
110
|
+
/**
|
|
111
|
+
* When the axes bounds have changed, we need to reset the range references so that
|
|
112
|
+
* the new axis ranges are used
|
|
113
|
+
* @param updates The updates to the axes
|
|
114
|
+
*/
|
|
115
|
+
const updatedBoundsHandler = useCallback((updates) => {
|
|
116
|
+
updates.forEach((update, axisId) => {
|
|
117
|
+
if (xAxisRangesRef.current.has(axisId)) {
|
|
118
|
+
xAxisRangesRef.current.set(axisId, update);
|
|
119
|
+
}
|
|
120
|
+
if (yAxisRangesRef.current.has(axisId)) {
|
|
121
|
+
yAxisRangesRef.current.set(axisId, update);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
if (zoomEnabled && zoomSelectionRef.current !== undefined && zoomRef.current !== undefined) {
|
|
125
|
+
zoomSelectionRef.current.call(zoomRef.current.transform, d3.zoomIdentity);
|
|
126
|
+
}
|
|
127
|
+
}, [zoomEnabled]);
|
|
128
|
+
// strange construct so that we only add the update handler when the chart ID
|
|
129
|
+
// changes, and not when the addAxesBoundsUpdateHandler or removeAxesBoundsUpdateHandler
|
|
130
|
+
// which they do, and that breaks the updates...someone, please teach me react
|
|
131
|
+
//
|
|
132
|
+
// the update handler is needed so that when the axis bounds are changed (say to accommodate a
|
|
133
|
+
// different iterate function's domain/range), then the handler needs to update the x and y
|
|
134
|
+
// axes range refs
|
|
135
|
+
const addAxesBoundsUpdateHandlerRef = useRef(addAxesRangesUpdateHandler);
|
|
136
|
+
const removeAxesBoundsUpdateHandlerRef = useRef(removeAxesRangesUpdateHandler);
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
addAxesBoundsUpdateHandlerRef.current(`handler-${chartId}`, updatedBoundsHandler);
|
|
139
|
+
const removeHandler = removeAxesBoundsUpdateHandlerRef.current;
|
|
140
|
+
return () => {
|
|
141
|
+
// closure on the function to remove the handler from this chart
|
|
142
|
+
removeHandler(`handler-${chartId}`);
|
|
143
|
+
};
|
|
144
|
+
}, [chartId, updatedBoundsHandler]);
|
|
145
|
+
/**
|
|
146
|
+
* Adjusts the time-range and updates the plot when the plot is dragged to the left or right
|
|
147
|
+
* @param x The amount that the plot is dragged
|
|
148
|
+
* @param plotDimensions The dimensions of the plot
|
|
149
|
+
* @param series An array of series names
|
|
150
|
+
* @param ranges A map holding the axis ID and its associated time range
|
|
151
|
+
*/
|
|
152
|
+
const onPan = useCallback((x, y, plotDimensions, series, xRanges, yRanges) => panHandler2D(xAxesForSeries, yAxesForSeries, margin, setAxisIntervalFor, xAxesState, yAxesState)(x, y, plotDimensions, series, xRanges, yRanges), [xAxesForSeries, yAxesForSeries, margin, setAxisIntervalFor, xAxesState, yAxesState]);
|
|
153
|
+
/**
|
|
154
|
+
* Called when the user uses the scroll wheel (or scroll gesture) to zoom in or out. Zooms in/out
|
|
155
|
+
* at the location of the mouse when the scroll wheel or gesture was applied. Unlike time-series
|
|
156
|
+
* plots, the iterates plot zooms the x- and y-axis at the same rate.
|
|
157
|
+
* @param transform The d3 zoom transformation information
|
|
158
|
+
* @param x The x-position of the mouse when the scroll wheel or gesture is used
|
|
159
|
+
* @param y The y-position of the mouse when the scroll wheel or gesture is used
|
|
160
|
+
* @param plotDimensions The dimensions of the plot
|
|
161
|
+
* @param series An array of series names
|
|
162
|
+
* @param ranges A map holding the axis ID and its associated time-range
|
|
163
|
+
*/
|
|
164
|
+
const onZoom = useCallback((transform, x, y, plotDimensions, xRanges, yRanges) => axesZoomHandler(xAxesForSeries, yAxesForSeries, margin, setAxisIntervalFor, xAxesState, yAxesState, [zoomMinScaleFactor, zoomMaxScaleFactor])(transform, [x, y], plotDimensions, xRanges, yRanges), [xAxesForSeries, yAxesForSeries, margin, setAxisIntervalFor, xAxesState, yAxesState, zoomMinScaleFactor, zoomMaxScaleFactor]);
|
|
165
|
+
const updatePlot = useCallback(
|
|
166
|
+
/**
|
|
167
|
+
* Updates the plot data for the specified time-range, which may have changed due to zoom or pan
|
|
168
|
+
* @param mainGElem The main <g> element selection for that holds the plot
|
|
169
|
+
*/
|
|
170
|
+
(mainGElem) => {
|
|
171
|
+
if (container) {
|
|
172
|
+
onUpdateChartTime(currentTimeRef.current);
|
|
173
|
+
// select the svg element bind the data to them
|
|
174
|
+
const svg = d3.select(container);
|
|
175
|
+
// create a map associating series-names to their time-series.
|
|
176
|
+
//
|
|
177
|
+
// performance-related confusion: wondering where the dataRef is updated? well it isn't
|
|
178
|
+
// directly. The dataRef holds on to an array of references to the Series. And so does the
|
|
179
|
+
// seriesRef, though it uses a map(series_name -> series). The seriesRef is used to append
|
|
180
|
+
// data to the underlying Series, and the dataRef is used so that we can just use
|
|
181
|
+
// dataRef.current and don't have to do Array.from(seriesRef.current.values()) which
|
|
182
|
+
// creates a temporary array
|
|
183
|
+
// const offset = 1
|
|
184
|
+
const boundedSeries = new Map(dataRef.current.map(series => {
|
|
185
|
+
return [
|
|
186
|
+
series.name,
|
|
187
|
+
series.data
|
|
188
|
+
.filter(datum => !isNaN(datum.iterateN))
|
|
189
|
+
.map((datum, index) => ({
|
|
190
|
+
n: datum.iterateN,
|
|
191
|
+
n_1: datum.iterateN_1,
|
|
192
|
+
time: datum.time,
|
|
193
|
+
index: index
|
|
194
|
+
}))
|
|
195
|
+
];
|
|
196
|
+
}));
|
|
197
|
+
// set up panning
|
|
198
|
+
if (panEnabled) {
|
|
199
|
+
const drag = d3.drag()
|
|
200
|
+
.on("start", () => {
|
|
201
|
+
d3.select(container).style("cursor", "move");
|
|
202
|
+
// during panning, we need to disable viewing the tooltip to prevent
|
|
203
|
+
// tooltips from rendering but not getting removed
|
|
204
|
+
allowTooltip.current = false;
|
|
205
|
+
})
|
|
206
|
+
.on("drag", event => {
|
|
207
|
+
onPan(event.dx, event.dy, plotDimensions, Array.from(boundedSeries.keys()), xAxisRangesRef.current, yAxisRangesRef.current);
|
|
208
|
+
updatePlotRef.current(mainGElem);
|
|
209
|
+
})
|
|
210
|
+
.on("end", () => {
|
|
211
|
+
d3.select(container).style("cursor", "auto");
|
|
212
|
+
// during panning, we disabled viewing the tooltip to prevent
|
|
213
|
+
// tooltips from rendering but not getting removed, now that panning
|
|
214
|
+
// is over, allow tooltips to render again
|
|
215
|
+
allowTooltip.current = isSubscriptionClosed();
|
|
216
|
+
});
|
|
217
|
+
svg.call(drag);
|
|
218
|
+
}
|
|
219
|
+
// set up for zooming
|
|
220
|
+
if (zoomEnabled) {
|
|
221
|
+
zoomRef.current = d3.zoom()
|
|
222
|
+
.filter(event => !zoomKeyModifiersRequired || event.shiftKey || event.ctrlKey)
|
|
223
|
+
.scaleExtent([zoomMinScaleFactor, zoomMaxScaleFactor])
|
|
224
|
+
.translateExtent([[margin.left, margin.top], [plotDimensions.width, plotDimensions.height]])
|
|
225
|
+
.on("zoom", event => {
|
|
226
|
+
allowTooltip.current = false;
|
|
227
|
+
if (event.sourceEvent !== null) {
|
|
228
|
+
onZoom(event.transform, event.sourceEvent.offsetX - margin.left, event.sourceEvent.offsetY - margin.top, plotDimensions, xAxisRangesRef.current, yAxisRangesRef.current);
|
|
229
|
+
updatePlotRef.current(mainGElem);
|
|
230
|
+
}
|
|
231
|
+
allowTooltip.current = true;
|
|
232
|
+
});
|
|
233
|
+
zoomSelectionRef.current = svg.call(zoomRef.current);
|
|
234
|
+
}
|
|
235
|
+
// define the clip-path so that the series lines don't go beyond the plot area
|
|
236
|
+
const clipPathId = setClipPathG(chartId, mainGElem, plotDimensions);
|
|
237
|
+
// ---
|
|
238
|
+
// todo only want to do this once, on the first plot, and then leave it,
|
|
239
|
+
// unless the axes are updated, also needs to be removed/added when the
|
|
240
|
+
// plot size changes
|
|
241
|
+
const xAxis = xAxesState.defaultAxis().getOrThrow(() => new Error('No default axis found'));
|
|
242
|
+
const yAxis = yAxesState.defaultAxis().getOrThrow(() => new Error('No default axis found'));
|
|
243
|
+
const lineGenerator = d3.line()
|
|
244
|
+
.x(d => xAxis.scale(d[0] || 0))
|
|
245
|
+
.y(d => yAxis.scale(d[1] || 0));
|
|
246
|
+
// ---
|
|
247
|
+
const [xStart, xEnd] = xAxesState.axisDefaultId()
|
|
248
|
+
.map(id => { var _a; return ((_a = xAxisRangesRef.current.get(id)) === null || _a === void 0 ? void 0 : _a.original.asTuple()) || [0, 0]; })
|
|
249
|
+
.getOrElse([0, 0]);
|
|
250
|
+
const [yStart, yEnd] = yAxesState.axisDefaultId()
|
|
251
|
+
.map(id => { var _a; return ((_a = yAxisRangesRef.current.get(id)) === null || _a === void 0 ? void 0 : _a.original.asTuple()) || [0, 0]; })
|
|
252
|
+
.getOrElse([0, 0]);
|
|
253
|
+
// const [xStart, xEnd] = xAxisRangesRef.current.get(xAxesState.axisDefaultId())?.original.asTuple() || [0, 0]
|
|
254
|
+
// const [yStart, yEnd] = yAxisRangesRef.current.get(yAxesState.axisDefaultId())?.original.asTuple() || [0, 0]
|
|
255
|
+
mainGElem
|
|
256
|
+
.selectAll(`#fn-equals-fn1-${chartId}-poincare`)
|
|
257
|
+
.data([[[xStart, yStart], [xEnd, yEnd]]])
|
|
258
|
+
.join(enter => enter
|
|
259
|
+
.select("path")
|
|
260
|
+
.style("stroke", "grey")
|
|
261
|
+
.style("fill", "none")
|
|
262
|
+
.style("stroke-width", "1px")
|
|
263
|
+
.attr("class", `fn-equals-fn1-poincare`)
|
|
264
|
+
.attr("id", `#fn-equals-fn1-${chartId}-poincare`)
|
|
265
|
+
.attr('transform', `translate(${margin.left}, ${margin.top})`)
|
|
266
|
+
.attr("d", lineGenerator), update => update.remove(), exit => exit.remove())
|
|
267
|
+
// clear out mouse-enter callbacks for the diagonal line
|
|
268
|
+
.on("mouseenter", () => {
|
|
269
|
+
})
|
|
270
|
+
.on("mouseleave", () => {
|
|
271
|
+
});
|
|
272
|
+
boundedSeries.forEach((data, name) => {
|
|
273
|
+
// grab the x and y axes assigned to the series, and if either or both
|
|
274
|
+
// axes aren't found, then give up and return
|
|
275
|
+
const [xAxisLinear, yAxisLinear] = axesFor(axisId => xAxesState.axisFor(axisId).getOrUndefined(), axisId => yAxesState.axisFor(axisId).getOrUndefined());
|
|
276
|
+
if (xAxisLinear === undefined || yAxisLinear === undefined)
|
|
277
|
+
return;
|
|
278
|
+
// grab the style for the series
|
|
279
|
+
const seriesLineStyle = seriesStyles.get(name) || Object.assign(Object.assign({}, defaultLineStyle()), { highlightColor: defaultLineStyle().color });
|
|
280
|
+
// only show the data for which the filter matches
|
|
281
|
+
const plotData = (name.match(seriesFilter)) ? data : [];
|
|
282
|
+
const pathGenerator = d3.line()
|
|
283
|
+
.x(d => xAxis.scale(d.n || 0))
|
|
284
|
+
.y(d => yAxis.scale(d.n_1 || 0));
|
|
285
|
+
if (interpolation === undefined) {
|
|
286
|
+
mainGElem
|
|
287
|
+
.selectAll(`#${name}-${chartId}-poincare`)
|
|
288
|
+
.remove();
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
// create the time-series paths
|
|
292
|
+
mainGElem
|
|
293
|
+
.selectAll(`#${name}-${chartId}-poincare`)
|
|
294
|
+
.data([[], plotData], () => `${name}`)
|
|
295
|
+
.join(enter => enter
|
|
296
|
+
.append("path")
|
|
297
|
+
.attr("class", 'iterate-series-lines')
|
|
298
|
+
.attr("id", `${name}-${chartId}-poincare`)
|
|
299
|
+
.attr("d", pathGenerator.curve(interpolation))
|
|
300
|
+
.style("fill", "none")
|
|
301
|
+
.style("stroke", seriesLineStyle.color)
|
|
302
|
+
.style("stroke-width", seriesLineStyle.lineWidth)
|
|
303
|
+
.attr('transform', `translate(${margin.left}, ${margin.top})`)
|
|
304
|
+
.attr("clip-path", `url(#${clipPathId})`), update => update, exit => exit.remove());
|
|
305
|
+
}
|
|
306
|
+
// when specified, show a circle for the actual data point
|
|
307
|
+
if (showPoints) {
|
|
308
|
+
mainGElem
|
|
309
|
+
.selectAll(`.${name}-${chartId}-poincare-points`)
|
|
310
|
+
.data(plotData, () => `${name}`)
|
|
311
|
+
.join(enter => enter
|
|
312
|
+
.append("circle")
|
|
313
|
+
.attr("class", `${name}-${chartId}-poincare-points`)
|
|
314
|
+
.attr("id", (_, index) => `${name}-${chartId}-poincare-point-${index}`)
|
|
315
|
+
.attr("fill", seriesLineStyle.color)
|
|
316
|
+
.attr("stroke", "none")
|
|
317
|
+
.attr("cx", (d) => xAxisLinear.scale(d.n) || 0)
|
|
318
|
+
.attr("cy", (d) => yAxisLinear.scale(d.n_1) || 0)
|
|
319
|
+
.attr("r", 2)
|
|
320
|
+
.attr('transform', `translate(${margin.left}, ${margin.top})`)
|
|
321
|
+
.attr("clip-path", `url(#${clipPathId})`), update => update
|
|
322
|
+
.attr("cx", (d) => xAxisLinear.scale(d.n) || 0)
|
|
323
|
+
.attr("cy", (d) => yAxisLinear.scale(d.n_1) || 0), exit => exit.remove())
|
|
324
|
+
.on("mouseenter", (event, datum) => {
|
|
325
|
+
if (allowTooltip.current && tooltipVisible) {
|
|
326
|
+
return handleMouseEnterPoint(chartId, name, container, event, datum, plotData, xAxisLinear, yAxisLinear, margin, seriesLineStyle, backgroundColor, allowTooltip.current, mouseOverHandlerFor(`tooltip-${chartId}`));
|
|
327
|
+
}
|
|
328
|
+
return _jsx(_Fragment, {});
|
|
329
|
+
})
|
|
330
|
+
.on("mouseleave", () => {
|
|
331
|
+
handleMouseLeavePoint(chartId, name, seriesLineStyle.color, mouseLeaveHandlerFor(`tooltip-${chartId}`));
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}, [
|
|
337
|
+
container, onUpdateChartTime, panEnabled, zoomEnabled, chartId, plotDimensions, margin,
|
|
338
|
+
xAxesState, yAxesState,
|
|
339
|
+
onPan,
|
|
340
|
+
zoomMinScaleFactor, zoomMaxScaleFactor, zoomKeyModifiersRequired, onZoom,
|
|
341
|
+
seriesStyles, seriesFilter, showPoints,
|
|
342
|
+
interpolation, backgroundColor,
|
|
343
|
+
mouseOverHandlerFor, mouseLeaveHandlerFor,
|
|
344
|
+
tooltipVisible,
|
|
345
|
+
]);
|
|
346
|
+
// need to keep the function references for use by the subscription, which forms a closure
|
|
347
|
+
// on them. without the references, the closures become stale, and resizing during streaming
|
|
348
|
+
// doesn't work properly
|
|
349
|
+
const updatePlotRef = useRef(updatePlot);
|
|
350
|
+
useEffect(() => {
|
|
351
|
+
updatePlotRef.current = updatePlot;
|
|
352
|
+
}, [updatePlot]);
|
|
353
|
+
const onUpdateAxesBoundsRef = useRef(updateAxisRanges);
|
|
354
|
+
useEffect(() => {
|
|
355
|
+
onUpdateAxesBoundsRef.current = updateAxisRanges;
|
|
356
|
+
}, [updateAxisRanges]);
|
|
357
|
+
// memoized function for subscribing to the chart-data observable
|
|
358
|
+
const subscribe = useCallback(() => {
|
|
359
|
+
if (seriesObservable === undefined || mainG === null)
|
|
360
|
+
return undefined;
|
|
361
|
+
return subscriptionIteratesFor(seriesObservable, onSubscribe, windowingTime, xAxesState, yAxesState, onUpdateData, dropDataAfter, updateRangesAndPlot,
|
|
362
|
+
// as new data flows into the subscription, the subscription
|
|
363
|
+
// updates this map directly (for performance)
|
|
364
|
+
seriesRef.current, end => currentTimeRef.current = end);
|
|
365
|
+
}, [
|
|
366
|
+
dropDataAfter, mainG,
|
|
367
|
+
onSubscribe, onUpdateData,
|
|
368
|
+
seriesObservable, updateRangesAndPlot, windowingTime,
|
|
369
|
+
xAxesState, yAxesState,
|
|
370
|
+
]);
|
|
371
|
+
// updates the plot when the interpolation and filter change, because the updatePlot
|
|
372
|
+
// callback has changed.
|
|
373
|
+
useEffect(() => {
|
|
374
|
+
if (container && mainG) {
|
|
375
|
+
updatePlot(mainG);
|
|
376
|
+
}
|
|
377
|
+
}, [axisRangeFor, container, mainG, updatePlot]);
|
|
378
|
+
// subscribe/unsubscribe to the observable chart data. when the `shouldSubscribe`
|
|
379
|
+
// is changed to `true` and we haven't subscribed yet, then subscribe. when the
|
|
380
|
+
// `shouldSubscribe` is `false` and we had subscribed, then unsubscribe. otherwise,
|
|
381
|
+
// do nothing.
|
|
382
|
+
useEffect(() => {
|
|
383
|
+
var _a;
|
|
384
|
+
if (shouldSubscribe && subscriptionRef.current === undefined) {
|
|
385
|
+
subscriptionRef.current = subscribe();
|
|
386
|
+
allowTooltip.current = false;
|
|
387
|
+
}
|
|
388
|
+
else if (!shouldSubscribe && subscriptionRef.current !== undefined) {
|
|
389
|
+
(_a = subscriptionRef.current) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
390
|
+
subscriptionRef.current = undefined;
|
|
391
|
+
allowTooltip.current = true;
|
|
392
|
+
}
|
|
393
|
+
}, [shouldSubscribe, subscribe]);
|
|
394
|
+
return null;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Attempts to locate the x- and y-axes for the specified series. If no axis is found for the
|
|
398
|
+
* series name, then uses the default returned by the useChart() hook
|
|
399
|
+
* @param xAxisFor The function that accepts an axis ID and returns the corresponding x-axis
|
|
400
|
+
* @param yAxisFor The function that accepts an axis ID and returns the corresponding y-axis
|
|
401
|
+
*/
|
|
402
|
+
function axesFor(xAxisFor, yAxisFor) {
|
|
403
|
+
const xAxis = xAxisFor("");
|
|
404
|
+
const xAxisLinear = xAxis;
|
|
405
|
+
const yAxis = yAxisFor("");
|
|
406
|
+
const yAxisLinear = yAxis;
|
|
407
|
+
if (xAxis && !xAxisLinear) {
|
|
408
|
+
throw Error("Poincare plot requires that x-axis be of type LinearAxis");
|
|
409
|
+
}
|
|
410
|
+
if (yAxis && !yAxisLinear) {
|
|
411
|
+
throw Error("Poincare plot requires that y-axis be of type LinearAxis");
|
|
412
|
+
}
|
|
413
|
+
return [xAxisLinear, yAxisLinear];
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* @param chartId The ID of the chart
|
|
417
|
+
* @param seriesName The name of the series (i.e. the neuron ID)
|
|
418
|
+
* @param container The SVG container holding the plot
|
|
419
|
+
* @param event The mouse event that triggered this call
|
|
420
|
+
* @param datum The datum over which the mouse has entered
|
|
421
|
+
* @param plotData The iterates series
|
|
422
|
+
* @param xAxisLinear The x-axis (f[n](x))
|
|
423
|
+
* @param yAxisLinear The y-axis (f[n+1](x))
|
|
424
|
+
* @param margin The plot margin
|
|
425
|
+
* @param seriesStyle The series style information (needed for (un)highlighting)
|
|
426
|
+
* @param backgroundColor
|
|
427
|
+
* @param allowTooltip When set to `false` won't show tooltip, even if it is visible (used by pan)
|
|
428
|
+
* @param mouseOverHandlerFor The handler for the mouse-over (registered by the <Tooltip/>)
|
|
429
|
+
*/
|
|
430
|
+
function handleMouseEnterPoint(chartId, seriesName, container, event, datum, plotData, xAxisLinear, yAxisLinear, margin, seriesStyle, backgroundColor, allowTooltip, mouseOverHandlerFor) {
|
|
431
|
+
const { color, highlightColor, lineWidth } = seriesStyle;
|
|
432
|
+
const padding = 4;
|
|
433
|
+
const circleRadius = 5;
|
|
434
|
+
const circleStroke = lineWidth;
|
|
435
|
+
const circle = event.currentTarget;
|
|
436
|
+
d3.select(circle)
|
|
437
|
+
.attr("r", circleRadius)
|
|
438
|
+
.style("fill", highlightColor);
|
|
439
|
+
const index = plotData
|
|
440
|
+
.findIndex(point => point.n === datum.n && point.n_1 === datum.n_1);
|
|
441
|
+
/**
|
|
442
|
+
* Displays basic information about an iterate, generally its neighbors
|
|
443
|
+
* @param index The index of the iterate
|
|
444
|
+
*/
|
|
445
|
+
function showInfo(index) {
|
|
446
|
+
d3.select(`#${seriesName}-${chartId}-poincare-point-${index}`)
|
|
447
|
+
.attr("r", circleRadius)
|
|
448
|
+
.style("fill", d3.rgb(highlightColor).brighter(0.7).toString())
|
|
449
|
+
.style("stroke-width", circleStroke)
|
|
450
|
+
.style("stroke", color);
|
|
451
|
+
// grab the (x, y)-coordinates for the plot
|
|
452
|
+
const iterateN = xAxisLinear.scale(plotData[index].n) + margin.left;
|
|
453
|
+
const iterateN_1 = yAxisLinear.scale(plotData[index].n_1) + margin.top;
|
|
454
|
+
const svg = d3.select(container);
|
|
455
|
+
// add a rectangle that serves as the background for the text (to make the
|
|
456
|
+
// text readable when the chart is busy)
|
|
457
|
+
const rect = svg
|
|
458
|
+
.append("rect")
|
|
459
|
+
.attr("class", `${seriesName}-${chartId}-poincare-point-text-background`);
|
|
460
|
+
// add the information about the iterate as a text element
|
|
461
|
+
const textElement = svg
|
|
462
|
+
.append("text")
|
|
463
|
+
.attr('class', `${seriesName}-${chartId}-poincare-point-text`)
|
|
464
|
+
.attr('fill', highlightColor)
|
|
465
|
+
.attr('font-family', 'sans-serif')
|
|
466
|
+
.attr('font-size', 11)
|
|
467
|
+
.attr('font-weight', 700)
|
|
468
|
+
.text(`n = ${index}; t = ${formatTime(plotData[index].time)} ms`);
|
|
469
|
+
// calculate the width and height of the text element
|
|
470
|
+
const { width, height } = textDimensions(textElement);
|
|
471
|
+
textElement
|
|
472
|
+
.attr("transform", `translate(${iterateN - 8}, ${iterateN_1 - circleRadius - circleStroke - padding})`);
|
|
473
|
+
rect
|
|
474
|
+
.attr("x", iterateN - padding / 2 - 8)
|
|
475
|
+
.attr("y", iterateN_1 - padding / 2 - circleRadius - circleStroke - height)
|
|
476
|
+
.attr("width", width + padding)
|
|
477
|
+
.attr("height", height + padding / 2)
|
|
478
|
+
.style("fill", backgroundColor);
|
|
479
|
+
}
|
|
480
|
+
if (index > 0) {
|
|
481
|
+
showInfo(index - 1);
|
|
482
|
+
}
|
|
483
|
+
if (index < plotData.length - 1) {
|
|
484
|
+
showInfo(index + 1);
|
|
485
|
+
}
|
|
486
|
+
const [x, y] = d3.pointer(event, container);
|
|
487
|
+
const currentDatum = (index >= 0) ? plotData[index] : { time: 0, n: 0, n_1: 0, index };
|
|
488
|
+
if (mouseOverHandlerFor && allowTooltip) {
|
|
489
|
+
mouseOverHandlerFor(seriesName, currentDatum.time, { series: plotData.map(ip => ({ iterateN: ip.n, iterateN_1: ip.n_1, time: ip.time })), metadata: {} }, [x, y]);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
function handleMouseLeavePoint(chartId, seriesName, color, mouseLeaverHandlerFor) {
|
|
493
|
+
d3.selectAll(`.${seriesName}-${chartId}-poincare-points`)
|
|
494
|
+
.attr("r", 2)
|
|
495
|
+
.style("fill", color)
|
|
496
|
+
.style("stroke", "none");
|
|
497
|
+
d3.selectAll(`.${seriesName}-${chartId}-poincare-point-arrows`).remove();
|
|
498
|
+
d3.selectAll(`.${seriesName}-${chartId}-poincare-point-text`).remove();
|
|
499
|
+
d3.selectAll(`.${seriesName}-${chartId}-poincare-point-text-background`).remove();
|
|
500
|
+
if (mouseLeaverHandlerFor) {
|
|
501
|
+
mouseLeaverHandlerFor(seriesName);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
//# sourceMappingURL=PoincarePlot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PoincarePlot.js","sourceRoot":"","sources":["../../../../../src/app/charts/plots/PoincarePlot.tsx"],"names":[],"mappings":"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"}
|