highcharts 9.2.2 → 9.3.3
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 +13 -6
- package/bower.json +1 -1
- package/css/annotations/popup.css +48 -8
- package/css/annotations/popup.scss +70 -22
- package/css/highcharts.css +46 -1
- package/css/highcharts.scss +40 -0
- package/css/stocktools/gui.css +1 -1
- package/css/themes/dark-unica.css +46 -1
- package/css/themes/grid-light.css +46 -1
- package/css/themes/sand-signika.css +46 -1
- package/es-modules/Accessibility/A11yI18n.js +269 -224
- package/es-modules/Accessibility/Accessibility.js +244 -129
- package/es-modules/Accessibility/AccessibilityComponent.js +78 -313
- package/es-modules/Accessibility/Components/AnnotationsA11y.js +19 -5
- package/es-modules/Accessibility/Components/ContainerComponent.js +53 -28
- package/es-modules/Accessibility/Components/InfoRegionsComponent.js +178 -120
- package/es-modules/Accessibility/Components/LegendComponent.js +251 -129
- package/es-modules/Accessibility/Components/MenuComponent.js +250 -154
- package/es-modules/Accessibility/Components/RangeSelectorComponent.js +172 -93
- package/es-modules/Accessibility/Components/SeriesComponent/ForcedMarkers.js +161 -115
- package/es-modules/Accessibility/Components/SeriesComponent/NewDataAnnouncer.js +138 -69
- package/es-modules/Accessibility/Components/SeriesComponent/SeriesComponent.js +67 -28
- package/es-modules/Accessibility/Components/SeriesComponent/SeriesDescriber.js +48 -56
- package/es-modules/Accessibility/Components/SeriesComponent/SeriesKeyboardNavigation.js +387 -343
- package/es-modules/Accessibility/Components/ZoomComponent.js +156 -70
- package/es-modules/Accessibility/FocusBorder.js +192 -152
- package/es-modules/Accessibility/HighContrastMode.js +79 -66
- package/es-modules/Accessibility/HighContrastTheme.js +10 -0
- package/es-modules/Accessibility/KeyboardNavigation.js +151 -75
- package/es-modules/Accessibility/KeyboardNavigationHandler.js +71 -44
- package/es-modules/Accessibility/Options/DeprecatedOptions.js +21 -4
- package/es-modules/Accessibility/Options/LangOptions.js +4 -5
- package/es-modules/Accessibility/Options/Options.js +32 -17
- package/es-modules/Accessibility/ProxyElement.js +218 -0
- package/es-modules/Accessibility/ProxyProvider.js +302 -0
- package/es-modules/Accessibility/Utils/Announcer.js +17 -10
- package/es-modules/Accessibility/Utils/ChartUtilities.js +55 -45
- package/es-modules/Accessibility/Utils/DOMElementProvider.js +27 -15
- package/es-modules/Accessibility/Utils/EventProvider.js +27 -17
- package/es-modules/Accessibility/Utils/HTMLUtilities.js +125 -42
- package/es-modules/Core/Animation/Fx.js +5 -14
- package/es-modules/Core/Axis/Axis.js +77 -96
- package/es-modules/Core/Axis/Axis3D.js +10 -4
- package/es-modules/Core/Axis/AxisDefaults.js +35 -24
- package/es-modules/Core/Axis/BrokenAxis.js +17 -11
- package/es-modules/Core/Axis/Color/ColorAxis.js +7 -4
- package/es-modules/Core/Axis/Color/ColorAxisComposition.js +55 -5
- package/es-modules/Core/Axis/Color/ColorAxisDefaults.js +5 -5
- package/es-modules/Core/Axis/DateTimeAxis.js +3 -14
- package/es-modules/Core/Axis/GridAxis.js +26 -16
- package/es-modules/Core/Axis/NavigatorAxis.js +0 -5
- package/es-modules/Core/Axis/OrdinalAxis.js +88 -92
- package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBand.js +4 -5
- package/es-modules/Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js +0 -5
- package/es-modules/Core/Axis/RadialAxis.js +7 -28
- package/es-modules/Core/Axis/ScrollbarAxis.js +27 -12
- package/es-modules/Core/Axis/StackingAxis.js +2 -1
- package/es-modules/Core/Axis/Tick.js +2 -4
- package/es-modules/Core/Axis/TreeGridAxis.js +28 -19
- package/es-modules/Core/Axis/TreeGridTick.js +5 -3
- package/es-modules/Core/Axis/WaterfallAxis.js +1 -1
- package/es-modules/Core/Axis/ZAxis.js +1 -1
- package/es-modules/Core/Chart/Chart.js +44 -47
- package/es-modules/Core/Chart/Chart3D.js +23 -10
- package/es-modules/Core/Chart/ChartDefaults.js +3 -4
- package/es-modules/Core/Chart/ChartNavigationComposition.js +92 -0
- package/es-modules/Core/Chart/GanttChart.js +4 -4
- package/es-modules/Core/Chart/MapChart.js +13 -25
- package/es-modules/Core/Chart/StockChart.js +13 -316
- package/es-modules/Core/Color/Palettes.js +22 -0
- package/es-modules/Core/DefaultOptions.js +22 -19
- package/es-modules/Core/Foundation.js +39 -31
- package/es-modules/Core/Geometry/CircleUtilities.js +2 -1
- package/es-modules/Core/Globals.js +1 -1
- package/es-modules/Core/HttpUtilities.js +8 -7
- package/es-modules/Core/Legend/Legend.js +19 -16
- package/es-modules/Core/Navigator.js +41 -30
- package/es-modules/Core/Pointer.js +52 -45
- package/es-modules/Core/Renderer/HTML/AST.js +29 -14
- package/es-modules/Core/Renderer/HTML/HTMLElement.js +27 -20
- package/es-modules/Core/Renderer/HTML/HTMLRenderer.js +8 -6
- package/es-modules/Core/Renderer/RendererUtilities.js +2 -2
- package/es-modules/Core/Renderer/SVG/SVGElement.js +11 -20
- package/es-modules/Core/Renderer/SVG/SVGLabel.js +17 -8
- package/es-modules/Core/Renderer/SVG/SVGRenderer.js +25 -29
- package/es-modules/Core/Renderer/SVG/SVGRenderer3D.js +12 -5
- package/es-modules/Core/Renderer/SVG/TextBuilder.js +18 -12
- package/es-modules/Core/Responsive.js +2 -3
- package/es-modules/Core/Scrollbar.js +14 -12
- package/es-modules/Core/ScrollbarDefaults.js +10 -9
- package/es-modules/Core/Series/DataLabel.js +19 -15
- package/es-modules/Core/Series/Point.js +22 -19
- package/es-modules/Core/Series/Series.js +197 -235
- package/es-modules/Core/Series/SeriesDefaults.js +8 -8
- package/es-modules/Core/Series/SeriesRegistry.js +1 -2
- package/es-modules/Core/Time.js +14 -11
- package/es-modules/Core/Tooltip.js +63 -53
- package/es-modules/Core/Utilities.js +20 -24
- package/es-modules/Data/DataConverter.js +483 -0
- package/es-modules/Data/DataPromise.js +252 -0
- package/es-modules/Data/DataSeriesConverter.js +207 -0
- package/es-modules/Data/DataTable.js +1205 -0
- package/es-modules/Data/Modifiers/ChainModifier.js +299 -0
- package/es-modules/Data/Modifiers/DataModifier.js +303 -0
- package/es-modules/Data/Modifiers/GroupModifier.js +144 -0
- package/es-modules/Data/Modifiers/InvertModifier.js +254 -0
- package/es-modules/Data/Modifiers/RangeModifier.js +143 -0
- package/es-modules/Data/Modifiers/SeriesPointsModifier.js +110 -0
- package/es-modules/Data/Modifiers/SortModifier.js +249 -0
- package/es-modules/Data/Parsers/CSVParser.js +400 -0
- package/es-modules/Data/Parsers/DataParser.js +101 -0
- package/es-modules/Data/Parsers/GoogleSheetsParser.js +223 -0
- package/es-modules/Data/Parsers/HTMLTableParser.js +213 -0
- package/es-modules/Data/Stores/CSVStore.js +317 -0
- package/es-modules/Data/Stores/DataStore.js +276 -0
- package/es-modules/Data/Stores/GoogleSheetsStore.js +169 -0
- package/es-modules/Data/Stores/HTMLTableStore.js +353 -0
- package/es-modules/Extensions/Annotations/Annotations.js +69 -18
- package/es-modules/Extensions/Annotations/ControlPoint.js +1 -3
- package/es-modules/Extensions/Annotations/Controllables/ControllableCircle.js +1 -1
- package/es-modules/Extensions/Annotations/Controllables/ControllableEllipse.js +199 -0
- package/es-modules/Extensions/Annotations/Controllables/ControllableImage.js +1 -1
- package/es-modules/Extensions/Annotations/Controllables/ControllableLabel.js +3 -6
- package/es-modules/Extensions/Annotations/Controllables/ControllablePath.js +3 -2
- package/es-modules/Extensions/Annotations/Controllables/ControllableRect.js +1 -1
- package/es-modules/Extensions/Annotations/Mixins/ControllableMixin.js +13 -4
- package/es-modules/Extensions/Annotations/Mixins/EventEmitterMixin.js +0 -1
- package/es-modules/Extensions/Annotations/Mixins/MarkerMixin.js +5 -4
- package/es-modules/Extensions/Annotations/NavigationBindings.js +120 -53
- package/es-modules/Extensions/Annotations/Popup.js +494 -148
- package/es-modules/Extensions/Annotations/Types/BasicAnnotation.js +51 -2
- package/es-modules/Extensions/Annotations/Types/CrookedLine.js +5 -3
- package/es-modules/Extensions/Annotations/Types/ElliottWave.js +1 -1
- package/es-modules/Extensions/Annotations/Types/Fibonacci.js +2 -3
- package/es-modules/Extensions/Annotations/Types/FibonacciTimeZones.js +219 -0
- package/es-modules/Extensions/Annotations/Types/InfinityLine.js +1 -1
- package/es-modules/Extensions/Annotations/Types/Measure.js +29 -19
- package/es-modules/Extensions/Annotations/Types/Pitchfork.js +7 -6
- package/es-modules/Extensions/Annotations/Types/TimeCycles.js +211 -0
- package/es-modules/Extensions/Annotations/Types/Tunnel.js +13 -10
- package/es-modules/Extensions/Annotations/Types/VerticalLine.js +1 -1
- package/es-modules/Extensions/Boost/BoostOptions.js +2 -2
- package/es-modules/Extensions/Boost/BoostOverrides.js +6 -10
- package/es-modules/Extensions/Boost/BoostUtils.js +0 -6
- package/es-modules/Extensions/Boost/WGLRenderer.js +16 -12
- package/es-modules/Extensions/Boost/WGLShader.js +13 -11
- package/es-modules/Extensions/Boost/WGLVBuffer.js +4 -7
- package/es-modules/Extensions/BoostCanvas.js +1 -2
- package/es-modules/Extensions/CurrentDateIndication.js +2 -3
- package/es-modules/Extensions/Data.js +4 -48
- package/es-modules/Extensions/DataGrouping.js +52 -32
- package/es-modules/Extensions/DownloadURL.js +2 -2
- package/es-modules/Extensions/DragPanes.js +1 -2
- package/es-modules/Extensions/DraggablePoints.js +7 -8
- package/es-modules/Extensions/Drilldown.js +11 -7
- package/es-modules/Extensions/ExportData.js +6 -5
- package/es-modules/Extensions/Exporting/Exporting.js +33 -46
- package/es-modules/Extensions/Exporting/ExportingDefaults.js +8 -15
- package/es-modules/Extensions/FullScreen.js +4 -3
- package/es-modules/Extensions/GeoJSON.js +42 -66
- package/es-modules/Extensions/MarkerClusters.js +118 -98
- package/es-modules/Extensions/Math3D.js +4 -4
- package/es-modules/Extensions/NoDataToDisplay.js +1 -2
- package/es-modules/Extensions/OfflineExporting/OfflineExporting.js +32 -32
- package/es-modules/Extensions/OfflineExporting/OfflineExportingDefaults.js +1 -1
- package/es-modules/Extensions/Oldie/Oldie.js +14 -79
- package/es-modules/Extensions/Oldie/VMLAxis3D.js +5 -1
- package/es-modules/Extensions/OverlappingDataLabels.js +10 -6
- package/es-modules/Extensions/Pane.js +11 -12
- package/es-modules/Extensions/ParallelCoordinates.js +5 -3
- package/es-modules/Extensions/PatternFill.js +17 -11
- package/es-modules/Extensions/Polar.js +7 -4
- package/es-modules/Extensions/PriceIndication.js +2 -1
- package/es-modules/Extensions/RangeSelector.js +22 -59
- package/es-modules/Extensions/ScrollablePlotArea.js +2 -2
- package/es-modules/Extensions/SeriesLabel.js +1 -1
- package/es-modules/Extensions/Sonification/ChartSonify.js +279 -663
- package/es-modules/Extensions/Sonification/Earcon.js +136 -102
- package/es-modules/Extensions/Sonification/Instrument.js +493 -426
- package/es-modules/Extensions/Sonification/MusicalFrequencies.js +10 -0
- package/es-modules/Extensions/Sonification/Options.js +10 -0
- package/es-modules/Extensions/Sonification/PointSonify.js +207 -152
- package/es-modules/Extensions/Sonification/SeriesSonify.js +474 -0
- package/es-modules/Extensions/Sonification/SignalHandler.js +122 -0
- package/es-modules/Extensions/Sonification/Sonification.js +27 -53
- package/es-modules/Extensions/Sonification/{Utilities.js → SonificationUtilities.js} +70 -88
- package/es-modules/Extensions/Sonification/Timeline.js +250 -567
- package/es-modules/Extensions/Sonification/TimelineEvent.js +157 -0
- package/es-modules/Extensions/Sonification/TimelinePath.js +311 -0
- package/es-modules/Extensions/Stacking.js +5 -23
- package/es-modules/Extensions/Themes/BrandDark.js +293 -0
- package/es-modules/Extensions/Themes/BrandLight.js +259 -0
- package/es-modules/Extensions/Themes/DarkUnica.js +4 -2
- package/es-modules/Extensions/Themes/Grid.js +4 -2
- package/es-modules/Extensions/Themes/GridLight.js +4 -2
- package/es-modules/Gantt/Connection.js +2 -2
- package/es-modules/Gantt/Pathfinder.js +6 -5
- package/es-modules/Gantt/PathfinderAlgorithms.js +12 -12
- package/es-modules/Maps/MapNavigation.js +30 -68
- package/es-modules/Maps/MapNavigationOptionsDefault.js +3 -0
- package/es-modules/Maps/MapPointer.js +8 -5
- package/es-modules/Maps/MapSymbols.js +23 -3
- package/es-modules/Maps/MapView.js +450 -0
- package/es-modules/Maps/MapViewOptionsDefault.js +97 -0
- package/es-modules/Maps/Projection.js +436 -0
- package/es-modules/Maps/ProjectionDefinition.js +9 -0
- package/es-modules/Maps/Projections/EqualEarth.js +42 -0
- package/es-modules/Maps/Projections/LambertConformalConic.js +52 -0
- package/es-modules/Maps/Projections/Miller.js +16 -0
- package/es-modules/Maps/Projections/Orthographic.js +26 -0
- package/es-modules/Maps/Projections/ProjectionRegistry.js +19 -0
- package/es-modules/Maps/Projections/WebMercator.js +24 -0
- package/es-modules/Series/Area/AreaSeries.js +13 -13
- package/es-modules/Series/Area3DSeries.js +4 -2
- package/es-modules/Series/AreaRange/AreaRangeSeries.js +28 -17
- package/es-modules/Series/Bellcurve/BellcurveSeries.js +4 -9
- package/es-modules/Series/BoxPlot/BoxPlotSeries.js +1 -2
- package/es-modules/Series/Bubble/BubbleLegendDefaults.js +1 -2
- package/es-modules/Series/Bubble/BubbleLegendItem.js +5 -15
- package/es-modules/Series/Bubble/BubblePoint.js +5 -0
- package/es-modules/Series/Bubble/BubbleSeries.js +90 -50
- package/es-modules/Series/Candlestick/CandlestickSeries.js +10 -19
- package/es-modules/{Mixins/CenteredSeries.js → Series/CenteredUtilities.js} +45 -23
- package/es-modules/{Mixins/ColorMapSeries.js → Series/ColorMapMixin.js} +10 -8
- package/es-modules/Series/Column/ColumnDataLabel.js +5 -5
- package/es-modules/Series/Column/ColumnSeries.js +19 -18
- package/es-modules/Series/Column3D/Column3DComposition.js +1 -2
- package/es-modules/Series/ColumnPyramid/ColumnPyramidSeries.js +11 -8
- package/es-modules/Series/ColumnRange/ColumnRangeSeries.js +2 -1
- package/es-modules/Series/Cylinder/CylinderComposition.js +36 -4
- package/es-modules/Series/DataModifyComposition.js +539 -0
- package/es-modules/Series/DependencyWheel/DependencyWheelPoint.js +2 -6
- package/es-modules/Series/DependencyWheel/DependencyWheelSeries.js +1 -1
- package/es-modules/Series/DerivedComposition.js +137 -0
- package/es-modules/Series/DrawPointComposition.js +111 -0
- package/es-modules/Series/Dumbbell/DumbbellPoint.js +0 -1
- package/es-modules/Series/Dumbbell/DumbbellSeries.js +2 -6
- package/es-modules/Series/ErrorBar/ErrorBarSeries.js +1 -2
- package/es-modules/Series/Flags/FlagsSeries.js +18 -25
- package/es-modules/Series/Flags/FlagsSymbols.js +2 -2
- package/es-modules/Series/Funnel/FunnelSeries.js +6 -5
- package/es-modules/Series/Funnel3D/Funnel3DComposition.js +14 -8
- package/es-modules/Series/Funnel3D/Funnel3DSeries.js +2 -1
- package/es-modules/Series/Gantt/GanttPoint.js +1 -1
- package/es-modules/Series/Gantt/GanttSeries.js +3 -3
- package/es-modules/Series/Gauge/GaugePoint.js +1 -1
- package/es-modules/Series/Gauge/GaugeSeries.js +7 -7
- package/es-modules/Series/HLC/HLCPoint.js +55 -0
- package/es-modules/Series/HLC/HLCSeries.js +378 -0
- package/es-modules/Series/Heatmap/HeatmapPoint.js +13 -14
- package/es-modules/Series/Heatmap/HeatmapSeries.js +24 -12
- package/es-modules/Series/HeikinAshi/HeikinAshiSeries.js +10 -9
- package/es-modules/Series/Histogram/HistogramSeries.js +7 -11
- package/es-modules/Series/HollowCandlestick/HollowCandlestickPoint.js +1 -4
- package/es-modules/Series/HollowCandlestick/HollowCandlestickSeries.js +28 -30
- package/es-modules/Series/Item/ItemSeries.js +4 -5
- package/es-modules/Series/Line/LineSeries.js +1 -2
- package/es-modules/Series/Map/MapPoint.js +27 -14
- package/es-modules/Series/Map/MapSeries.js +283 -322
- package/es-modules/Series/MapBubble/MapBubblePoint.js +0 -3
- package/es-modules/Series/MapBubble/MapBubbleSeries.js +10 -1
- package/es-modules/Series/MapLine/MapLineSeries.js +2 -4
- package/es-modules/Series/MapPoint/MapPointPoint.js +5 -1
- package/es-modules/Series/MapPoint/MapPointSeries.js +99 -14
- package/es-modules/Series/Networkgraph/DraggableNodes.js +0 -4
- package/es-modules/Series/Networkgraph/Integrations.js +8 -22
- package/es-modules/Series/Networkgraph/Networkgraph.js +6 -10
- package/es-modules/Series/Networkgraph/QuadTree.js +1 -3
- package/es-modules/{Mixins/Nodes.js → Series/NodesComposition.js} +78 -30
- package/es-modules/Series/OHLC/OHLCPoint.js +2 -7
- package/es-modules/Series/OHLC/OHLCSeries.js +55 -183
- package/es-modules/{Mixins/OnSeries.js → Series/OnSeriesComposition.js} +53 -21
- package/es-modules/Series/Organization/OrganizationSeries.js +6 -5
- package/es-modules/Series/PackedBubble/PackedBubbleComposition.js +1 -0
- package/es-modules/Series/PackedBubble/PackedBubblePoint.js +1 -1
- package/es-modules/Series/PackedBubble/PackedBubbleSeries.js +48 -10
- package/es-modules/Series/ParetoSeries/ParetoSeries.js +3 -7
- package/es-modules/Series/Pie/PieDataLabel.js +1 -2
- package/es-modules/Series/Pie/PiePoint.js +2 -2
- package/es-modules/Series/Pie/PieSeries.js +7 -8
- package/es-modules/Series/Pie3D/Pie3DComposition.js +2 -1
- package/es-modules/Series/Pie3D/Pie3DPoint.js +2 -1
- package/es-modules/Series/Pie3D/Pie3DSeries.js +1 -1
- package/es-modules/Series/Pyramid3D/Pyramid3DSeries.js +2 -1
- package/es-modules/Series/Sankey/SankeyPoint.js +0 -4
- package/es-modules/Series/Sankey/SankeySeries.js +92 -22
- package/es-modules/Series/SolidGauge/SolidGaugeComposition.js +3 -1
- package/es-modules/Series/Spline/SplineSeries.js +0 -8
- package/es-modules/Series/Sunburst/SunburstPoint.js +2 -3
- package/es-modules/Series/Sunburst/SunburstSeries.js +6 -6
- package/es-modules/Series/Sunburst/SunburstUtilities.js +3 -2
- package/es-modules/Series/Tilemap/TilemapPoint.js +2 -5
- package/es-modules/Series/Tilemap/TilemapShapes.js +0 -7
- package/es-modules/Series/Timeline/TimelineSeries.js +3 -4
- package/es-modules/{Mixins/TreeSeries.js → Series/TreeUtilities.js} +88 -78
- package/es-modules/Series/Treemap/TreemapPoint.js +2 -2
- package/es-modules/Series/Treemap/TreemapSeries.js +22 -25
- package/es-modules/Series/Variwide/VariwideSeries.js +5 -1
- package/es-modules/Series/Venn/VennPoint.js +16 -7
- package/es-modules/Series/Venn/VennSeries.js +11 -17
- package/es-modules/Series/Venn/VennUtils.js +551 -439
- package/es-modules/Series/Waterfall/WaterfallSeries.js +8 -6
- package/es-modules/Series/Windbarb/WindbarbSeries.js +23 -24
- package/es-modules/Series/Wordcloud/WordcloudPoint.js +8 -6
- package/es-modules/Series/Wordcloud/WordcloudSeries.js +26 -22
- package/es-modules/Series/Wordcloud/WordcloudUtils.js +669 -484
- package/es-modules/Series/XRange/XRangePoint.js +7 -12
- package/es-modules/Series/XRange/XRangeSeries.js +4 -20
- package/es-modules/Stock/Indicators/ABands/ABandsIndicator.js +15 -6
- package/es-modules/Stock/Indicators/AO/AOIndicator.js +2 -3
- package/es-modules/Stock/Indicators/APO/APOIndicator.js +14 -20
- package/es-modules/Stock/Indicators/Aroon/AroonIndicator.js +4 -6
- package/es-modules/Stock/Indicators/AroonOscillator/AroonOscillatorIndicator.js +11 -13
- package/es-modules/Stock/Indicators/ArrayUtilities.js +47 -0
- package/es-modules/Stock/Indicators/BB/BBIndicator.js +39 -11
- package/es-modules/Stock/Indicators/CMF/CMFIndicator.js +35 -15
- package/es-modules/Stock/Indicators/Chaikin/ChaikinIndicator.js +6 -12
- package/es-modules/Stock/Indicators/DEMA/DEMAIndicator.js +1 -11
- package/es-modules/Stock/Indicators/DMI/DMIIndicator.js +28 -16
- package/es-modules/Stock/Indicators/DisparityIndex/DisparityIndexIndicator.js +18 -11
- package/es-modules/Stock/Indicators/EMA/EMAIndicator.js +1 -3
- package/es-modules/Stock/Indicators/IKH/IKHIndicator.js +6 -6
- package/es-modules/Stock/Indicators/KeltnerChannels/KeltnerChannelsIndicator.js +23 -9
- package/es-modules/Stock/Indicators/Klinger/KlingerIndicator.js +16 -19
- package/es-modules/Stock/Indicators/LinearRegression/LinearRegression.js +32 -14
- package/es-modules/Stock/Indicators/LinearRegressionAngle/LinearRegressionAngle.js +2 -2
- package/es-modules/Stock/Indicators/LinearRegressionIntercept/LinearRegressionIntercept.js +2 -2
- package/es-modules/Stock/Indicators/LinearRegressionSlopes/LinearRegressionSlopes.js +2 -2
- package/es-modules/Stock/Indicators/MACD/MACDIndicator.js +2 -3
- package/es-modules/Stock/Indicators/MultipleLinesComposition.js +294 -0
- package/es-modules/Stock/Indicators/NATR/NATRIndicator.js +1 -3
- package/es-modules/Stock/Indicators/PC/PCIndicator.js +25 -13
- package/es-modules/Stock/Indicators/PPO/PPOIndicator.js +1 -11
- package/es-modules/Stock/Indicators/PivotPoints/PivotPointsIndicator.js +2 -1
- package/es-modules/Stock/Indicators/RSI/RSIIndicator.js +2 -1
- package/es-modules/Stock/Indicators/SMA/SMAComposition.js +0 -26
- package/es-modules/Stock/Indicators/SMA/SMAIndicator.js +32 -50
- package/es-modules/Stock/Indicators/SlowStochastic/SlowStochasticIndicator.js +0 -8
- package/es-modules/Stock/Indicators/Stochastic/StochasticIndicator.js +18 -9
- package/es-modules/Stock/Indicators/Supertrend/SupertrendIndicator.js +4 -6
- package/es-modules/Stock/Indicators/TEMA/TEMAIndicator.js +26 -11
- package/es-modules/Stock/Indicators/TRIX/TRIXIndicator.js +6 -12
- package/es-modules/Stock/Indicators/VBP/VBPIndicator.js +26 -10
- package/es-modules/Stock/Indicators/VWAP/VWAPIndicator.js +19 -7
- package/es-modules/Stock/Indicators/WilliamsR/WilliamsRIndicator.js +2 -3
- package/es-modules/Stock/StockToolsBindings.js +156 -47
- package/es-modules/Stock/StockToolsGui.js +442 -37
- package/es-modules/masters/highcharts-3d.src.js +1 -1
- package/es-modules/masters/highcharts-gantt.src.js +1 -1
- package/es-modules/masters/highcharts-more.src.js +1 -1
- package/es-modules/masters/highcharts.src.js +1 -1
- package/es-modules/masters/highmaps.src.js +1 -1
- package/es-modules/masters/highstock.src.js +1 -1
- package/es-modules/masters/indicators/acceleration-bands.src.js +1 -1
- package/es-modules/masters/indicators/accumulation-distribution.src.js +1 -1
- package/es-modules/masters/indicators/ao.src.js +1 -1
- package/es-modules/masters/indicators/apo.src.js +1 -1
- package/es-modules/masters/indicators/aroon-oscillator.src.js +1 -1
- package/es-modules/masters/indicators/aroon.src.js +1 -1
- package/es-modules/masters/indicators/atr.src.js +1 -1
- package/es-modules/masters/indicators/bollinger-bands.src.js +1 -1
- package/es-modules/masters/indicators/cci.src.js +1 -1
- package/es-modules/masters/indicators/chaikin.src.js +1 -1
- package/es-modules/masters/indicators/cmf.src.js +1 -1
- package/es-modules/masters/indicators/cmo.src.js +1 -1
- package/es-modules/masters/indicators/dema.src.js +1 -1
- package/es-modules/masters/indicators/disparity-index.src.js +1 -1
- package/es-modules/masters/indicators/dmi.src.js +1 -1
- package/es-modules/masters/indicators/dpo.src.js +1 -1
- package/es-modules/masters/indicators/ema.src.js +4 -10
- package/es-modules/masters/indicators/ichimoku-kinko-hyo.src.js +1 -1
- package/es-modules/masters/indicators/indicators-all.src.js +2 -2
- package/es-modules/masters/indicators/indicators.src.js +2 -1
- package/es-modules/masters/indicators/keltner-channels.src.js +1 -1
- package/es-modules/masters/indicators/klinger.src.js +1 -1
- package/es-modules/masters/indicators/macd.src.js +1 -1
- package/es-modules/masters/indicators/mfi.src.js +1 -1
- package/es-modules/masters/indicators/momentum.src.js +1 -1
- package/es-modules/masters/indicators/natr.src.js +1 -1
- package/es-modules/masters/indicators/obv.src.js +1 -1
- package/es-modules/masters/indicators/pivot-points.src.js +1 -1
- package/es-modules/masters/indicators/ppo.src.js +1 -1
- package/es-modules/masters/indicators/price-channel.src.js +1 -1
- package/es-modules/masters/indicators/price-envelopes.src.js +1 -1
- package/es-modules/masters/indicators/psar.src.js +1 -1
- package/es-modules/masters/indicators/regressions.src.js +1 -1
- package/es-modules/masters/indicators/roc.src.js +1 -1
- package/es-modules/masters/indicators/rsi.src.js +1 -1
- package/es-modules/masters/indicators/slow-stochastic.src.js +1 -1
- package/es-modules/masters/indicators/stochastic.src.js +1 -1
- package/es-modules/masters/indicators/supertrend.src.js +1 -1
- package/es-modules/masters/indicators/tema.src.js +1 -1
- package/es-modules/masters/indicators/trendline.src.js +1 -1
- package/es-modules/masters/indicators/trix.src.js +1 -1
- package/es-modules/masters/indicators/volume-by-price.src.js +1 -1
- package/es-modules/masters/indicators/vwap.src.js +1 -1
- package/es-modules/masters/indicators/williams-r.src.js +1 -1
- package/es-modules/masters/indicators/wma.src.js +1 -1
- package/es-modules/masters/indicators/zigzag.src.js +1 -1
- package/es-modules/masters/modules/accessibility.src.js +16 -2
- package/es-modules/masters/modules/annotations-advanced.src.js +3 -1
- package/es-modules/masters/modules/annotations.src.js +1 -1
- package/es-modules/masters/modules/arrow-symbols.src.js +1 -1
- package/es-modules/masters/modules/boost-canvas.src.js +1 -1
- package/es-modules/masters/modules/boost.src.js +1 -1
- package/es-modules/masters/modules/broken-axis.src.js +1 -1
- package/es-modules/masters/modules/bullet.src.js +1 -1
- package/es-modules/masters/modules/coloraxis.src.js +1 -1
- package/es-modules/masters/modules/current-date-indicator.src.js +1 -1
- package/es-modules/masters/modules/cylinder.src.js +1 -1
- package/es-modules/masters/modules/data.src.js +6 -3
- package/es-modules/masters/modules/datagrouping.src.js +1 -1
- package/es-modules/masters/modules/debugger.src.js +1 -1
- package/es-modules/masters/modules/dependency-wheel.src.js +1 -1
- package/es-modules/masters/modules/dotplot.src.js +1 -1
- package/es-modules/masters/modules/drag-panes.src.js +1 -1
- package/es-modules/masters/modules/draggable-points.src.js +1 -1
- package/es-modules/masters/modules/drilldown.src.js +1 -1
- package/es-modules/masters/modules/dumbbell.src.js +1 -1
- package/es-modules/masters/modules/export-data.src.js +1 -1
- package/es-modules/masters/modules/exporting.src.js +1 -1
- package/es-modules/masters/modules/full-screen.src.js +1 -1
- package/es-modules/masters/modules/funnel.src.js +1 -1
- package/es-modules/masters/modules/funnel3d.src.js +1 -1
- package/es-modules/masters/modules/gantt.src.js +1 -1
- package/es-modules/masters/modules/grid-axis.src.js +1 -1
- package/es-modules/masters/modules/heatmap.src.js +1 -2
- package/es-modules/masters/modules/heikinashi.src.js +1 -1
- package/es-modules/masters/modules/histogram-bellcurve.src.js +1 -1
- package/es-modules/masters/modules/hollowcandlestick.src.js +1 -1
- package/es-modules/masters/modules/item-series.src.js +1 -1
- package/es-modules/masters/modules/lollipop.src.js +1 -1
- package/es-modules/masters/modules/map.src.js +1 -3
- package/es-modules/masters/modules/marker-clusters.src.js +1 -1
- package/es-modules/masters/modules/networkgraph.src.js +1 -1
- package/es-modules/masters/modules/no-data-to-display.src.js +1 -1
- package/es-modules/masters/modules/offline-exporting.src.js +1 -1
- package/es-modules/masters/modules/oldie-polyfills.src.js +1 -1
- package/es-modules/masters/modules/oldie.src.js +1 -1
- package/es-modules/masters/modules/organization.src.js +1 -1
- package/es-modules/masters/modules/overlapping-datalabels.src.js +1 -1
- package/es-modules/masters/modules/parallel-coordinates.src.js +1 -1
- package/es-modules/masters/modules/pareto.src.js +1 -1
- package/es-modules/masters/modules/pathfinder.src.js +1 -1
- package/es-modules/masters/modules/pattern-fill.src.js +1 -1
- package/es-modules/masters/modules/price-indicator.src.js +1 -1
- package/es-modules/masters/modules/pyramid3d.src.js +1 -1
- package/es-modules/masters/modules/sankey.src.js +1 -1
- package/es-modules/masters/modules/series-label.src.js +1 -1
- package/es-modules/masters/modules/solid-gauge.src.js +1 -1
- package/es-modules/masters/modules/sonification.src.js +33 -2
- package/es-modules/masters/modules/static-scale.src.js +1 -1
- package/es-modules/masters/modules/stock-tools.src.js +1 -1
- package/es-modules/masters/modules/stock.src.js +4 -1
- package/es-modules/masters/modules/streamgraph.src.js +1 -1
- package/es-modules/masters/modules/sunburst.src.js +1 -1
- package/es-modules/masters/modules/tilemap.src.js +1 -1
- package/es-modules/masters/modules/timeline.src.js +1 -1
- package/es-modules/masters/modules/treegrid.src.js +1 -1
- package/es-modules/masters/modules/treemap.src.js +1 -1
- package/es-modules/masters/modules/variable-pie.src.js +1 -1
- package/es-modules/masters/modules/variwide.src.js +1 -1
- package/es-modules/masters/modules/vector.src.js +1 -1
- package/es-modules/masters/modules/venn.src.js +1 -1
- package/es-modules/masters/modules/windbarb.src.js +1 -1
- package/es-modules/masters/modules/wordcloud.src.js +1 -1
- package/es-modules/masters/modules/xrange.src.js +1 -1
- package/es-modules/masters/themes/avocado.src.js +1 -1
- package/es-modules/masters/themes/brand-dark.src.js +14 -0
- package/es-modules/masters/themes/brand-light.src.js +14 -0
- package/es-modules/masters/themes/dark-blue.src.js +1 -1
- package/es-modules/masters/themes/dark-green.src.js +1 -1
- package/es-modules/masters/themes/dark-unica.src.js +1 -1
- package/es-modules/masters/themes/gray.src.js +1 -1
- package/es-modules/masters/themes/grid-light.src.js +1 -1
- package/es-modules/masters/themes/grid.src.js +1 -1
- package/es-modules/masters/themes/high-contrast-dark.src.js +1 -1
- package/es-modules/masters/themes/high-contrast-light.src.js +1 -1
- package/es-modules/masters/themes/sand-signika.src.js +1 -1
- package/es-modules/masters/themes/skies.src.js +1 -1
- package/es-modules/masters/themes/sunset.src.js +1 -1
- package/highcharts-3d.js +1 -1
- package/highcharts-3d.js.map +1 -1
- package/highcharts-3d.src.js +65 -35
- package/highcharts-gantt.js +800 -803
- package/highcharts-gantt.js.map +1 -1
- package/highcharts-gantt.src.js +1356 -1429
- package/highcharts-more.js +194 -193
- package/highcharts-more.js.map +1 -1
- package/highcharts-more.src.js +280 -222
- package/highcharts.d.ts +10208 -761
- package/highcharts.js +585 -588
- package/highcharts.js.map +1 -1
- package/highcharts.src.d.ts +10208 -761
- package/highcharts.src.js +992 -1066
- package/highmaps.js +727 -707
- package/highmaps.js.map +1 -1
- package/highmaps.src.js +3240 -2135
- package/highstock.js +788 -783
- package/highstock.js.map +1 -1
- package/highstock.src.js +2487 -1981
- package/indicators/acceleration-bands.d.ts +17 -1
- package/indicators/acceleration-bands.js +11 -9
- package/indicators/acceleration-bands.js.map +1 -1
- package/indicators/acceleration-bands.src.d.ts +17 -1
- package/indicators/acceleration-bands.src.js +238 -112
- package/indicators/accumulation-distribution.js +1 -1
- package/indicators/accumulation-distribution.src.js +1 -1
- package/indicators/ao.js +6 -6
- package/indicators/ao.js.map +1 -1
- package/indicators/ao.src.js +4 -4
- package/indicators/apo.js +5 -6
- package/indicators/apo.js.map +1 -1
- package/indicators/apo.src.js +16 -84
- package/indicators/aroon-oscillator.d.ts +17 -1
- package/indicators/aroon-oscillator.js +10 -9
- package/indicators/aroon-oscillator.js.map +1 -1
- package/indicators/aroon-oscillator.src.d.ts +17 -1
- package/indicators/aroon-oscillator.src.js +230 -177
- package/indicators/aroon.d.ts +17 -1
- package/indicators/aroon.js +11 -9
- package/indicators/aroon.js.map +1 -1
- package/indicators/aroon.src.d.ts +17 -1
- package/indicators/aroon.src.js +227 -112
- package/indicators/atr.js +1 -1
- package/indicators/atr.src.js +1 -1
- package/indicators/bollinger-bands.d.ts +17 -1
- package/indicators/bollinger-bands.js +12 -9
- package/indicators/bollinger-bands.js.map +1 -1
- package/indicators/bollinger-bands.src.d.ts +17 -1
- package/indicators/bollinger-bands.src.js +262 -117
- package/indicators/cci.js +1 -1
- package/indicators/cci.src.js +1 -1
- package/indicators/chaikin.js +8 -9
- package/indicators/chaikin.js.map +1 -1
- package/indicators/chaikin.src.js +8 -76
- package/indicators/cmf.js +1 -1
- package/indicators/cmf.js.map +1 -1
- package/indicators/cmf.src.js +36 -16
- package/indicators/cmo.js +1 -1
- package/indicators/cmo.src.js +1 -1
- package/indicators/dema.js +5 -6
- package/indicators/dema.js.map +1 -1
- package/indicators/dema.src.js +3 -75
- package/indicators/disparity-index.js +6 -7
- package/indicators/disparity-index.js.map +1 -1
- package/indicators/disparity-index.src.js +20 -74
- package/indicators/dmi.js +12 -11
- package/indicators/dmi.js.map +1 -1
- package/indicators/dmi.src.js +252 -121
- package/indicators/dpo.js +1 -1
- package/indicators/dpo.src.js +1 -1
- package/indicators/ema.js +1 -13
- package/indicators/ema.js.map +1 -1
- package/indicators/ema.src.js +7 -188
- package/indicators/ichimoku-kinko-hyo.js +1 -1
- package/indicators/ichimoku-kinko-hyo.js.map +1 -1
- package/indicators/ichimoku-kinko-hyo.src.js +7 -7
- package/indicators/indicators-all.d.ts +17 -1
- package/indicators/indicators-all.js +198 -203
- package/indicators/indicators-all.js.map +1 -1
- package/indicators/indicators-all.src.d.ts +17 -1
- package/indicators/indicators-all.src.js +892 -777
- package/indicators/indicators.js +12 -12
- package/indicators/indicators.js.map +1 -1
- package/indicators/indicators.src.js +213 -144
- package/indicators/keltner-channels.d.ts +17 -1
- package/indicators/keltner-channels.js +11 -10
- package/indicators/keltner-channels.js.map +1 -1
- package/indicators/keltner-channels.src.d.ts +17 -1
- package/indicators/keltner-channels.src.js +246 -118
- package/indicators/klinger.js +14 -13
- package/indicators/klinger.js.map +1 -1
- package/indicators/klinger.src.js +239 -187
- package/indicators/macd.js +2 -2
- package/indicators/macd.js.map +1 -1
- package/indicators/macd.src.js +3 -4
- package/indicators/mfi.js +1 -1
- package/indicators/mfi.src.js +1 -1
- package/indicators/momentum.js +1 -1
- package/indicators/momentum.src.js +1 -1
- package/indicators/natr.js +3 -3
- package/indicators/natr.js.map +1 -1
- package/indicators/natr.src.js +2 -4
- package/indicators/obv.js +1 -1
- package/indicators/obv.src.js +1 -1
- package/indicators/pivot-points.js +1 -1
- package/indicators/pivot-points.js.map +1 -1
- package/indicators/pivot-points.src.js +3 -2
- package/indicators/ppo.js +5 -6
- package/indicators/ppo.js.map +1 -1
- package/indicators/ppo.src.js +3 -75
- package/indicators/price-channel.d.ts +17 -1
- package/indicators/price-channel.js +11 -9
- package/indicators/price-channel.js.map +1 -1
- package/indicators/price-channel.src.d.ts +17 -1
- package/indicators/price-channel.src.js +288 -168
- package/indicators/price-envelopes.js +1 -1
- package/indicators/price-envelopes.src.js +1 -1
- package/indicators/psar.js +1 -1
- package/indicators/psar.src.js +1 -1
- package/indicators/regressions.js +1 -1
- package/indicators/regressions.js.map +1 -1
- package/indicators/regressions.src.js +39 -21
- package/indicators/roc.js +1 -1
- package/indicators/roc.src.js +1 -1
- package/indicators/rsi.js +1 -1
- package/indicators/rsi.js.map +1 -1
- package/indicators/rsi.src.js +3 -2
- package/indicators/slow-stochastic.js +5 -6
- package/indicators/slow-stochastic.js.map +1 -1
- package/indicators/slow-stochastic.src.js +2 -72
- package/indicators/stochastic.d.ts +17 -1
- package/indicators/stochastic.js +12 -10
- package/indicators/stochastic.js.map +1 -1
- package/indicators/stochastic.src.d.ts +17 -1
- package/indicators/stochastic.src.js +282 -165
- package/indicators/supertrend.js +10 -10
- package/indicators/supertrend.js.map +1 -1
- package/indicators/supertrend.src.js +6 -7
- package/indicators/tema.js +6 -7
- package/indicators/tema.js.map +1 -1
- package/indicators/tema.src.js +28 -75
- package/indicators/trendline.js +1 -1
- package/indicators/trendline.src.js +1 -1
- package/indicators/trix.js +4 -5
- package/indicators/trix.js.map +1 -1
- package/indicators/trix.src.js +8 -76
- package/indicators/volume-by-price.js +16 -16
- package/indicators/volume-by-price.js.map +1 -1
- package/indicators/volume-by-price.src.js +27 -10
- package/indicators/vwap.js +1 -1
- package/indicators/vwap.js.map +1 -1
- package/indicators/vwap.src.js +20 -8
- package/indicators/williams-r.js +5 -6
- package/indicators/williams-r.js.map +1 -1
- package/indicators/williams-r.src.js +41 -51
- package/indicators/wma.js +1 -1
- package/indicators/wma.src.js +1 -1
- package/indicators/zigzag.js +1 -1
- package/indicators/zigzag.src.js +1 -1
- package/modules/accessibility.d.ts +0 -30
- package/modules/accessibility.js +241 -216
- package/modules/accessibility.js.map +1 -1
- package/modules/accessibility.src.d.ts +0 -30
- package/modules/accessibility.src.js +7818 -6398
- package/modules/annotations-advanced.d.ts +30 -0
- package/modules/annotations-advanced.js +192 -165
- package/modules/annotations-advanced.js.map +1 -1
- package/modules/annotations-advanced.src.d.ts +30 -0
- package/modules/annotations-advanced.src.js +1716 -416
- package/modules/annotations.js +125 -110
- package/modules/annotations.js.map +1 -1
- package/modules/annotations.src.js +1059 -304
- package/modules/arrow-symbols.js +1 -1
- package/modules/arrow-symbols.src.js +1 -1
- package/modules/boost-canvas.js +15 -15
- package/modules/boost-canvas.js.map +1 -1
- package/modules/boost-canvas.src.js +3 -3
- package/modules/boost.js +79 -79
- package/modules/boost.js.map +1 -1
- package/modules/boost.src.js +42 -51
- package/modules/broken-axis.js +1 -1
- package/modules/broken-axis.js.map +1 -1
- package/modules/broken-axis.src.js +18 -12
- package/modules/bullet.js +1 -1
- package/modules/bullet.src.js +1 -1
- package/modules/coloraxis.js +24 -24
- package/modules/coloraxis.js.map +1 -1
- package/modules/coloraxis.src.js +77 -103
- package/modules/current-date-indicator.js +4 -4
- package/modules/current-date-indicator.js.map +1 -1
- package/modules/current-date-indicator.src.js +4 -4
- package/modules/cylinder.js +1 -1
- package/modules/cylinder.js.map +1 -1
- package/modules/cylinder.src.js +37 -5
- package/modules/data.d.ts +6 -6
- package/modules/data.js +31 -31
- package/modules/data.js.map +1 -1
- package/modules/data.src.d.ts +6 -6
- package/modules/data.src.js +18 -58
- package/modules/datagrouping.js +20 -20
- package/modules/datagrouping.js.map +1 -1
- package/modules/datagrouping.src.js +54 -33
- package/modules/debugger.js +1 -1
- package/modules/debugger.src.js +1 -1
- package/modules/dependency-wheel.js +11 -11
- package/modules/dependency-wheel.js.map +1 -1
- package/modules/dependency-wheel.src.js +5 -8
- package/modules/dotplot.js +1 -1
- package/modules/dotplot.src.js +1 -1
- package/modules/drag-panes.js +8 -8
- package/modules/drag-panes.js.map +1 -1
- package/modules/drag-panes.src.js +3 -3
- package/modules/draggable-points.js +1 -1
- package/modules/draggable-points.js.map +1 -1
- package/modules/draggable-points.src.js +8 -9
- package/modules/drilldown.js +24 -24
- package/modules/drilldown.js.map +1 -1
- package/modules/drilldown.src.js +13 -8
- package/modules/dumbbell.js +17 -17
- package/modules/dumbbell.js.map +1 -1
- package/modules/dumbbell.src.js +4 -8
- package/modules/export-data.js +19 -19
- package/modules/export-data.js.map +1 -1
- package/modules/export-data.src.js +9 -8
- package/modules/exporting.js +39 -38
- package/modules/exporting.js.map +1 -1
- package/modules/exporting.src.js +132 -113
- package/modules/full-screen.js +1 -1
- package/modules/full-screen.js.map +1 -1
- package/modules/full-screen.src.js +5 -4
- package/modules/funnel.js +12 -12
- package/modules/funnel.js.map +1 -1
- package/modules/funnel.src.js +9 -6
- package/modules/funnel3d.js +1 -1
- package/modules/funnel3d.js.map +1 -1
- package/modules/funnel3d.src.js +17 -10
- package/modules/gantt.js +217 -218
- package/modules/gantt.js.map +1 -1
- package/modules/gantt.src.js +364 -363
- package/modules/grid-axis.js +1 -1
- package/modules/grid-axis.js.map +1 -1
- package/modules/grid-axis.src.js +27 -19
- package/modules/heatmap.js +39 -39
- package/modules/heatmap.js.map +1 -1
- package/modules/heatmap.src.js +132 -141
- package/modules/heikinashi.js +1 -1
- package/modules/heikinashi.js.map +1 -1
- package/modules/heikinashi.src.js +12 -10
- package/modules/histogram-bellcurve.js +13 -13
- package/modules/histogram-bellcurve.js.map +1 -1
- package/modules/histogram-bellcurve.src.js +97 -91
- package/modules/hollowcandlestick.js +9 -9
- package/modules/hollowcandlestick.js.map +1 -1
- package/modules/hollowcandlestick.src.js +31 -35
- package/modules/item-series.js +6 -6
- package/modules/item-series.js.map +1 -1
- package/modules/item-series.src.js +6 -6
- package/modules/lollipop.js +1 -1
- package/modules/lollipop.src.js +1 -1
- package/modules/map.d.ts +138 -14
- package/modules/map.js +144 -122
- package/modules/map.js.map +1 -1
- package/modules/map.src.d.ts +138 -14
- package/modules/map.src.js +2253 -1074
- package/modules/marker-clusters.js +36 -36
- package/modules/marker-clusters.js.map +1 -1
- package/modules/marker-clusters.src.js +176 -143
- package/modules/networkgraph.d.ts +12 -1
- package/modules/networkgraph.js +49 -49
- package/modules/networkgraph.js.map +1 -1
- package/modules/networkgraph.src.d.ts +12 -1
- package/modules/networkgraph.src.js +103 -78
- package/modules/no-data-to-display.js +5 -5
- package/modules/no-data-to-display.js.map +1 -1
- package/modules/no-data-to-display.src.js +3 -3
- package/modules/offline-exporting.js +18 -18
- package/modules/offline-exporting.js.map +1 -1
- package/modules/offline-exporting.src.js +38 -43
- package/modules/oldie-polyfills.js +1 -1
- package/modules/oldie-polyfills.src.js +1 -1
- package/modules/oldie.js +26 -26
- package/modules/oldie.js.map +1 -1
- package/modules/oldie.src.js +21 -81
- package/modules/organization.js +13 -13
- package/modules/organization.js.map +1 -1
- package/modules/organization.src.js +8 -6
- package/modules/overlapping-datalabels.js +1 -1
- package/modules/overlapping-datalabels.src.js +1 -1
- package/modules/parallel-coordinates.js +1 -1
- package/modules/parallel-coordinates.js.map +1 -1
- package/modules/parallel-coordinates.src.js +6 -4
- package/modules/pareto.js +7 -7
- package/modules/pareto.js.map +1 -1
- package/modules/pareto.src.js +89 -78
- package/modules/pathfinder.js +1 -1
- package/modules/pathfinder.js.map +1 -1
- package/modules/pathfinder.src.js +21 -20
- package/modules/pattern-fill.js +1 -1
- package/modules/pattern-fill.js.map +1 -1
- package/modules/pattern-fill.src.js +18 -12
- package/modules/price-indicator.js +1 -1
- package/modules/price-indicator.js.map +1 -1
- package/modules/price-indicator.src.js +3 -2
- package/modules/pyramid3d.js +1 -1
- package/modules/pyramid3d.js.map +1 -1
- package/modules/pyramid3d.src.js +3 -2
- package/modules/sankey.d.ts +12 -1
- package/modules/sankey.js +29 -29
- package/modules/sankey.js.map +1 -1
- package/modules/sankey.src.d.ts +12 -1
- package/modules/sankey.src.js +307 -181
- package/modules/series-label.js +1 -1
- package/modules/series-label.js.map +1 -1
- package/modules/series-label.src.js +2 -2
- package/modules/solid-gauge.js +1 -1
- package/modules/solid-gauge.js.map +1 -1
- package/modules/solid-gauge.src.js +17 -2
- package/modules/sonification.js +59 -55
- package/modules/sonification.js.map +1 -1
- package/modules/sonification.src.js +3093 -2594
- package/modules/static-scale.js +1 -1
- package/modules/static-scale.src.js +1 -1
- package/modules/stock-tools.js +178 -163
- package/modules/stock-tools.js.map +1 -1
- package/modules/stock-tools.src.js +1136 -229
- package/modules/stock.d.ts +39 -6
- package/modules/stock.js +204 -196
- package/modules/stock.js.map +1 -1
- package/modules/stock.src.d.ts +39 -6
- package/modules/stock.src.js +1820 -1240
- package/modules/streamgraph.js +1 -1
- package/modules/streamgraph.src.js +1 -1
- package/modules/sunburst.js +60 -60
- package/modules/sunburst.js.map +1 -1
- package/modules/sunburst.src.js +281 -248
- package/modules/tilemap.js +17 -17
- package/modules/tilemap.js.map +1 -1
- package/modules/tilemap.src.js +3 -13
- package/modules/timeline.js +18 -18
- package/modules/timeline.js.map +1 -1
- package/modules/timeline.src.js +5 -5
- package/modules/treegrid.js +56 -57
- package/modules/treegrid.js.map +1 -1
- package/modules/treegrid.src.js +201 -169
- package/modules/treemap.js +41 -41
- package/modules/treemap.js.map +1 -1
- package/modules/treemap.src.js +266 -232
- package/modules/variable-pie.js +1 -1
- package/modules/variable-pie.src.js +1 -1
- package/modules/variwide.js +1 -1
- package/modules/variwide.js.map +1 -1
- package/modules/variwide.src.js +7 -3
- package/modules/vector.js +1 -1
- package/modules/vector.src.js +1 -1
- package/modules/venn.js +31 -31
- package/modules/venn.js.map +1 -1
- package/modules/venn.src.js +740 -731
- package/modules/windbarb.js +15 -15
- package/modules/windbarb.js.map +1 -1
- package/modules/windbarb.src.js +90 -62
- package/modules/wordcloud.js +23 -24
- package/modules/wordcloud.js.map +1 -1
- package/modules/wordcloud.src.js +898 -954
- package/modules/xrange.js +2 -2
- package/modules/xrange.js.map +1 -1
- package/modules/xrange.src.js +12 -33
- package/package.json +1 -1
- package/themes/avocado.js +1 -1
- package/themes/avocado.src.js +1 -1
- package/themes/brand-dark.js +15 -0
- package/themes/brand-dark.js.map +1 -0
- package/themes/brand-dark.src.js +328 -0
- package/themes/brand-light.js +15 -0
- package/themes/brand-light.js.map +1 -0
- package/themes/brand-light.src.js +294 -0
- package/themes/dark-blue.js +1 -1
- package/themes/dark-blue.src.js +1 -1
- package/themes/dark-green.js +1 -1
- package/themes/dark-green.src.js +1 -1
- package/themes/dark-unica.js +1 -1
- package/themes/dark-unica.js.map +1 -1
- package/themes/dark-unica.src.js +5 -3
- package/themes/gray.js +1 -1
- package/themes/gray.src.js +1 -1
- package/themes/grid-light.js +1 -1
- package/themes/grid-light.js.map +1 -1
- package/themes/grid-light.src.js +5 -3
- package/themes/grid.js +1 -1
- package/themes/grid.js.map +1 -1
- package/themes/grid.src.js +5 -3
- package/themes/high-contrast-dark.js +1 -1
- package/themes/high-contrast-dark.src.js +1 -1
- package/themes/high-contrast-light.js +1 -1
- package/themes/high-contrast-light.src.js +1 -1
- package/themes/sand-signika.js +1 -1
- package/themes/sand-signika.src.js +1 -1
- package/themes/skies.js +1 -1
- package/themes/skies.src.js +1 -1
- package/themes/sunset.js +1 -1
- package/themes/sunset.src.js +1 -1
- package/es-modules/Core/Axis/MapAxis.js +0 -157
- package/es-modules/Core/Color/Palette.js +0 -82
- package/es-modules/Extensions/Sonification/InstrumentDefinitions.js +0 -32
- package/es-modules/Mixins/ColorSeries.js +0 -77
- package/es-modules/Mixins/DerivedSeries.js +0 -118
- package/es-modules/Mixins/DrawPoint.js +0 -81
- package/es-modules/Mixins/IndicatorRequired.js +0 -56
- package/es-modules/Mixins/MultipleLines.js +0 -181
- package/es-modules/Mixins/Navigation.js +0 -54
- package/es-modules/Mixins/NelderMead.js +0 -132
- package/es-modules/Mixins/Polygon.js +0 -259
- package/es-modules/Mixins/ReduceArray.js +0 -54
package/modules/venn.src.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Highcharts JS v9.
|
|
2
|
+
* @license Highcharts JS v9.3.3 (2022-02-01)
|
|
3
3
|
*
|
|
4
4
|
* (c) 2017-2021 Highsoft AS
|
|
5
5
|
* Authors: Jon Arild Nygard
|
|
@@ -192,7 +192,8 @@
|
|
|
192
192
|
* Returns the area of the circular segment.
|
|
193
193
|
*/
|
|
194
194
|
function getCircularSegmentArea(r, h) {
|
|
195
|
-
return r * r * Math.acos(1 - h / r) -
|
|
195
|
+
return (r * r * Math.acos(1 - h / r) -
|
|
196
|
+
(r - h) * Math.sqrt(h * (2 * r - h)));
|
|
196
197
|
}
|
|
197
198
|
CircleUtilities.getCircularSegmentArea = getCircularSegmentArea;
|
|
198
199
|
/**
|
|
@@ -528,257 +529,137 @@
|
|
|
528
529
|
|
|
529
530
|
return CircleUtilities;
|
|
530
531
|
});
|
|
531
|
-
_registerModule(_modules, '
|
|
532
|
+
_registerModule(_modules, 'Series/DrawPointComposition.js', [], function () {
|
|
532
533
|
/* *
|
|
533
534
|
*
|
|
534
535
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
535
536
|
*
|
|
536
537
|
* */
|
|
537
|
-
/*
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
* @return {Highcharts.NelderMeadPointArray}
|
|
562
|
-
* Returns the opimized position of a point.
|
|
563
|
-
*/
|
|
564
|
-
var nelderMead = function nelderMead(fn,
|
|
565
|
-
initial) {
|
|
566
|
-
var maxIterations = 100,
|
|
567
|
-
sortByFx = function (a,
|
|
568
|
-
b) {
|
|
569
|
-
return a.fx - b.fx;
|
|
570
|
-
}, pRef = 1, // Reflection parameter
|
|
571
|
-
pExp = 2, // Expansion parameter
|
|
572
|
-
pCon = -0.5, // Contraction parameter
|
|
573
|
-
pOCon = pCon * pRef, // Outwards contraction parameter
|
|
574
|
-
pShrink = 0.5; // Shrink parameter
|
|
538
|
+
/* *
|
|
539
|
+
*
|
|
540
|
+
* Composition
|
|
541
|
+
*
|
|
542
|
+
* */
|
|
543
|
+
var DrawPointComposition;
|
|
544
|
+
(function (DrawPointComposition) {
|
|
545
|
+
/* *
|
|
546
|
+
*
|
|
547
|
+
* Declarations
|
|
548
|
+
*
|
|
549
|
+
* */
|
|
550
|
+
/* *
|
|
551
|
+
*
|
|
552
|
+
* Constants
|
|
553
|
+
*
|
|
554
|
+
* */
|
|
555
|
+
var composedClasses = [];
|
|
556
|
+
/* *
|
|
557
|
+
*
|
|
558
|
+
* Functions
|
|
559
|
+
*
|
|
560
|
+
* */
|
|
561
|
+
/* eslint-disable valid-jsdoc */
|
|
575
562
|
/**
|
|
576
563
|
* @private
|
|
577
564
|
*/
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
565
|
+
function compose(PointClass) {
|
|
566
|
+
if (composedClasses.indexOf(PointClass) === -1) {
|
|
567
|
+
composedClasses.push(PointClass);
|
|
568
|
+
var pointProto = PointClass.prototype;
|
|
569
|
+
pointProto.draw = draw;
|
|
570
|
+
if (!pointProto.shouldDraw) {
|
|
571
|
+
pointProto.shouldDraw = shouldDraw;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
return PointClass;
|
|
575
|
+
}
|
|
576
|
+
DrawPointComposition.compose = compose;
|
|
587
577
|
/**
|
|
578
|
+
* Handles the drawing of a component.
|
|
579
|
+
* Can be used for any type of component that reserves the graphic property,
|
|
580
|
+
* and provides a shouldDraw on its context.
|
|
581
|
+
*
|
|
588
582
|
* @private
|
|
583
|
+
*
|
|
584
|
+
* @todo add type checking.
|
|
585
|
+
* @todo export this function to enable usage
|
|
589
586
|
*/
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
point);
|
|
618
|
-
p.fx = fn(p);
|
|
619
|
-
return p;
|
|
620
|
-
});
|
|
621
|
-
};
|
|
622
|
-
var getPoint = function (centroid,
|
|
623
|
-
worst,
|
|
624
|
-
a,
|
|
625
|
-
b) {
|
|
626
|
-
var point = weightedSum(a,
|
|
627
|
-
centroid,
|
|
628
|
-
b,
|
|
629
|
-
worst);
|
|
630
|
-
point.fx = fn(point);
|
|
631
|
-
return point;
|
|
632
|
-
};
|
|
633
|
-
// Create a simplex
|
|
634
|
-
var simplex = getSimplex(initial);
|
|
635
|
-
// Iterate from 0 to max iterations
|
|
636
|
-
for (var i = 0; i < maxIterations; i++) {
|
|
637
|
-
// Sort the simplex
|
|
638
|
-
simplex.sort(sortByFx);
|
|
639
|
-
// Create a centroid from the simplex
|
|
640
|
-
var worst = simplex[simplex.length - 1];
|
|
641
|
-
var centroid = getCentroid(simplex);
|
|
642
|
-
// Calculate the reflected point.
|
|
643
|
-
var reflected = getPoint(centroid,
|
|
644
|
-
worst, 1 + pRef, -pRef);
|
|
645
|
-
if (reflected.fx < simplex[0].fx) {
|
|
646
|
-
// If reflected point is the best, then possibly expand.
|
|
647
|
-
var expanded = getPoint(centroid,
|
|
648
|
-
worst, 1 + pExp, -pExp);
|
|
649
|
-
simplex = updateSimplex(simplex, (expanded.fx < reflected.fx) ? expanded : reflected);
|
|
587
|
+
function draw(params) {
|
|
588
|
+
var _this = this;
|
|
589
|
+
var animatableAttribs = params.animatableAttribs,
|
|
590
|
+
onComplete = params.onComplete,
|
|
591
|
+
css = params.css,
|
|
592
|
+
renderer = params.renderer;
|
|
593
|
+
var animation = (this.series && this.series.chart.hasRendered) ?
|
|
594
|
+
// Chart-level animation on updates
|
|
595
|
+
void 0 :
|
|
596
|
+
// Series-level animation on new points
|
|
597
|
+
(this.series &&
|
|
598
|
+
this.series.options.animation);
|
|
599
|
+
var graphic = this.graphic;
|
|
600
|
+
params.attribs = params.attribs || {};
|
|
601
|
+
// Assigning class in dot notation does go well in IE8
|
|
602
|
+
// eslint-disable-next-line dot-notation
|
|
603
|
+
params.attribs['class'] = this.getClassName();
|
|
604
|
+
if (this.shouldDraw()) {
|
|
605
|
+
if (!graphic) {
|
|
606
|
+
this.graphic = graphic =
|
|
607
|
+
renderer[params.shapeType](params.shapeArgs)
|
|
608
|
+
.add(params.group);
|
|
609
|
+
}
|
|
610
|
+
graphic
|
|
611
|
+
.css(css)
|
|
612
|
+
.attr(params.attribs)
|
|
613
|
+
.animate(animatableAttribs, params.isNew ? false : animation, onComplete);
|
|
650
614
|
}
|
|
651
|
-
else if (
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
// If the reflected is worse than the worst point, do a
|
|
657
|
-
// contraction
|
|
658
|
-
contracted = getPoint(centroid, worst, 1 + pCon, -pCon);
|
|
659
|
-
if (contracted.fx < worst.fx) {
|
|
660
|
-
simplex = updateSimplex(simplex, contracted);
|
|
661
|
-
}
|
|
662
|
-
else {
|
|
663
|
-
simplex = shrinkSimplex(simplex);
|
|
615
|
+
else if (graphic) {
|
|
616
|
+
var destroy_1 = function () {
|
|
617
|
+
_this.graphic = graphic = (graphic && graphic.destroy());
|
|
618
|
+
if (typeof onComplete === 'function') {
|
|
619
|
+
onComplete();
|
|
664
620
|
}
|
|
621
|
+
};
|
|
622
|
+
// animate only runs complete callback if something was animated.
|
|
623
|
+
if (Object.keys(animatableAttribs).length) {
|
|
624
|
+
graphic.animate(animatableAttribs, void 0, function () {
|
|
625
|
+
destroy_1();
|
|
626
|
+
});
|
|
665
627
|
}
|
|
666
628
|
else {
|
|
667
|
-
|
|
668
|
-
contracted = getPoint(centroid, worst, 1 - pOCon, pOCon);
|
|
669
|
-
if (contracted.fx < reflected.fx) {
|
|
670
|
-
simplex = updateSimplex(simplex, contracted);
|
|
671
|
-
}
|
|
672
|
-
else {
|
|
673
|
-
simplex = shrinkSimplex(simplex);
|
|
674
|
-
}
|
|
629
|
+
destroy_1();
|
|
675
630
|
}
|
|
676
631
|
}
|
|
677
|
-
else {
|
|
678
|
-
simplex = updateSimplex(simplex, reflected);
|
|
679
|
-
}
|
|
680
632
|
}
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
return nelderMeadMixin;
|
|
689
|
-
});
|
|
690
|
-
_registerModule(_modules, 'Mixins/DrawPoint.js', [], function () {
|
|
633
|
+
/**
|
|
634
|
+
* @private
|
|
635
|
+
*/
|
|
636
|
+
function shouldDraw() {
|
|
637
|
+
return !this.isNull;
|
|
638
|
+
}
|
|
639
|
+
})(DrawPointComposition || (DrawPointComposition = {}));
|
|
691
640
|
/* *
|
|
692
641
|
*
|
|
693
|
-
*
|
|
642
|
+
* Default Export
|
|
694
643
|
*
|
|
695
644
|
* */
|
|
696
|
-
var isFn = function (x) {
|
|
697
|
-
return typeof x === 'function';
|
|
698
|
-
};
|
|
699
|
-
/* eslint-disable no-invalid-this, valid-jsdoc */
|
|
700
|
-
/**
|
|
701
|
-
* Handles the drawing of a component.
|
|
702
|
-
* Can be used for any type of component that reserves the graphic property, and
|
|
703
|
-
* provides a shouldDraw on its context.
|
|
704
|
-
*
|
|
705
|
-
* @private
|
|
706
|
-
* @function draw
|
|
707
|
-
* @param {DrawPointParams} params
|
|
708
|
-
* Parameters.
|
|
709
|
-
*
|
|
710
|
-
* @todo add type checking.
|
|
711
|
-
* @todo export this function to enable usage
|
|
712
|
-
*/
|
|
713
|
-
var draw = function draw(params) {
|
|
714
|
-
var _this = this;
|
|
715
|
-
var animatableAttribs = params.animatableAttribs,
|
|
716
|
-
onComplete = params.onComplete,
|
|
717
|
-
css = params.css,
|
|
718
|
-
renderer = params.renderer;
|
|
719
|
-
var animation = (this.series && this.series.chart.hasRendered) ?
|
|
720
|
-
// Chart-level animation on updates
|
|
721
|
-
void 0 :
|
|
722
|
-
// Series-level animation on new points
|
|
723
|
-
(this.series &&
|
|
724
|
-
this.series.options.animation);
|
|
725
|
-
var graphic = this.graphic;
|
|
726
|
-
if (this.shouldDraw()) {
|
|
727
|
-
if (!graphic) {
|
|
728
|
-
this.graphic = graphic =
|
|
729
|
-
renderer[params.shapeType](params.shapeArgs)
|
|
730
|
-
.add(params.group);
|
|
731
|
-
}
|
|
732
|
-
graphic
|
|
733
|
-
.css(css)
|
|
734
|
-
.attr(params.attribs)
|
|
735
|
-
.animate(animatableAttribs, params.isNew ? false : animation, onComplete);
|
|
736
|
-
}
|
|
737
|
-
else if (graphic) {
|
|
738
|
-
var destroy_1 = function () {
|
|
739
|
-
_this.graphic = graphic = (graphic && graphic.destroy());
|
|
740
|
-
if (isFn(onComplete)) {
|
|
741
|
-
onComplete();
|
|
742
|
-
}
|
|
743
|
-
};
|
|
744
|
-
// animate only runs complete callback if something was animated.
|
|
745
|
-
if (Object.keys(animatableAttribs).length) {
|
|
746
|
-
graphic.animate(animatableAttribs, void 0, function () {
|
|
747
|
-
destroy_1();
|
|
748
|
-
});
|
|
749
|
-
}
|
|
750
|
-
else {
|
|
751
|
-
destroy_1();
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
};
|
|
755
|
-
/**
|
|
756
|
-
* An extended version of draw customized for points.
|
|
757
|
-
* It calls additional methods that is expected when rendering a point.
|
|
758
|
-
* @private
|
|
759
|
-
* @param {Highcharts.Dictionary<any>} params Parameters
|
|
760
|
-
*/
|
|
761
|
-
var drawPoint = function drawPoint(params) {
|
|
762
|
-
var point = this,
|
|
763
|
-
attribs = params.attribs = params.attribs || {};
|
|
764
|
-
// Assigning class in dot notation does go well in IE8
|
|
765
|
-
// eslint-disable-next-line dot-notation
|
|
766
|
-
attribs['class'] = point.getClassName();
|
|
767
|
-
// Call draw to render component
|
|
768
|
-
draw.call(point, params);
|
|
769
|
-
};
|
|
770
|
-
var drawPointModule = {
|
|
771
|
-
draw: draw,
|
|
772
|
-
drawPoint: drawPoint,
|
|
773
|
-
isFn: isFn
|
|
774
|
-
};
|
|
775
645
|
|
|
776
|
-
return
|
|
646
|
+
return DrawPointComposition;
|
|
777
647
|
});
|
|
778
|
-
_registerModule(_modules, 'Series/Venn/VennPoint.js', [_modules['
|
|
648
|
+
_registerModule(_modules, 'Series/Venn/VennPoint.js', [_modules['Series/DrawPointComposition.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Core/Utilities.js']], function (DrawPointComposition, SeriesRegistry, U) {
|
|
779
649
|
/* *
|
|
780
650
|
*
|
|
781
|
-
*
|
|
651
|
+
* Experimental Highcharts module which enables visualization of a Venn
|
|
652
|
+
* diagram.
|
|
653
|
+
*
|
|
654
|
+
* (c) 2016-2021 Highsoft AS
|
|
655
|
+
* Authors: Jon Arild Nygard
|
|
656
|
+
*
|
|
657
|
+
* Layout algorithm by Ben Frederickson:
|
|
658
|
+
* https://www.benfrederickson.com/better-venn-diagrams/
|
|
659
|
+
*
|
|
660
|
+
* License: www.highcharts.com/license
|
|
661
|
+
*
|
|
662
|
+
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
|
782
663
|
*
|
|
783
664
|
* */
|
|
784
665
|
var __extends = (this && this.__extends) || (function () {
|
|
@@ -830,15 +711,12 @@
|
|
|
830
711
|
return isNumber(this.value);
|
|
831
712
|
};
|
|
832
713
|
VennPoint.prototype.shouldDraw = function () {
|
|
833
|
-
var point = this;
|
|
834
714
|
// Only draw points with single sets.
|
|
835
|
-
return !!
|
|
715
|
+
return !!this.shapeArgs;
|
|
836
716
|
};
|
|
837
717
|
return VennPoint;
|
|
838
718
|
}(ScatterSeries.prototype.pointClass));
|
|
839
|
-
|
|
840
|
-
draw: DrawPointMixin.drawPoint
|
|
841
|
-
});
|
|
719
|
+
DrawPointComposition.compose(VennPoint);
|
|
842
720
|
/* *
|
|
843
721
|
*
|
|
844
722
|
* Default Export
|
|
@@ -847,7 +725,7 @@
|
|
|
847
725
|
|
|
848
726
|
return VennPoint;
|
|
849
727
|
});
|
|
850
|
-
_registerModule(_modules, 'Series/Venn/VennUtils.js', [_modules['Core/Geometry/CircleUtilities.js'], _modules['Core/Geometry/GeometryUtilities.js'], _modules['
|
|
728
|
+
_registerModule(_modules, 'Series/Venn/VennUtils.js', [_modules['Core/Geometry/CircleUtilities.js'], _modules['Core/Geometry/GeometryUtilities.js'], _modules['Core/Utilities.js']], function (CU, GU, U) {
|
|
851
729
|
/* *
|
|
852
730
|
*
|
|
853
731
|
* Experimental Highcharts module which enables visualization of a Venn
|
|
@@ -878,523 +756,658 @@
|
|
|
878
756
|
isString = U.isString;
|
|
879
757
|
/* *
|
|
880
758
|
*
|
|
881
|
-
*
|
|
759
|
+
* Functions
|
|
882
760
|
*
|
|
883
761
|
* */
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
// Sum up the amount of overlap for each set.
|
|
918
|
-
.reduce(function (map,
|
|
919
|
-
relation) {
|
|
920
|
-
relation.sets.forEach(function (set,
|
|
921
|
-
i,
|
|
922
|
-
arr) {
|
|
923
|
-
if (!isObject(map[set])) {
|
|
924
|
-
map[set] = {
|
|
925
|
-
overlapping: {},
|
|
926
|
-
totalOverlap: 0
|
|
927
|
-
};
|
|
928
|
-
}
|
|
929
|
-
map[set].totalOverlap += relation.value;
|
|
930
|
-
map[set].overlapping[arr[1 - i]] = relation.value;
|
|
931
|
-
});
|
|
932
|
-
return map;
|
|
933
|
-
}, {});
|
|
934
|
-
relations
|
|
935
|
-
// Filter out single sets
|
|
936
|
-
.filter(isSet)
|
|
937
|
-
// Extend the set with the calculated properties.
|
|
938
|
-
.forEach(function (set) {
|
|
939
|
-
var properties = mapOfIdToProps[set.sets[0]];
|
|
940
|
-
extend(set, properties);
|
|
762
|
+
/* eslint-disable valid-jsdoc */
|
|
763
|
+
/**
|
|
764
|
+
* Takes an array of relations and adds the properties `totalOverlap` and
|
|
765
|
+
* `overlapping` to each set. The property `totalOverlap` is the sum of
|
|
766
|
+
* value for each relation where this set is included. The property
|
|
767
|
+
* `overlapping` is a map of how much this set is overlapping another set.
|
|
768
|
+
* NOTE: This algorithm ignores relations consisting of more than 2 sets.
|
|
769
|
+
* @private
|
|
770
|
+
* @param {Array<Highcharts.VennRelationObject>} relations
|
|
771
|
+
* The list of relations that should be sorted.
|
|
772
|
+
* @return {Array<Highcharts.VennRelationObject>}
|
|
773
|
+
* Returns the modified input relations with added properties `totalOverlap`
|
|
774
|
+
* and `overlapping`.
|
|
775
|
+
*/
|
|
776
|
+
function addOverlapToSets(relations) {
|
|
777
|
+
// Calculate the amount of overlap per set.
|
|
778
|
+
var mapOfIdToProps = relations
|
|
779
|
+
// Filter out relations consisting of 2 sets.
|
|
780
|
+
.filter(function (relation) { return (relation.sets.length === 2); })
|
|
781
|
+
// Sum up the amount of overlap for each set.
|
|
782
|
+
.reduce(function (map,
|
|
783
|
+
relation) {
|
|
784
|
+
relation.sets.forEach(function (set,
|
|
785
|
+
i,
|
|
786
|
+
arr) {
|
|
787
|
+
if (!isObject(map[set])) {
|
|
788
|
+
map[set] = {
|
|
789
|
+
overlapping: {},
|
|
790
|
+
totalOverlap: 0
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
map[set].totalOverlap += relation.value;
|
|
794
|
+
map[set].overlapping[arr[1 - i]] = relation.value;
|
|
941
795
|
});
|
|
942
|
-
|
|
943
|
-
|
|
796
|
+
return map;
|
|
797
|
+
}, {});
|
|
798
|
+
relations
|
|
799
|
+
// Filter out single sets
|
|
800
|
+
.filter(isSet)
|
|
801
|
+
// Extend the set with the calculated properties.
|
|
802
|
+
.forEach(function (set) {
|
|
803
|
+
var properties = mapOfIdToProps[set.sets[0]];
|
|
804
|
+
extend(set, properties);
|
|
805
|
+
});
|
|
806
|
+
// Returns the modified relations.
|
|
807
|
+
return relations;
|
|
808
|
+
}
|
|
809
|
+
/**
|
|
810
|
+
* Finds the root of a given function. The root is the input value needed
|
|
811
|
+
* for a function to return 0.
|
|
812
|
+
*
|
|
813
|
+
* See https://en.wikipedia.org/wiki/Bisection_method#Algorithm
|
|
814
|
+
*
|
|
815
|
+
* TODO: Add unit tests.
|
|
816
|
+
*
|
|
817
|
+
* @param {Function} f
|
|
818
|
+
* The function to find the root of.
|
|
819
|
+
* @param {number} a
|
|
820
|
+
* The lowest number in the search range.
|
|
821
|
+
* @param {number} b
|
|
822
|
+
* The highest number in the search range.
|
|
823
|
+
* @param {number} [tolerance=1e-10]
|
|
824
|
+
* The allowed difference between the returned value and root.
|
|
825
|
+
* @param {number} [maxIterations=100]
|
|
826
|
+
* The maximum iterations allowed.
|
|
827
|
+
* @return {number}
|
|
828
|
+
* Root number.
|
|
829
|
+
*/
|
|
830
|
+
function bisect(f, a, b, tolerance, maxIterations) {
|
|
831
|
+
var fA = f(a),
|
|
832
|
+
fB = f(b),
|
|
833
|
+
nMax = maxIterations || 100,
|
|
834
|
+
tol = tolerance || 1e-10,
|
|
835
|
+
delta = b - a,
|
|
836
|
+
n = 1,
|
|
837
|
+
x,
|
|
838
|
+
fX;
|
|
839
|
+
if (a >= b) {
|
|
840
|
+
throw new Error('a must be smaller than b.');
|
|
944
841
|
}
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
* Finds the root of a given function. The root is the input value needed
|
|
948
|
-
* for a function to return 0.
|
|
949
|
-
*
|
|
950
|
-
* See https://en.wikipedia.org/wiki/Bisection_method#Algorithm
|
|
951
|
-
*
|
|
952
|
-
* TODO: Add unit tests.
|
|
953
|
-
*
|
|
954
|
-
* @param {Function} f
|
|
955
|
-
* The function to find the root of.
|
|
956
|
-
* @param {number} a
|
|
957
|
-
* The lowest number in the search range.
|
|
958
|
-
* @param {number} b
|
|
959
|
-
* The highest number in the search range.
|
|
960
|
-
* @param {number} [tolerance=1e-10]
|
|
961
|
-
* The allowed difference between the returned value and root.
|
|
962
|
-
* @param {number} [maxIterations=100]
|
|
963
|
-
* The maximum iterations allowed.
|
|
964
|
-
* @return {number}
|
|
965
|
-
* Root number.
|
|
966
|
-
*/
|
|
967
|
-
function bisect(f, a, b, tolerance, maxIterations) {
|
|
968
|
-
var fA = f(a),
|
|
969
|
-
fB = f(b),
|
|
970
|
-
nMax = maxIterations || 100,
|
|
971
|
-
tol = tolerance || 1e-10,
|
|
972
|
-
delta = b - a,
|
|
973
|
-
n = 1,
|
|
974
|
-
x,
|
|
975
|
-
fX;
|
|
976
|
-
if (a >= b) {
|
|
977
|
-
throw new Error('a must be smaller than b.');
|
|
978
|
-
}
|
|
979
|
-
else if (fA * fB > 0) {
|
|
980
|
-
throw new Error('f(a) and f(b) must have opposite signs.');
|
|
981
|
-
}
|
|
982
|
-
if (fA === 0) {
|
|
983
|
-
x = a;
|
|
984
|
-
}
|
|
985
|
-
else if (fB === 0) {
|
|
986
|
-
x = b;
|
|
987
|
-
}
|
|
988
|
-
else {
|
|
989
|
-
while (n++ <= nMax && fX !== 0 && delta > tol) {
|
|
990
|
-
delta = (b - a) / 2;
|
|
991
|
-
x = a + delta;
|
|
992
|
-
fX = f(x);
|
|
993
|
-
// Update low and high for next search interval.
|
|
994
|
-
if (fA * fX > 0) {
|
|
995
|
-
a = x;
|
|
996
|
-
}
|
|
997
|
-
else {
|
|
998
|
-
b = x;
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
1002
|
-
return x;
|
|
842
|
+
else if (fA * fB > 0) {
|
|
843
|
+
throw new Error('f(a) and f(b) must have opposite signs.');
|
|
1003
844
|
}
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
* between two circles too get the desired overlap.
|
|
1007
|
-
* Currently there is no known formula to calculate the distance from the
|
|
1008
|
-
* area of overlap, which makes the bisection method preferred.
|
|
1009
|
-
* @private
|
|
1010
|
-
* @param {number} r1
|
|
1011
|
-
* Radius of the first circle.
|
|
1012
|
-
* @param {number} r2
|
|
1013
|
-
* Radiues of the second circle.
|
|
1014
|
-
* @param {number} overlap
|
|
1015
|
-
* The wanted overlap between the two circles.
|
|
1016
|
-
* @return {number}
|
|
1017
|
-
* Returns the distance needed to get the wanted overlap between the two
|
|
1018
|
-
* circles.
|
|
1019
|
-
*/
|
|
1020
|
-
function getDistanceBetweenCirclesByOverlap(r1, r2, overlap) {
|
|
1021
|
-
var maxDistance = r1 + r2,
|
|
1022
|
-
distance;
|
|
1023
|
-
if (overlap <= 0) {
|
|
1024
|
-
// If overlap is below or equal to zero, then there is no overlap.
|
|
1025
|
-
distance = maxDistance;
|
|
1026
|
-
}
|
|
1027
|
-
else if (getAreaOfCircle(r1 < r2 ? r1 : r2) <= overlap) {
|
|
1028
|
-
// When area of overlap is larger than the area of the smallest
|
|
1029
|
-
// circle, then it is completely overlapping.
|
|
1030
|
-
distance = 0;
|
|
1031
|
-
}
|
|
1032
|
-
else {
|
|
1033
|
-
distance = bisect(function (x) {
|
|
1034
|
-
var actualOverlap = getOverlapBetweenCirclesByDistance(r1,
|
|
1035
|
-
r2,
|
|
1036
|
-
x);
|
|
1037
|
-
// Return the differance between wanted and actual overlap.
|
|
1038
|
-
return overlap - actualOverlap;
|
|
1039
|
-
}, 0, maxDistance);
|
|
1040
|
-
}
|
|
1041
|
-
return distance;
|
|
845
|
+
if (fA === 0) {
|
|
846
|
+
x = a;
|
|
1042
847
|
}
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
* Finds the available width for a label, by taking the label position and
|
|
1046
|
-
* finding the largest distance, which is inside all internal circles, and
|
|
1047
|
-
* outside all external circles.
|
|
1048
|
-
*
|
|
1049
|
-
* @private
|
|
1050
|
-
* @param {Highcharts.PositionObject} pos
|
|
1051
|
-
* The x and y coordinate of the label.
|
|
1052
|
-
* @param {Array<Highcharts.CircleObject>} internal
|
|
1053
|
-
* Internal circles.
|
|
1054
|
-
* @param {Array<Highcharts.CircleObject>} external
|
|
1055
|
-
* External circles.
|
|
1056
|
-
* @return {number}
|
|
1057
|
-
* Returns available width for the label.
|
|
1058
|
-
*/
|
|
1059
|
-
function getLabelWidth(pos, internal, external) {
|
|
1060
|
-
var radius = internal.reduce(function (min,
|
|
1061
|
-
circle) { return Math.min(circle.r,
|
|
1062
|
-
min); },
|
|
1063
|
-
Infinity),
|
|
1064
|
-
// Filter out external circles that are completely overlapping.
|
|
1065
|
-
filteredExternals = external.filter(function (circle) {
|
|
1066
|
-
return !isPointInsideCircle(pos,
|
|
1067
|
-
circle);
|
|
1068
|
-
});
|
|
1069
|
-
var findDistance = function (maxDistance,
|
|
1070
|
-
direction) {
|
|
1071
|
-
return bisect(function (x) {
|
|
1072
|
-
var testPos = {
|
|
1073
|
-
x: pos.x + (direction * x),
|
|
1074
|
-
y: pos.y
|
|
1075
|
-
},
|
|
1076
|
-
isValid = (isPointInsideAllCircles(testPos,
|
|
1077
|
-
internal) &&
|
|
1078
|
-
isPointOutsideAllCircles(testPos,
|
|
1079
|
-
filteredExternals));
|
|
1080
|
-
// If the position is valid, then we want to move towards the
|
|
1081
|
-
// max distance. If not, then we want to away from the max
|
|
1082
|
-
// distance.
|
|
1083
|
-
return -(maxDistance - x) + (isValid ? 0 : Number.MAX_VALUE);
|
|
1084
|
-
}, 0, maxDistance);
|
|
1085
|
-
};
|
|
1086
|
-
// Find the smallest distance of left and right.
|
|
1087
|
-
return Math.min(findDistance(radius, -1), findDistance(radius, 1)) * 2;
|
|
1088
|
-
}
|
|
1089
|
-
VennUtils.getLabelWidth = getLabelWidth;
|
|
1090
|
-
/**
|
|
1091
|
-
* Calculates a margin for a point based on the iternal and external
|
|
1092
|
-
* circles. The margin describes if the point is well placed within the
|
|
1093
|
-
* internal circles, and away from the external.
|
|
1094
|
-
* @private
|
|
1095
|
-
* @todo add unit tests.
|
|
1096
|
-
* @param {Highcharts.PositionObject} point
|
|
1097
|
-
* The point to evaluate.
|
|
1098
|
-
* @param {Array<Highcharts.CircleObject>} internal
|
|
1099
|
-
* The internal circles.
|
|
1100
|
-
* @param {Array<Highcharts.CircleObject>} external
|
|
1101
|
-
* The external circles.
|
|
1102
|
-
* @return {number}
|
|
1103
|
-
* Returns the margin.
|
|
1104
|
-
*/
|
|
1105
|
-
function getMarginFromCircles(point, internal, external) {
|
|
1106
|
-
var margin = internal.reduce(function (margin,
|
|
1107
|
-
circle) {
|
|
1108
|
-
var m = circle.r - getDistanceBetweenPoints(point,
|
|
1109
|
-
circle);
|
|
1110
|
-
return (m <= margin) ? m : margin;
|
|
1111
|
-
}, Number.MAX_VALUE);
|
|
1112
|
-
margin = external.reduce(function (margin, circle) {
|
|
1113
|
-
var m = getDistanceBetweenPoints(point,
|
|
1114
|
-
circle) - circle.r;
|
|
1115
|
-
return (m <= margin) ? m : margin;
|
|
1116
|
-
}, margin);
|
|
1117
|
-
return margin;
|
|
848
|
+
else if (fB === 0) {
|
|
849
|
+
x = b;
|
|
1118
850
|
}
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
// When there is only two circles we can find the overlap by using their
|
|
1132
|
-
// radiuses and the distance between them.
|
|
1133
|
-
if (circles.length === 2) {
|
|
1134
|
-
var circle1 = circles[0];
|
|
1135
|
-
var circle2 = circles[1];
|
|
1136
|
-
overlap = getOverlapBetweenCirclesByDistance(circle1.r, circle2.r, getDistanceBetweenPoints(circle1, circle2));
|
|
851
|
+
else {
|
|
852
|
+
while (n++ <= nMax && fX !== 0 && delta > tol) {
|
|
853
|
+
delta = (b - a) / 2;
|
|
854
|
+
x = a + delta;
|
|
855
|
+
fX = f(x);
|
|
856
|
+
// Update low and high for next search interval.
|
|
857
|
+
if (fA * fX > 0) {
|
|
858
|
+
a = x;
|
|
859
|
+
}
|
|
860
|
+
else {
|
|
861
|
+
b = x;
|
|
862
|
+
}
|
|
1137
863
|
}
|
|
1138
|
-
return overlap;
|
|
1139
864
|
}
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
865
|
+
return x;
|
|
866
|
+
}
|
|
867
|
+
/**
|
|
868
|
+
* @private
|
|
869
|
+
*/
|
|
870
|
+
function getCentroid(simplex) {
|
|
871
|
+
var arr = simplex.slice(0, -1),
|
|
872
|
+
length = arr.length,
|
|
873
|
+
result = [],
|
|
874
|
+
sum = function (data,
|
|
875
|
+
point) {
|
|
876
|
+
data.sum += point[data.i];
|
|
877
|
+
return data;
|
|
878
|
+
};
|
|
879
|
+
for (var i = 0; i < length; i++) {
|
|
880
|
+
result[i] = arr.reduce(sum, { sum: 0, i: i }).sum / length;
|
|
1143
881
|
}
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
882
|
+
return result;
|
|
883
|
+
}
|
|
884
|
+
/**
|
|
885
|
+
* Uses the bisection method to make a best guess of the ideal distance
|
|
886
|
+
* between two circles too get the desired overlap.
|
|
887
|
+
* Currently there is no known formula to calculate the distance from the
|
|
888
|
+
* area of overlap, which makes the bisection method preferred.
|
|
889
|
+
* @private
|
|
890
|
+
* @param {number} r1
|
|
891
|
+
* Radius of the first circle.
|
|
892
|
+
* @param {number} r2
|
|
893
|
+
* Radiues of the second circle.
|
|
894
|
+
* @param {number} overlap
|
|
895
|
+
* The wanted overlap between the two circles.
|
|
896
|
+
* @return {number}
|
|
897
|
+
* Returns the distance needed to get the wanted overlap between the two
|
|
898
|
+
* circles.
|
|
899
|
+
*/
|
|
900
|
+
function getDistanceBetweenCirclesByOverlap(r1, r2, overlap) {
|
|
901
|
+
var maxDistance = r1 + r2,
|
|
902
|
+
distance;
|
|
903
|
+
if (overlap <= 0) {
|
|
904
|
+
// If overlap is below or equal to zero, then there is no overlap.
|
|
905
|
+
distance = maxDistance;
|
|
906
|
+
}
|
|
907
|
+
else if (getAreaOfCircle(r1 < r2 ? r1 : r2) <= overlap) {
|
|
908
|
+
// When area of overlap is larger than the area of the smallest
|
|
909
|
+
// circle, then it is completely overlapping.
|
|
910
|
+
distance = 0;
|
|
1161
911
|
}
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
912
|
+
else {
|
|
913
|
+
distance = bisect(function (x) {
|
|
914
|
+
var actualOverlap = getOverlapBetweenCirclesByDistance(r1,
|
|
915
|
+
r2,
|
|
916
|
+
x);
|
|
917
|
+
// Return the differance between wanted and actual overlap.
|
|
918
|
+
return overlap - actualOverlap;
|
|
919
|
+
}, 0, maxDistance);
|
|
920
|
+
}
|
|
921
|
+
return distance;
|
|
922
|
+
}
|
|
923
|
+
/**
|
|
924
|
+
* Finds the available width for a label, by taking the label position and
|
|
925
|
+
* finding the largest distance, which is inside all internal circles, and
|
|
926
|
+
* outside all external circles.
|
|
927
|
+
*
|
|
928
|
+
* @private
|
|
929
|
+
* @param {Highcharts.PositionObject} pos
|
|
930
|
+
* The x and y coordinate of the label.
|
|
931
|
+
* @param {Array<Highcharts.CircleObject>} internal
|
|
932
|
+
* Internal circles.
|
|
933
|
+
* @param {Array<Highcharts.CircleObject>} external
|
|
934
|
+
* External circles.
|
|
935
|
+
* @return {number}
|
|
936
|
+
* Returns available width for the label.
|
|
937
|
+
*/
|
|
938
|
+
function getLabelWidth(pos, internal, external) {
|
|
939
|
+
var radius = internal.reduce(function (min,
|
|
940
|
+
circle) { return Math.min(circle.r,
|
|
941
|
+
min); },
|
|
942
|
+
Infinity),
|
|
943
|
+
// Filter out external circles that are completely overlapping.
|
|
944
|
+
filteredExternals = external.filter(function (circle) {
|
|
945
|
+
return !isPointInsideCircle(pos,
|
|
946
|
+
circle);
|
|
947
|
+
});
|
|
948
|
+
var findDistance = function (maxDistance,
|
|
949
|
+
direction) {
|
|
950
|
+
return bisect(function (x) {
|
|
951
|
+
var testPos = {
|
|
952
|
+
x: pos.x + (direction * x),
|
|
953
|
+
y: pos.y
|
|
954
|
+
},
|
|
955
|
+
isValid = (isPointInsideAllCircles(testPos,
|
|
956
|
+
internal) &&
|
|
957
|
+
isPointOutsideAllCircles(testPos,
|
|
958
|
+
filteredExternals));
|
|
959
|
+
// If the position is valid, then we want to move towards the
|
|
960
|
+
// max distance. If not, then we want to away from the max
|
|
961
|
+
// distance.
|
|
962
|
+
return -(maxDistance - x) + (isValid ? 0 : Number.MAX_VALUE);
|
|
963
|
+
}, 0, maxDistance);
|
|
964
|
+
};
|
|
965
|
+
// Find the smallest distance of left and right.
|
|
966
|
+
return Math.min(findDistance(radius, -1), findDistance(radius, 1)) * 2;
|
|
967
|
+
}
|
|
968
|
+
/**
|
|
969
|
+
* Calculates a margin for a point based on the iternal and external
|
|
970
|
+
* circles. The margin describes if the point is well placed within the
|
|
971
|
+
* internal circles, and away from the external.
|
|
972
|
+
* @private
|
|
973
|
+
* @todo add unit tests.
|
|
974
|
+
* @param {Highcharts.PositionObject} point
|
|
975
|
+
* The point to evaluate.
|
|
976
|
+
* @param {Array<Highcharts.CircleObject>} internal
|
|
977
|
+
* The internal circles.
|
|
978
|
+
* @param {Array<Highcharts.CircleObject>} external
|
|
979
|
+
* The external circles.
|
|
980
|
+
* @return {number}
|
|
981
|
+
* Returns the margin.
|
|
982
|
+
*/
|
|
983
|
+
function getMarginFromCircles(point, internal, external) {
|
|
984
|
+
var margin = internal.reduce(function (margin,
|
|
985
|
+
circle) {
|
|
986
|
+
var m = circle.r - getDistanceBetweenPoints(point,
|
|
987
|
+
circle);
|
|
988
|
+
return (m <= margin) ? m : margin;
|
|
989
|
+
}, Number.MAX_VALUE);
|
|
990
|
+
margin = external.reduce(function (margin, circle) {
|
|
991
|
+
var m = getDistanceBetweenPoints(point,
|
|
992
|
+
circle) - circle.r;
|
|
993
|
+
return (m <= margin) ? m : margin;
|
|
994
|
+
}, margin);
|
|
995
|
+
return margin;
|
|
996
|
+
}
|
|
997
|
+
/**
|
|
998
|
+
* Calculates the area of overlap between a list of circles.
|
|
999
|
+
* @private
|
|
1000
|
+
* @todo add support for calculating overlap between more than 2 circles.
|
|
1001
|
+
* @param {Array<Highcharts.CircleObject>} circles
|
|
1002
|
+
* List of circles with their given positions.
|
|
1003
|
+
* @return {number}
|
|
1004
|
+
* Returns the area of overlap between all the circles.
|
|
1005
|
+
*/
|
|
1006
|
+
function getOverlapBetweenCircles(circles) {
|
|
1007
|
+
var overlap = 0;
|
|
1008
|
+
// When there is only two circles we can find the overlap by using their
|
|
1009
|
+
// radiuses and the distance between them.
|
|
1010
|
+
if (circles.length === 2) {
|
|
1011
|
+
var circle1 = circles[0];
|
|
1012
|
+
var circle2 = circles[1];
|
|
1013
|
+
overlap = getOverlapBetweenCirclesByDistance(circle1.r, circle2.r, getDistanceBetweenPoints(circle1, circle2));
|
|
1165
1014
|
}
|
|
1015
|
+
return overlap;
|
|
1016
|
+
}
|
|
1017
|
+
// eslint-disable-next-line require-jsdoc
|
|
1018
|
+
function isSet(x) {
|
|
1019
|
+
return isArray(x.sets) && x.sets.length === 1;
|
|
1020
|
+
}
|
|
1021
|
+
// eslint-disable-next-line require-jsdoc
|
|
1022
|
+
function isValidRelation(x) {
|
|
1023
|
+
var map = {};
|
|
1024
|
+
return (isObject(x) &&
|
|
1025
|
+
(isNumber(x.value) && x.value > -1) &&
|
|
1026
|
+
(isArray(x.sets) && x.sets.length > 0) &&
|
|
1027
|
+
!x.sets.some(function (set) {
|
|
1028
|
+
var invalid = false;
|
|
1029
|
+
if (!map[set] && isString(set)) {
|
|
1030
|
+
map[set] = true;
|
|
1031
|
+
}
|
|
1032
|
+
else {
|
|
1033
|
+
invalid = true;
|
|
1034
|
+
}
|
|
1035
|
+
return invalid;
|
|
1036
|
+
}));
|
|
1037
|
+
}
|
|
1038
|
+
// eslint-disable-next-line require-jsdoc
|
|
1039
|
+
function isValidSet(x) {
|
|
1040
|
+
return (isValidRelation(x) && isSet(x) && x.value > 0);
|
|
1041
|
+
}
|
|
1042
|
+
/**
|
|
1043
|
+
* Uses a greedy approach to position all the sets. Works well with a small
|
|
1044
|
+
* number of sets, and are in these cases a good choice aesthetically.
|
|
1045
|
+
* @private
|
|
1046
|
+
* @param {Array<object>} relations List of the overlap between two or more
|
|
1047
|
+
* sets, or the size of a single set.
|
|
1048
|
+
* @return {Array<object>} List of circles and their calculated positions.
|
|
1049
|
+
*/
|
|
1050
|
+
function layoutGreedyVenn(relations) {
|
|
1051
|
+
var positionedSets = [],
|
|
1052
|
+
mapOfIdToCircles = {};
|
|
1053
|
+
// Define a circle for each set.
|
|
1054
|
+
relations
|
|
1055
|
+
.filter(function (relation) {
|
|
1056
|
+
return relation.sets.length === 1;
|
|
1057
|
+
}).forEach(function (relation) {
|
|
1058
|
+
mapOfIdToCircles[relation.sets[0]] = relation.circle = {
|
|
1059
|
+
x: Number.MAX_VALUE,
|
|
1060
|
+
y: Number.MAX_VALUE,
|
|
1061
|
+
r: Math.sqrt(relation.value / Math.PI)
|
|
1062
|
+
};
|
|
1063
|
+
});
|
|
1166
1064
|
/**
|
|
1167
|
-
*
|
|
1168
|
-
*
|
|
1065
|
+
* Takes a set and updates the position, and add the set to the list of
|
|
1066
|
+
* positioned sets.
|
|
1169
1067
|
* @private
|
|
1170
|
-
* @param {
|
|
1171
|
-
*
|
|
1172
|
-
* @
|
|
1068
|
+
* @param {Object} set
|
|
1069
|
+
* The set to add to its final position.
|
|
1070
|
+
* @param {Object} coordinates
|
|
1071
|
+
* The coordinates to position the set at.
|
|
1173
1072
|
*/
|
|
1174
|
-
function
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
var
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
//
|
|
1228
|
-
|
|
1229
|
-
positionedCircle.
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
y: positionedCircle.y },
|
|
1238
|
-
{ x: positionedCircle.x,
|
|
1239
|
-
y: positionedCircle.y + distance },
|
|
1240
|
-
{ x: positionedCircle.x,
|
|
1241
|
-
y: positionedCircle.y - distance }
|
|
1242
|
-
];
|
|
1243
|
-
// If there are more circles overlapping, then add the
|
|
1244
|
-
// intersection points as possible positions.
|
|
1245
|
-
positionedSets.slice(i + 1).forEach(function (positionedSet2) {
|
|
1246
|
-
var positionedCircle2 = positionedSet2.circle,
|
|
1247
|
-
overlap2 = overlapping[positionedSet2.sets[0]],
|
|
1248
|
-
distance2 = getDistanceBetweenCirclesByOverlap(radius,
|
|
1249
|
-
positionedCircle2.r,
|
|
1250
|
-
overlap2);
|
|
1251
|
-
// Add intersections to list of coordinates.
|
|
1252
|
-
possibleCoordinates = possibleCoordinates.concat(getCircleCircleIntersection({
|
|
1253
|
-
x: positionedCircle.x,
|
|
1254
|
-
y: positionedCircle.y,
|
|
1255
|
-
r: distance
|
|
1256
|
-
}, {
|
|
1257
|
-
x: positionedCircle2.x,
|
|
1258
|
-
y: positionedCircle2.y,
|
|
1259
|
-
r: distance2
|
|
1260
|
-
}));
|
|
1261
|
-
});
|
|
1262
|
-
// Iterate all suggested coordinates and find the best one.
|
|
1263
|
-
possibleCoordinates.forEach(function (coordinates) {
|
|
1264
|
-
circle.x = coordinates.x;
|
|
1265
|
-
circle.y = coordinates.y;
|
|
1266
|
-
// Calculate loss for the suggested coordinates.
|
|
1267
|
-
var currentLoss = loss(mapOfIdToCircles,
|
|
1268
|
-
relationsWithTwoSets);
|
|
1269
|
-
// If the loss is better, then use these new coordinates
|
|
1270
|
-
if (currentLoss < best.loss) {
|
|
1271
|
-
best.loss = currentLoss;
|
|
1272
|
-
best.coordinates = coordinates;
|
|
1273
|
-
}
|
|
1274
|
-
});
|
|
1275
|
-
// Return resulting coordinates.
|
|
1276
|
-
return best;
|
|
1277
|
-
}, {
|
|
1278
|
-
loss: Number.MAX_VALUE,
|
|
1279
|
-
coordinates: void 0
|
|
1073
|
+
var positionSet = function positionSet(set,
|
|
1074
|
+
coordinates) {
|
|
1075
|
+
var circle = set.circle;
|
|
1076
|
+
circle.x = coordinates.x;
|
|
1077
|
+
circle.y = coordinates.y;
|
|
1078
|
+
positionedSets.push(set);
|
|
1079
|
+
};
|
|
1080
|
+
// Find overlap between sets. Ignore relations with more then 2 sets.
|
|
1081
|
+
addOverlapToSets(relations);
|
|
1082
|
+
// Sort sets by the sum of their size from large to small.
|
|
1083
|
+
var sortedByOverlap = relations
|
|
1084
|
+
.filter(isSet)
|
|
1085
|
+
.sort(sortByTotalOverlap);
|
|
1086
|
+
// Position the most overlapped set at 0,0.
|
|
1087
|
+
positionSet(sortedByOverlap.shift(), { x: 0, y: 0 });
|
|
1088
|
+
var relationsWithTwoSets = relations.filter(function (x) {
|
|
1089
|
+
return x.sets.length === 2;
|
|
1090
|
+
});
|
|
1091
|
+
// Iterate and position the remaining sets.
|
|
1092
|
+
sortedByOverlap.forEach(function (set) {
|
|
1093
|
+
var circle = set.circle,
|
|
1094
|
+
radius = circle.r,
|
|
1095
|
+
overlapping = set.overlapping;
|
|
1096
|
+
var bestPosition = positionedSets.reduce(function (best,
|
|
1097
|
+
positionedSet,
|
|
1098
|
+
i) {
|
|
1099
|
+
var positionedCircle = positionedSet.circle,
|
|
1100
|
+
overlap = overlapping[positionedSet.sets[0]];
|
|
1101
|
+
// Calculate the distance between the sets to get the
|
|
1102
|
+
// correct overlap
|
|
1103
|
+
var distance = getDistanceBetweenCirclesByOverlap(radius,
|
|
1104
|
+
positionedCircle.r,
|
|
1105
|
+
overlap);
|
|
1106
|
+
// Create a list of possible coordinates calculated from
|
|
1107
|
+
// distance.
|
|
1108
|
+
var possibleCoordinates = [
|
|
1109
|
+
{ x: positionedCircle.x + distance,
|
|
1110
|
+
y: positionedCircle.y },
|
|
1111
|
+
{ x: positionedCircle.x - distance,
|
|
1112
|
+
y: positionedCircle.y },
|
|
1113
|
+
{ x: positionedCircle.x,
|
|
1114
|
+
y: positionedCircle.y + distance },
|
|
1115
|
+
{ x: positionedCircle.x,
|
|
1116
|
+
y: positionedCircle.y - distance }
|
|
1117
|
+
];
|
|
1118
|
+
// If there are more circles overlapping, then add the
|
|
1119
|
+
// intersection points as possible positions.
|
|
1120
|
+
positionedSets.slice(i + 1).forEach(function (positionedSet2) {
|
|
1121
|
+
var positionedCircle2 = positionedSet2.circle,
|
|
1122
|
+
overlap2 = overlapping[positionedSet2.sets[0]],
|
|
1123
|
+
distance2 = getDistanceBetweenCirclesByOverlap(radius,
|
|
1124
|
+
positionedCircle2.r,
|
|
1125
|
+
overlap2);
|
|
1126
|
+
// Add intersections to list of coordinates.
|
|
1127
|
+
possibleCoordinates = possibleCoordinates.concat(getCircleCircleIntersection({
|
|
1128
|
+
x: positionedCircle.x,
|
|
1129
|
+
y: positionedCircle.y,
|
|
1130
|
+
r: distance
|
|
1131
|
+
}, {
|
|
1132
|
+
x: positionedCircle2.x,
|
|
1133
|
+
y: positionedCircle2.y,
|
|
1134
|
+
r: distance2
|
|
1135
|
+
}));
|
|
1280
1136
|
});
|
|
1281
|
-
//
|
|
1282
|
-
|
|
1137
|
+
// Iterate all suggested coordinates and find the best one.
|
|
1138
|
+
possibleCoordinates.forEach(function (coordinates) {
|
|
1139
|
+
circle.x = coordinates.x;
|
|
1140
|
+
circle.y = coordinates.y;
|
|
1141
|
+
// Calculate loss for the suggested coordinates.
|
|
1142
|
+
var currentLoss = loss(mapOfIdToCircles,
|
|
1143
|
+
relationsWithTwoSets);
|
|
1144
|
+
// If the loss is better, then use these new coordinates
|
|
1145
|
+
if (currentLoss < best.loss) {
|
|
1146
|
+
best.loss = currentLoss;
|
|
1147
|
+
best.coordinates = coordinates;
|
|
1148
|
+
}
|
|
1149
|
+
});
|
|
1150
|
+
// Return resulting coordinates.
|
|
1151
|
+
return best;
|
|
1152
|
+
}, {
|
|
1153
|
+
loss: Number.MAX_VALUE,
|
|
1154
|
+
coordinates: void 0
|
|
1283
1155
|
});
|
|
1284
|
-
//
|
|
1285
|
-
|
|
1286
|
-
}
|
|
1287
|
-
|
|
1156
|
+
// Add the set to its final position.
|
|
1157
|
+
positionSet(set, bestPosition.coordinates);
|
|
1158
|
+
});
|
|
1159
|
+
// Return the positions of each set.
|
|
1160
|
+
return mapOfIdToCircles;
|
|
1161
|
+
}
|
|
1162
|
+
/**
|
|
1163
|
+
* Calculates the difference between the desired overlap and the actual
|
|
1164
|
+
* overlap between two circles.
|
|
1165
|
+
* @private
|
|
1166
|
+
* @param {Dictionary<Highcharts.CircleObject>} mapOfIdToCircle
|
|
1167
|
+
* Map from id to circle.
|
|
1168
|
+
* @param {Array<Highcharts.VennRelationObject>} relations
|
|
1169
|
+
* List of relations to calculate the loss of.
|
|
1170
|
+
* @return {number}
|
|
1171
|
+
* Returns the loss between positions of the circles for the given
|
|
1172
|
+
* relations.
|
|
1173
|
+
*/
|
|
1174
|
+
function loss(mapOfIdToCircle, relations) {
|
|
1175
|
+
var precision = 10e10;
|
|
1176
|
+
// Iterate all the relations and calculate their individual loss.
|
|
1177
|
+
return relations.reduce(function (totalLoss, relation) {
|
|
1178
|
+
var loss = 0;
|
|
1179
|
+
if (relation.sets.length > 1) {
|
|
1180
|
+
var wantedOverlap = relation.value;
|
|
1181
|
+
// Calculate the actual overlap between the sets.
|
|
1182
|
+
var actualOverlap = getOverlapBetweenCircles(
|
|
1183
|
+
// Get the circles for the given sets.
|
|
1184
|
+
relation.sets.map(function (set) {
|
|
1185
|
+
return mapOfIdToCircle[set];
|
|
1186
|
+
}));
|
|
1187
|
+
var diff = wantedOverlap - actualOverlap;
|
|
1188
|
+
loss = Math.round((diff * diff) * precision) / precision;
|
|
1189
|
+
}
|
|
1190
|
+
// Add calculated loss to the sum.
|
|
1191
|
+
return totalLoss + loss;
|
|
1192
|
+
}, 0);
|
|
1193
|
+
}
|
|
1194
|
+
/**
|
|
1195
|
+
* Finds an optimal position for a given point.
|
|
1196
|
+
* @todo add unit tests.
|
|
1197
|
+
* @todo add constraints to optimize the algorithm.
|
|
1198
|
+
* @private
|
|
1199
|
+
* @param {Highcharts.NelderMeadTestFunction} fn
|
|
1200
|
+
* The function to test a point.
|
|
1201
|
+
* @param {Highcharts.NelderMeadPointArray} initial
|
|
1202
|
+
* The initial point to optimize.
|
|
1203
|
+
* @return {Highcharts.NelderMeadPointArray}
|
|
1204
|
+
* Returns the opimized position of a point.
|
|
1205
|
+
*/
|
|
1206
|
+
function nelderMead(fn, initial) {
|
|
1207
|
+
var maxIterations = 100,
|
|
1208
|
+
sortByFx = function (a,
|
|
1209
|
+
b) {
|
|
1210
|
+
return a.fx - b.fx;
|
|
1211
|
+
}, pRef = 1, // Reflection parameter
|
|
1212
|
+
pExp = 2, // Expansion parameter
|
|
1213
|
+
pCon = -0.5, // Contraction parameter
|
|
1214
|
+
pOCon = pCon * pRef, // Outwards contraction parameter
|
|
1215
|
+
pShrink = 0.5; // Shrink parameter
|
|
1288
1216
|
/**
|
|
1289
|
-
* Calculates the difference between the desired overlap and the actual
|
|
1290
|
-
* overlap between two circles.
|
|
1291
1217
|
* @private
|
|
1292
|
-
* @param {Dictionary<Highcharts.CircleObject>} mapOfIdToCircle
|
|
1293
|
-
* Map from id to circle.
|
|
1294
|
-
* @param {Array<Highcharts.VennRelationObject>} relations
|
|
1295
|
-
* List of relations to calculate the loss of.
|
|
1296
|
-
* @return {number}
|
|
1297
|
-
* Returns the loss between positions of the circles for the given
|
|
1298
|
-
* relations.
|
|
1299
1218
|
*/
|
|
1300
|
-
function
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
return
|
|
1304
|
-
|
|
1305
|
-
if (relation.sets.length > 1) {
|
|
1306
|
-
var wantedOverlap = relation.value;
|
|
1307
|
-
// Calculate the actual overlap between the sets.
|
|
1308
|
-
var actualOverlap = getOverlapBetweenCircles(
|
|
1309
|
-
// Get the circles for the given sets.
|
|
1310
|
-
relation.sets.map(function (set) {
|
|
1311
|
-
return mapOfIdToCircle[set];
|
|
1312
|
-
}));
|
|
1313
|
-
var diff = wantedOverlap - actualOverlap;
|
|
1314
|
-
loss = Math.round((diff * diff) * precision) / precision;
|
|
1315
|
-
}
|
|
1316
|
-
// Add calculated loss to the sum.
|
|
1317
|
-
return totalLoss + loss;
|
|
1318
|
-
}, 0);
|
|
1319
|
-
}
|
|
1320
|
-
VennUtils.loss = loss;
|
|
1219
|
+
var weightedSum = function (weight1,
|
|
1220
|
+
v1,
|
|
1221
|
+
weight2,
|
|
1222
|
+
v2) { return v1.map(function (x,
|
|
1223
|
+
i) { return weight1 * x + weight2 * v2[i]; }); };
|
|
1321
1224
|
/**
|
|
1322
|
-
* Prepares the venn data so that it is usable for the layout function.
|
|
1323
|
-
* Filter out sets, or intersections that includes sets, that are missing in
|
|
1324
|
-
* the data or has (value < 1). Adds missing relations between sets in the
|
|
1325
|
-
* data as value = 0.
|
|
1326
1225
|
* @private
|
|
1327
|
-
* @param {Array<object>} data The raw input data.
|
|
1328
|
-
* @return {Array<object>} Returns an array of valid venn data.
|
|
1329
1226
|
*/
|
|
1330
|
-
function
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1227
|
+
var getSimplex = function (initial) {
|
|
1228
|
+
var n = initial.length,
|
|
1229
|
+
simplex = new Array(n + 1);
|
|
1230
|
+
// Initial point to the simplex.
|
|
1231
|
+
simplex[0] = initial;
|
|
1232
|
+
simplex[0].fx = fn(initial);
|
|
1233
|
+
// Create a set of extra points based on the initial.
|
|
1234
|
+
for (var i = 0; i < n; ++i) {
|
|
1235
|
+
var point = initial.slice();
|
|
1236
|
+
point[i] = point[i] ? point[i] * 1.05 : 0.001;
|
|
1237
|
+
point.fx = fn(point);
|
|
1238
|
+
simplex[i + 1] = point;
|
|
1239
|
+
}
|
|
1240
|
+
return simplex;
|
|
1241
|
+
};
|
|
1242
|
+
var updateSimplex = function (simplex,
|
|
1243
|
+
point) {
|
|
1244
|
+
point.fx = fn(point);
|
|
1245
|
+
simplex[simplex.length - 1] = point;
|
|
1246
|
+
return simplex;
|
|
1247
|
+
};
|
|
1248
|
+
var shrinkSimplex = function (simplex) {
|
|
1249
|
+
var best = simplex[0];
|
|
1250
|
+
return simplex.map(function (point) {
|
|
1251
|
+
var p = weightedSum(1 - pShrink,
|
|
1252
|
+
best,
|
|
1253
|
+
pShrink,
|
|
1254
|
+
point);
|
|
1255
|
+
p.fx = fn(p);
|
|
1256
|
+
return p;
|
|
1257
|
+
});
|
|
1258
|
+
};
|
|
1259
|
+
var getPoint = function (centroid,
|
|
1260
|
+
worst,
|
|
1261
|
+
a,
|
|
1262
|
+
b) {
|
|
1263
|
+
var point = weightedSum(a,
|
|
1264
|
+
centroid,
|
|
1265
|
+
b,
|
|
1266
|
+
worst);
|
|
1267
|
+
point.fx = fn(point);
|
|
1268
|
+
return point;
|
|
1269
|
+
};
|
|
1270
|
+
// Create a simplex
|
|
1271
|
+
var simplex = getSimplex(initial);
|
|
1272
|
+
// Iterate from 0 to max iterations
|
|
1273
|
+
for (var i = 0; i < maxIterations; i++) {
|
|
1274
|
+
// Sort the simplex
|
|
1275
|
+
simplex.sort(sortByFx);
|
|
1276
|
+
// Create a centroid from the simplex
|
|
1277
|
+
var worst = simplex[simplex.length - 1];
|
|
1278
|
+
var centroid = getCentroid(simplex);
|
|
1279
|
+
// Calculate the reflected point.
|
|
1280
|
+
var reflected = getPoint(centroid,
|
|
1281
|
+
worst, 1 + pRef, -pRef);
|
|
1282
|
+
if (reflected.fx < simplex[0].fx) {
|
|
1283
|
+
// If reflected point is the best, then possibly expand.
|
|
1284
|
+
var expanded = getPoint(centroid,
|
|
1285
|
+
worst, 1 + pExp, -pExp);
|
|
1286
|
+
simplex = updateSimplex(simplex, (expanded.fx < reflected.fx) ? expanded : reflected);
|
|
1287
|
+
}
|
|
1288
|
+
else if (reflected.fx >= simplex[simplex.length - 2].fx) {
|
|
1289
|
+
// If the reflected point is worse than the second worse, then
|
|
1290
|
+
// contract.
|
|
1291
|
+
var contracted = void 0;
|
|
1292
|
+
if (reflected.fx > worst.fx) {
|
|
1293
|
+
// If the reflected is worse than the worst point, do a
|
|
1294
|
+
// contraction
|
|
1295
|
+
contracted = getPoint(centroid, worst, 1 + pCon, -pCon);
|
|
1296
|
+
if (contracted.fx < worst.fx) {
|
|
1297
|
+
simplex = updateSimplex(simplex, contracted);
|
|
1298
|
+
}
|
|
1299
|
+
else {
|
|
1300
|
+
simplex = shrinkSimplex(simplex);
|
|
1301
|
+
}
|
|
1350
1302
|
}
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
if (!mapOfIdToRelation[combination]) {
|
|
1361
|
-
var obj = {
|
|
1362
|
-
sets: combination.split(','),
|
|
1363
|
-
value: 0
|
|
1364
|
-
};
|
|
1365
|
-
mapOfIdToRelation[combination] = obj;
|
|
1303
|
+
else {
|
|
1304
|
+
// Otherwise do an outwards contraction
|
|
1305
|
+
contracted = getPoint(centroid, worst, 1 - pOCon, pOCon);
|
|
1306
|
+
if (contracted.fx < reflected.fx) {
|
|
1307
|
+
simplex = updateSimplex(simplex, contracted);
|
|
1308
|
+
}
|
|
1309
|
+
else {
|
|
1310
|
+
simplex = shrinkSimplex(simplex);
|
|
1311
|
+
}
|
|
1366
1312
|
}
|
|
1367
|
-
}
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
.map(function (id) {
|
|
1372
|
-
return mapOfIdToRelation[id];
|
|
1373
|
-
});
|
|
1374
|
-
}
|
|
1375
|
-
VennUtils.processVennData = processVennData;
|
|
1376
|
-
/**
|
|
1377
|
-
* Takes two sets and finds the one with the largest total overlap.
|
|
1378
|
-
* @private
|
|
1379
|
-
* @param {object} a The first set to compare.
|
|
1380
|
-
* @param {object} b The second set to compare.
|
|
1381
|
-
* @return {number} Returns 0 if a and b are equal, <0 if a is greater, >0 if b
|
|
1382
|
-
* is greater.
|
|
1383
|
-
*/
|
|
1384
|
-
function sortByTotalOverlap(a, b) {
|
|
1385
|
-
return b.totalOverlap - a.totalOverlap;
|
|
1313
|
+
}
|
|
1314
|
+
else {
|
|
1315
|
+
simplex = updateSimplex(simplex, reflected);
|
|
1316
|
+
}
|
|
1386
1317
|
}
|
|
1387
|
-
|
|
1388
|
-
}
|
|
1318
|
+
return simplex[0];
|
|
1319
|
+
}
|
|
1320
|
+
/**
|
|
1321
|
+
* Prepares the venn data so that it is usable for the layout function.
|
|
1322
|
+
* Filter out sets, or intersections that includes sets, that are missing in
|
|
1323
|
+
* the data or has (value < 1). Adds missing relations between sets in the
|
|
1324
|
+
* data as value = 0.
|
|
1325
|
+
* @private
|
|
1326
|
+
* @param {Array<object>} data The raw input data.
|
|
1327
|
+
* @return {Array<object>} Returns an array of valid venn data.
|
|
1328
|
+
*/
|
|
1329
|
+
function processVennData(data) {
|
|
1330
|
+
var d = isArray(data) ? data : [];
|
|
1331
|
+
var validSets = d
|
|
1332
|
+
.reduce(function (arr,
|
|
1333
|
+
x) {
|
|
1334
|
+
// Check if x is a valid set, and that it is not an duplicate.
|
|
1335
|
+
if (isValidSet(x) && arr.indexOf(x.sets[0]) === -1) {
|
|
1336
|
+
arr.push(x.sets[0]);
|
|
1337
|
+
}
|
|
1338
|
+
return arr;
|
|
1339
|
+
}, [])
|
|
1340
|
+
.sort();
|
|
1341
|
+
var mapOfIdToRelation = d.reduce(function (mapOfIdToRelation,
|
|
1342
|
+
relation) {
|
|
1343
|
+
if (isValidRelation(relation) &&
|
|
1344
|
+
!relation.sets.some(function (set) {
|
|
1345
|
+
return validSets.indexOf(set) === -1;
|
|
1346
|
+
})) {
|
|
1347
|
+
mapOfIdToRelation[relation.sets.sort().join()] =
|
|
1348
|
+
relation;
|
|
1349
|
+
}
|
|
1350
|
+
return mapOfIdToRelation;
|
|
1351
|
+
}, {});
|
|
1352
|
+
validSets.reduce(function (combinations, set, i, arr) {
|
|
1353
|
+
var remaining = arr.slice(i + 1);
|
|
1354
|
+
remaining.forEach(function (set2) {
|
|
1355
|
+
combinations.push(set + ',' + set2);
|
|
1356
|
+
});
|
|
1357
|
+
return combinations;
|
|
1358
|
+
}, []).forEach(function (combination) {
|
|
1359
|
+
if (!mapOfIdToRelation[combination]) {
|
|
1360
|
+
var obj = {
|
|
1361
|
+
sets: combination.split(','),
|
|
1362
|
+
value: 0
|
|
1363
|
+
};
|
|
1364
|
+
mapOfIdToRelation[combination] = obj;
|
|
1365
|
+
}
|
|
1366
|
+
});
|
|
1367
|
+
// Transform map into array.
|
|
1368
|
+
return Object
|
|
1369
|
+
.keys(mapOfIdToRelation)
|
|
1370
|
+
.map(function (id) {
|
|
1371
|
+
return mapOfIdToRelation[id];
|
|
1372
|
+
});
|
|
1373
|
+
}
|
|
1374
|
+
/**
|
|
1375
|
+
* Takes two sets and finds the one with the largest total overlap.
|
|
1376
|
+
* @private
|
|
1377
|
+
* @param {Object} a
|
|
1378
|
+
* The first set to compare.
|
|
1379
|
+
* @param {Object} b
|
|
1380
|
+
* The second set to compare.
|
|
1381
|
+
* @return {number}
|
|
1382
|
+
* Returns 0 if a and b are equal, <0 if a is greater, >0 if b is greater.
|
|
1383
|
+
*/
|
|
1384
|
+
function sortByTotalOverlap(a, b) {
|
|
1385
|
+
return b.totalOverlap - a.totalOverlap;
|
|
1386
|
+
}
|
|
1389
1387
|
/* *
|
|
1390
1388
|
*
|
|
1391
1389
|
* Default Export
|
|
1392
1390
|
*
|
|
1393
1391
|
* */
|
|
1392
|
+
var VennUtils = {
|
|
1393
|
+
geometry: GU,
|
|
1394
|
+
geometryCircles: CU,
|
|
1395
|
+
addOverlapToSets: addOverlapToSets,
|
|
1396
|
+
getCentroid: getCentroid,
|
|
1397
|
+
getDistanceBetweenCirclesByOverlap: getDistanceBetweenCirclesByOverlap,
|
|
1398
|
+
getLabelWidth: getLabelWidth,
|
|
1399
|
+
getMarginFromCircles: getMarginFromCircles,
|
|
1400
|
+
isSet: isSet,
|
|
1401
|
+
layoutGreedyVenn: layoutGreedyVenn,
|
|
1402
|
+
loss: loss,
|
|
1403
|
+
nelderMead: nelderMead,
|
|
1404
|
+
processVennData: processVennData,
|
|
1405
|
+
sortByTotalOverlap: sortByTotalOverlap
|
|
1406
|
+
};
|
|
1394
1407
|
|
|
1395
1408
|
return VennUtils;
|
|
1396
1409
|
});
|
|
1397
|
-
_registerModule(_modules, 'Series/Venn/VennSeries.js', [_modules['Core/Animation/AnimationUtilities.js'], _modules['Core/Color/Color.js'], _modules['Core/Geometry/CircleUtilities.js'], _modules['Core/Geometry/GeometryUtilities.js'], _modules['
|
|
1410
|
+
_registerModule(_modules, 'Series/Venn/VennSeries.js', [_modules['Core/Animation/AnimationUtilities.js'], _modules['Core/Color/Color.js'], _modules['Core/Geometry/CircleUtilities.js'], _modules['Core/Geometry/GeometryUtilities.js'], _modules['Core/Series/SeriesRegistry.js'], _modules['Series/Venn/VennPoint.js'], _modules['Series/Venn/VennUtils.js'], _modules['Core/Utilities.js']], function (A, Color, CU, GU, SeriesRegistry, VennPoint, VennUtils, U) {
|
|
1398
1411
|
/* *
|
|
1399
1412
|
*
|
|
1400
1413
|
* Experimental Highcharts module which enables visualization of a Venn
|
|
@@ -1435,7 +1448,6 @@
|
|
|
1435
1448
|
isPointInsideAllCircles = CU.isPointInsideAllCircles,
|
|
1436
1449
|
isPointOutsideAllCircles = CU.isPointOutsideAllCircles;
|
|
1437
1450
|
var getCenterOfPoints = GU.getCenterOfPoints;
|
|
1438
|
-
var nelderMead = NelderMeadMixin.nelderMead;
|
|
1439
1451
|
var ScatterSeries = SeriesRegistry.seriesTypes.scatter;
|
|
1440
1452
|
var addEvent = U.addEvent,
|
|
1441
1453
|
extend = U.extend,
|
|
@@ -1511,14 +1523,14 @@
|
|
|
1511
1523
|
{ x: circle.x, y: circle.y + d },
|
|
1512
1524
|
{ x: circle.x, y: circle.y - d }
|
|
1513
1525
|
]
|
|
1514
|
-
// Iterate the given points and return the one with the
|
|
1515
|
-
// margin.
|
|
1526
|
+
// Iterate the given points and return the one with the
|
|
1527
|
+
// largest margin.
|
|
1516
1528
|
.reduce(function (best, point) {
|
|
1517
1529
|
var margin = VennUtils.getMarginFromCircles(point,
|
|
1518
1530
|
internal,
|
|
1519
1531
|
external);
|
|
1520
|
-
// If the margin better than the current best, then
|
|
1521
|
-
// sbest.
|
|
1532
|
+
// If the margin better than the current best, then
|
|
1533
|
+
// update sbest.
|
|
1522
1534
|
if (best.margin < margin) {
|
|
1523
1535
|
best.point = point;
|
|
1524
1536
|
best.margin = margin;
|
|
@@ -1530,7 +1542,7 @@
|
|
|
1530
1542
|
margin: -Number.MAX_VALUE
|
|
1531
1543
|
}).point;
|
|
1532
1544
|
// Use nelder mead to optimize the initial label position.
|
|
1533
|
-
var optimal = nelderMead(function (p) {
|
|
1545
|
+
var optimal = VennUtils.nelderMead(function (p) {
|
|
1534
1546
|
return -(VennUtils.getMarginFromCircles({ x: p[0],
|
|
1535
1547
|
y: p[1] },
|
|
1536
1548
|
internal,
|
|
@@ -1623,16 +1635,13 @@
|
|
|
1623
1635
|
if (relations.length > 0) {
|
|
1624
1636
|
var mapOfIdToCircles_1 = VennUtils.layoutGreedyVenn(relations);
|
|
1625
1637
|
var setRelations_1 = relations.filter(VennUtils.isSet);
|
|
1626
|
-
relations
|
|
1627
|
-
.forEach(function (relation) {
|
|
1638
|
+
relations.forEach(function (relation) {
|
|
1628
1639
|
var sets = relation.sets;
|
|
1629
1640
|
var id = sets.join();
|
|
1630
1641
|
// Get shape from map of circles, or calculate intersection.
|
|
1631
1642
|
var shape = VennUtils.isSet(relation) ?
|
|
1632
1643
|
mapOfIdToCircles_1[id] :
|
|
1633
|
-
getAreaOfIntersectionBetweenCircles(sets.map(function (set) {
|
|
1634
|
-
return mapOfIdToCircles_1[set];
|
|
1635
|
-
}));
|
|
1644
|
+
getAreaOfIntersectionBetweenCircles(sets.map(function (set) { return mapOfIdToCircles_1[set]; }));
|
|
1636
1645
|
// Calculate label values if the set has a shape
|
|
1637
1646
|
if (shape) {
|
|
1638
1647
|
mapOfIdToShape[id] = shape;
|
|
@@ -1923,7 +1932,7 @@
|
|
|
1923
1932
|
* @optionparent plotOptions.venn
|
|
1924
1933
|
*/
|
|
1925
1934
|
VennSeries.defaultOptions = merge(ScatterSeries.defaultOptions, {
|
|
1926
|
-
borderColor:
|
|
1935
|
+
borderColor: "#cccccc" /* neutralColor20 */,
|
|
1927
1936
|
borderDashStyle: 'solid',
|
|
1928
1937
|
borderWidth: 1,
|
|
1929
1938
|
brighten: 0,
|
|
@@ -1950,14 +1959,14 @@
|
|
|
1950
1959
|
*/
|
|
1951
1960
|
hover: {
|
|
1952
1961
|
opacity: 1,
|
|
1953
|
-
borderColor:
|
|
1962
|
+
borderColor: "#333333" /* neutralColor80 */
|
|
1954
1963
|
},
|
|
1955
1964
|
/**
|
|
1956
1965
|
* @excluding halo
|
|
1957
1966
|
*/
|
|
1958
1967
|
select: {
|
|
1959
|
-
color:
|
|
1960
|
-
borderColor:
|
|
1968
|
+
color: "#cccccc" /* neutralColor20 */,
|
|
1969
|
+
borderColor: "#000000" /* neutralColor100 */,
|
|
1961
1970
|
animation: false
|
|
1962
1971
|
},
|
|
1963
1972
|
inactive: {
|