@orbcharts/plugin-basic 4.0.0-pre-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/LICENSE +201 -0
  2. package/dist/orbcharts-plugin-basic.es.js +25335 -0
  3. package/dist/orbcharts-plugin-basic.umd.js +341 -0
  4. package/dist/plugin-basic/src/baseLayers/BaseBars.d.ts +38 -0
  5. package/dist/plugin-basic/src/baseLayers/BaseBarsTriangle.d.ts +37 -0
  6. package/dist/plugin-basic/src/baseLayers/BaseCategoryAxis.d.ts +42 -0
  7. package/dist/plugin-basic/src/baseLayers/BaseDots.d.ts +38 -0
  8. package/dist/plugin-basic/src/baseLayers/BaseLegend.d.ts +31 -0
  9. package/dist/plugin-basic/src/baseLayers/BaseLineAreas.d.ts +36 -0
  10. package/dist/plugin-basic/src/baseLayers/BaseLines.d.ts +36 -0
  11. package/dist/plugin-basic/src/baseLayers/BaseStackedBars.d.ts +41 -0
  12. package/dist/plugin-basic/src/baseLayers/BaseTooltip.d.ts +47 -0
  13. package/dist/plugin-basic/src/baseLayers/BaseValueAxis.d.ts +38 -0
  14. package/dist/plugin-basic/src/baseLayers/BaseXAxis.d.ts +25 -0
  15. package/dist/plugin-basic/src/baseLayers/BaseXZoom.d.ts +22 -0
  16. package/dist/plugin-basic/src/baseLayers/BaseYAxis.d.ts +23 -0
  17. package/dist/plugin-basic/src/baseLayers/types.d.ts +171 -0
  18. package/dist/plugin-basic/src/const/layerIndex.d.ts +10 -0
  19. package/dist/plugin-basic/src/const/sharedPluginParams.d.ts +6 -0
  20. package/dist/plugin-basic/src/index.d.ts +2 -0
  21. package/dist/plugin-basic/src/plugins/CompositionPlot/CompositionPlot.d.ts +22 -0
  22. package/dist/plugin-basic/src/plugins/CompositionPlot/contextObservables.d.ts +40 -0
  23. package/dist/plugin-basic/src/plugins/CompositionPlot/defaults.d.ts +10 -0
  24. package/dist/plugin-basic/src/plugins/CompositionPlot/index.d.ts +3 -0
  25. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Bubbles.d.ts +16 -0
  26. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Indicator.d.ts +0 -0
  27. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Pie.d.ts +16 -0
  28. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/PieEventTexts.d.ts +16 -0
  29. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/PieLabels.d.ts +16 -0
  30. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Rose.d.ts +16 -0
  31. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/RoseLabels.d.ts +16 -0
  32. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Waffle.d.ts +0 -0
  33. package/dist/plugin-basic/src/plugins/CompositionPlot/types.d.ts +110 -0
  34. package/dist/plugin-basic/src/plugins/CompositionPlot/utils.d.ts +19 -0
  35. package/dist/plugin-basic/src/plugins/HierarchyPlot/HierarchyPlot.d.ts +22 -0
  36. package/dist/plugin-basic/src/plugins/HierarchyPlot/contextObservables.d.ts +16 -0
  37. package/dist/plugin-basic/src/plugins/HierarchyPlot/defaults.d.ts +4 -0
  38. package/dist/plugin-basic/src/plugins/HierarchyPlot/index.d.ts +3 -0
  39. package/dist/plugin-basic/src/plugins/HierarchyPlot/layers/TreeMap.d.ts +16 -0
  40. package/dist/plugin-basic/src/plugins/HierarchyPlot/types.d.ts +29 -0
  41. package/dist/plugin-basic/src/plugins/Legend/Legend.d.ts +22 -0
  42. package/dist/plugin-basic/src/plugins/Legend/contextObservables.d.ts +9 -0
  43. package/dist/plugin-basic/src/plugins/Legend/defaults.d.ts +4 -0
  44. package/dist/plugin-basic/src/plugins/Legend/index.d.ts +3 -0
  45. package/dist/plugin-basic/src/plugins/Legend/layers/Legend.d.ts +16 -0
  46. package/dist/plugin-basic/src/plugins/Legend/types.d.ts +31 -0
  47. package/dist/plugin-basic/src/plugins/Legend/utils.d.ts +19 -0
  48. package/dist/plugin-basic/src/plugins/NetworkPlot/NetworkPlot.d.ts +22 -0
  49. package/dist/plugin-basic/src/plugins/NetworkPlot/contextObservables.d.ts +19 -0
  50. package/dist/plugin-basic/src/plugins/NetworkPlot/defaults.d.ts +5 -0
  51. package/dist/plugin-basic/src/plugins/NetworkPlot/index.d.ts +3 -0
  52. package/dist/plugin-basic/src/plugins/NetworkPlot/layers/ForceDirected.d.ts +16 -0
  53. package/dist/plugin-basic/src/plugins/NetworkPlot/layers/ForceDirectedBubbles.d.ts +16 -0
  54. package/dist/plugin-basic/src/plugins/NetworkPlot/types.d.ts +117 -0
  55. package/dist/plugin-basic/src/plugins/ScatterPlot/ScatterPlot.d.ts +22 -0
  56. package/dist/plugin-basic/src/plugins/ScatterPlot/contextObservables.d.ts +140 -0
  57. package/dist/plugin-basic/src/plugins/ScatterPlot/defaults.d.ts +8 -0
  58. package/dist/plugin-basic/src/plugins/ScatterPlot/index.d.ts +3 -0
  59. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/Scatter.d.ts +16 -0
  60. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/ScatterBubbles.d.ts +16 -0
  61. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/XYAux.d.ts +16 -0
  62. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/XYAxes.d.ts +16 -0
  63. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/XZoom.d.ts +16 -0
  64. package/dist/plugin-basic/src/plugins/ScatterPlot/types.d.ts +146 -0
  65. package/dist/plugin-basic/src/plugins/SeriesPlot/SeriesPlot.d.ts +22 -0
  66. package/dist/plugin-basic/src/plugins/SeriesPlot/contextObservables.d.ts +77 -0
  67. package/dist/plugin-basic/src/plugins/SeriesPlot/defaults.d.ts +15 -0
  68. package/dist/plugin-basic/src/plugins/SeriesPlot/index.d.ts +3 -0
  69. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/Bars.d.ts +16 -0
  70. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/BarsPN.d.ts +16 -0
  71. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/BarsTriangle.d.ts +16 -0
  72. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/CategoryAux.d.ts +16 -0
  73. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/CategoryAxis.d.ts +16 -0
  74. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/CategoryZoom.d.ts +16 -0
  75. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/Dots.d.ts +16 -0
  76. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/LineAreas.d.ts +16 -0
  77. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/Lines.d.ts +16 -0
  78. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/StackedBars.d.ts +16 -0
  79. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/StackedValueAxis.d.ts +16 -0
  80. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/ValueAxis.d.ts +16 -0
  81. package/dist/plugin-basic/src/plugins/SeriesPlot/types.d.ts +140 -0
  82. package/dist/plugin-basic/src/plugins/Tooltip/Tooltip.d.ts +22 -0
  83. package/dist/plugin-basic/src/plugins/Tooltip/contextObservables.d.ts +9 -0
  84. package/dist/plugin-basic/src/plugins/Tooltip/defaults.d.ts +4 -0
  85. package/dist/plugin-basic/src/plugins/Tooltip/index.d.ts +3 -0
  86. package/dist/plugin-basic/src/plugins/Tooltip/layers/Tooltip.d.ts +16 -0
  87. package/dist/plugin-basic/src/plugins/Tooltip/types.d.ts +35 -0
  88. package/dist/plugin-basic/src/plugins/Tooltip/utils.d.ts +19 -0
  89. package/dist/plugin-basic/src/plugins/index.d.ts +7 -0
  90. package/dist/plugin-basic/src/types/BaseLayer.d.ts +3 -0
  91. package/dist/plugin-basic/src/types/Common.d.ts +14 -0
  92. package/dist/plugin-basic/src/types/ComputedData.d.ts +27 -0
  93. package/dist/plugin-basic/src/types/PluginParams.d.ts +66 -0
  94. package/dist/plugin-basic/src/types/index.d.ts +3 -0
  95. package/dist/plugin-basic/src/utils/commonUtils.d.ts +3 -0
  96. package/dist/plugin-basic/src/utils/d3Graphics.d.ts +24 -0
  97. package/dist/plugin-basic/src/utils/d3Scale.d.ts +28 -0
  98. package/dist/plugin-basic/src/utils/d3Utils.d.ts +14 -0
  99. package/dist/plugin-basic/src/utils/graphObservables.d.ts +0 -0
  100. package/dist/plugin-basic/src/utils/gridObservables.d.ts +51 -0
  101. package/dist/plugin-basic/src/utils/multivariateObservables.d.ts +74 -0
  102. package/dist/plugin-basic/src/utils/observables.d.ts +34 -0
  103. package/dist/plugin-basic/src/utils/orbchartsUtils.d.ts +26 -0
  104. package/dist/plugin-basic/src/utils/seriesObservables.d.ts +22 -0
  105. package/dist/plugin-basic/vite.config.d.ts +2 -0
  106. package/dist/src/index.d.ts +1 -0
  107. package/package.json +62 -0
  108. package/src/baseLayers/BaseBars.ts +783 -0
  109. package/src/baseLayers/BaseBarsTriangle.ts +692 -0
  110. package/src/baseLayers/BaseCategoryAxis.ts +708 -0
  111. package/src/baseLayers/BaseDots.ts +495 -0
  112. package/src/baseLayers/BaseLegend.ts +684 -0
  113. package/src/baseLayers/BaseLineAreas.ts +644 -0
  114. package/src/baseLayers/BaseLines.ts +721 -0
  115. package/src/baseLayers/BaseStackedBars.ts +818 -0
  116. package/src/baseLayers/BaseTooltip.ts +435 -0
  117. package/src/baseLayers/BaseValueAxis.ts +612 -0
  118. package/src/baseLayers/BaseXAxis.ts +412 -0
  119. package/src/baseLayers/BaseXZoom.ts +250 -0
  120. package/src/baseLayers/BaseYAxis.ts +371 -0
  121. package/src/baseLayers/types.ts +174 -0
  122. package/src/const/layerIndex.ts +36 -0
  123. package/src/const/sharedPluginParams.ts +29 -0
  124. package/src/index.ts +3 -0
  125. package/src/plugins/CompositionPlot/CompositionPlot.ts +308 -0
  126. package/src/plugins/CompositionPlot/contextObservables.ts +251 -0
  127. package/src/plugins/CompositionPlot/defaults.ts +162 -0
  128. package/src/plugins/CompositionPlot/index.ts +3 -0
  129. package/src/plugins/CompositionPlot/layers/Bubbles.ts +808 -0
  130. package/src/plugins/CompositionPlot/layers/Indicator.ts +0 -0
  131. package/src/plugins/CompositionPlot/layers/Pie.ts +776 -0
  132. package/src/plugins/CompositionPlot/layers/PieEventTexts.ts +326 -0
  133. package/src/plugins/CompositionPlot/layers/PieLabels.ts +651 -0
  134. package/src/plugins/CompositionPlot/layers/Rose.ts +546 -0
  135. package/src/plugins/CompositionPlot/layers/RoseLabels.ts +616 -0
  136. package/src/plugins/CompositionPlot/layers/Waffle.ts +0 -0
  137. package/src/plugins/CompositionPlot/types.ts +129 -0
  138. package/src/plugins/CompositionPlot/utils.ts +53 -0
  139. package/src/plugins/HierarchyPlot/HierarchyPlot.ts +190 -0
  140. package/src/plugins/HierarchyPlot/contextObservables.ts +136 -0
  141. package/src/plugins/HierarchyPlot/defaults.ts +31 -0
  142. package/src/plugins/HierarchyPlot/index.ts +3 -0
  143. package/src/plugins/HierarchyPlot/layers/TreeMap.ts +371 -0
  144. package/src/plugins/HierarchyPlot/types.ts +36 -0
  145. package/src/plugins/Legend/Legend.ts +151 -0
  146. package/src/plugins/Legend/contextObservables.ts +55 -0
  147. package/src/plugins/Legend/defaults.ts +37 -0
  148. package/src/plugins/Legend/index.ts +3 -0
  149. package/src/plugins/Legend/layers/Legend.ts +114 -0
  150. package/src/plugins/Legend/types.ts +45 -0
  151. package/src/plugins/Legend/utils.ts +53 -0
  152. package/src/plugins/NetworkPlot/NetworkPlot.ts +228 -0
  153. package/src/plugins/NetworkPlot/contextObservables.ts +123 -0
  154. package/src/plugins/NetworkPlot/defaults.ts +147 -0
  155. package/src/plugins/NetworkPlot/index.ts +3 -0
  156. package/src/plugins/NetworkPlot/layers/ForceDirected.ts +1048 -0
  157. package/src/plugins/NetworkPlot/layers/ForceDirectedBubbles.ts +1318 -0
  158. package/src/plugins/NetworkPlot/types.ts +146 -0
  159. package/src/plugins/ScatterPlot/ScatterPlot.ts +569 -0
  160. package/src/plugins/ScatterPlot/contextObservables.ts +901 -0
  161. package/src/plugins/ScatterPlot/defaults.ts +212 -0
  162. package/src/plugins/ScatterPlot/index.ts +3 -0
  163. package/src/plugins/ScatterPlot/layers/Scatter.ts +518 -0
  164. package/src/plugins/ScatterPlot/layers/ScatterBubbles.ts +670 -0
  165. package/src/plugins/ScatterPlot/layers/XYAux.ts +686 -0
  166. package/src/plugins/ScatterPlot/layers/XYAxes.ts +205 -0
  167. package/src/plugins/ScatterPlot/layers/XZoom.ts +48 -0
  168. package/src/plugins/ScatterPlot/types.ts +179 -0
  169. package/src/plugins/SeriesPlot/SeriesPlot.ts +494 -0
  170. package/src/plugins/SeriesPlot/contextObservables.ts +726 -0
  171. package/src/plugins/SeriesPlot/defaults.ts +142 -0
  172. package/src/plugins/SeriesPlot/index.ts +3 -0
  173. package/src/plugins/SeriesPlot/layers/Bars.ts +84 -0
  174. package/src/plugins/SeriesPlot/layers/BarsPN.ts +85 -0
  175. package/src/plugins/SeriesPlot/layers/BarsTriangle.ts +89 -0
  176. package/src/plugins/SeriesPlot/layers/CategoryAux.ts +1131 -0
  177. package/src/plugins/SeriesPlot/layers/CategoryAxis.ts +92 -0
  178. package/src/plugins/SeriesPlot/layers/CategoryZoom.ts +233 -0
  179. package/src/plugins/SeriesPlot/layers/Dots.ts +91 -0
  180. package/src/plugins/SeriesPlot/layers/LineAreas.ts +82 -0
  181. package/src/plugins/SeriesPlot/layers/Lines.ts +75 -0
  182. package/src/plugins/SeriesPlot/layers/StackedBars.ts +85 -0
  183. package/src/plugins/SeriesPlot/layers/StackedValueAxis.ts +111 -0
  184. package/src/plugins/SeriesPlot/layers/ValueAxis.ts +111 -0
  185. package/src/plugins/SeriesPlot/types.ts +201 -0
  186. package/src/plugins/Tooltip/Tooltip.ts +159 -0
  187. package/src/plugins/Tooltip/contextObservables.ts +55 -0
  188. package/src/plugins/Tooltip/defaults.ts +458 -0
  189. package/src/plugins/Tooltip/index.ts +3 -0
  190. package/src/plugins/Tooltip/layers/Tooltip.ts +90 -0
  191. package/src/plugins/Tooltip/types.ts +55 -0
  192. package/src/plugins/Tooltip/utils.ts +53 -0
  193. package/src/plugins/index.ts +8 -0
  194. package/src/types/BaseLayer.ts +3 -0
  195. package/src/types/Common.ts +20 -0
  196. package/src/types/ComputedData.ts +55 -0
  197. package/src/types/PluginParams.ts +81 -0
  198. package/src/types/index.ts +3 -0
  199. package/src/utils/commonUtils.ts +31 -0
  200. package/src/utils/d3Graphics.ts +177 -0
  201. package/src/utils/d3Scale.ts +198 -0
  202. package/src/utils/d3Utils.ts +92 -0
  203. package/src/utils/graphObservables.ts +0 -0
  204. package/src/utils/gridObservables.ts +637 -0
  205. package/src/utils/multivariateObservables.ts +790 -0
  206. package/src/utils/observables.ts +357 -0
  207. package/src/utils/orbchartsUtils.ts +335 -0
  208. package/src/utils/seriesObservables.ts +172 -0
@@ -0,0 +1,146 @@
1
+
2
+ import { Observable, Subject } from 'rxjs'
3
+ import type { ColorType, ModelDatumSeries, EventData } from '@orbcharts/core'
4
+ import type { AxisPosition, ContainerPosition, ContainerPositionScaled, Container, GraphicStyles, Layout, VisibleFilter, XYAxis, CategoryAxis } from '../../types/PluginParams'
5
+ import type { ComputedData, ComputedDatumGraphNode, ComputedDatumGraphEdge } from '../../types'
6
+
7
+ export interface NetworkPlotExtendContext {
8
+ layout$: Observable<Layout>
9
+ computedData$: Observable<ComputedData<'graph'>>
10
+ fontSizePx$: Observable<number>
11
+ graphHighlightNodes$: Observable<ComputedDatumGraphNode[]>
12
+ graphHighlightEdges$: Observable<ComputedDatumGraphEdge[]>
13
+ categoryLabels$: Observable<string[]>
14
+ CategoryNodeMap$: Observable<Map<string, ComputedDatumGraphNode[]>>
15
+ CategoryEdgeMap$: Observable<Map<string, ComputedDatumGraphEdge[]>>
16
+ NodeMap$: Observable<Map<string, ComputedDatumGraphNode>>
17
+ EdgeMap$: Observable<Map<string, ComputedDatumGraphEdge>>
18
+ visibleComputedData$: Observable<ComputedData<'graph'>>
19
+ }
20
+
21
+ // plugin params
22
+ export interface NetworkPlotPluginParams {
23
+ styles: GraphicStyles
24
+ visibleFilter: VisibleFilter<'grid'>
25
+ datasetIndex: number
26
+ }
27
+
28
+ // all layer params
29
+ export interface NetworkPlotAllLayerParams {
30
+ ForceDirected: ForceDirectedParams
31
+ ForceDirectedBubbles: ForceDirectedBubblesParams
32
+ }
33
+
34
+ // -- layer params --
35
+ export interface ForceDirectedParams {
36
+ // node: {
37
+ // dotRadius: number
38
+ // dotFillColorType: ColorType
39
+ // dotStrokeColorType: ColorType
40
+ // dotStrokeWidth: number
41
+ // dotStyleFn: (node: ComputedDatumGraphNode) => string
42
+ // labelColorType: ColorType
43
+ // labelSizeFixed: boolean
44
+ // labelStyleFn: (node: ComputedDatumGraphNode) => string
45
+ // }
46
+ dot: {
47
+ radius: number
48
+ fillColorType: ColorType
49
+ strokeColorType: ColorType
50
+ strokeWidth: number
51
+ styleFn: (node: ComputedDatumGraphNode) => string
52
+ }
53
+ dotLabel: {
54
+ colorType: ColorType
55
+ sizeFixed: boolean
56
+ styleFn: (node: ComputedDatumGraphNode) => string
57
+ }
58
+ // edge: {
59
+ // arrowColorType: ColorType
60
+ // arrowStrokeWidth: number
61
+ // arrowWidth: number
62
+ // arrowHeight: number
63
+ // arrowStyleFn: (node: ComputedDatumGraphNode) => string
64
+ // labelColorType: ColorType
65
+ // labelSizeFixed: boolean
66
+ // labelStyleFn: (node: ComputedDatumGraphNode) => string
67
+ // }
68
+ arrow: {
69
+ colorType: ColorType
70
+ strokeWidth: number
71
+ pointerWidth: number
72
+ pointerHeight: number
73
+ styleFn: (edge: ComputedDatumGraphEdge) => string
74
+ }
75
+ arrowLabel: {
76
+ colorType: ColorType
77
+ sizeFixed: boolean
78
+ styleFn: (edge: ComputedDatumGraphEdge) => string
79
+ }
80
+ force: {
81
+ nodeStrength: number // 泡泡引力
82
+ linkDistance: number // 距離
83
+ velocityDecay: number // 衰減數
84
+ alphaDecay: number // 衰減數
85
+ }
86
+ zoomable: boolean
87
+ transform: {
88
+ x: number
89
+ y: number
90
+ k: number
91
+ }
92
+ scaleExtent: {
93
+ min: number
94
+ max: number
95
+ }
96
+ }
97
+
98
+ export interface ForceDirectedBubblesParams {
99
+ bubble: {
100
+ radiusMin: number // 對應value最小值
101
+ radiusMax: number // 對應value最大值
102
+ arcScaleType: 'area' | 'radius'
103
+ fillColorType: ColorType
104
+ strokeColorType: ColorType
105
+ strokeWidth: number
106
+ styleFn: (node: ComputedDatumGraphNode) => string
107
+ }
108
+ bubbleLabel: {
109
+ fillRate: number
110
+ lineHeight: number
111
+ maxLineLength: number
112
+ wordBreakAll: boolean
113
+ colorType: ColorType
114
+ styleFn: (node: ComputedDatumGraphNode) => string
115
+ }
116
+ arrow: {
117
+ colorType: ColorType
118
+ strokeWidthMin: number // 對應value最小值
119
+ strokeWidthMax: number // 對應value最大值
120
+ pointerWidth: number
121
+ pointerHeight: number
122
+ styleFn: (edge: ComputedDatumGraphEdge) => string
123
+ }
124
+ arrowLabel: {
125
+ colorType: ColorType
126
+ sizeFixed: boolean
127
+ styleFn: (edge: ComputedDatumGraphEdge) => string
128
+ }
129
+ force: {
130
+ nodeStrength: number // 泡泡引力
131
+ linkDistance: number // 距離
132
+ velocityDecay: number // 衰減數
133
+ alphaDecay: number // 衰減數
134
+ }
135
+ zoomable: boolean
136
+ transform: {
137
+ x: number
138
+ y: number
139
+ k: number
140
+ }
141
+ scaleExtent: {
142
+ min: number
143
+ max: number
144
+ }
145
+ }
146
+
@@ -0,0 +1,569 @@
1
+ import * as d3 from 'd3'
2
+ import {
3
+ shareReplay,
4
+ map,
5
+ filter,
6
+ combineLatest,
7
+ debounceTime,
8
+ distinctUntilChanged,
9
+ Subject,
10
+ switchMap,
11
+ Observable,
12
+ BehaviorSubject
13
+ } from 'rxjs'
14
+
15
+ import type { ScatterPlotExtendContext, ScatterPlotPluginParams, ScatterPlotAllLayerParams } from './types'
16
+ import { defineSVGPlugin } from '@orbcharts/core'
17
+ import { validateObject } from '@orbcharts/core'
18
+ import { DEFAULT_SCATTER_PLOT_PARAMS } from './defaults'
19
+ import {
20
+ categoryDataMapObservable,
21
+ containerSizeObservable,
22
+ layoutObservable,
23
+ fontSizePxObservable,
24
+ highlightObservable,
25
+ seriesDataMapObservable
26
+ } from '../../utils/observables'
27
+ import {
28
+ computedXYDataObservable,
29
+ // multiValueAxesTransformObservable,
30
+ // multiValueAxesReverseTransformObservable,
31
+ graphicTransformObservable,
32
+ graphicReverseScaleObservable,
33
+ seriesLabelsObservable,
34
+ visibleComputedDataObservable,
35
+ visibleComputedSumDataObservable,
36
+ visibleComputedRankingByIndexDataObservable,
37
+ visibleComputedRankingBySumDataObservable,
38
+ visibleComputedXYDataObservable,
39
+ containerPositionObservable,
40
+ // containerSizeObservable,
41
+ xyMinMaxObservable,
42
+ valueLabelsObservable,
43
+ filteredXYMinMaxDataObservable,
44
+ // visibleComputedRankingDataObservable,
45
+ // rankingAmountLimitObservable,
46
+ // rankingScaleObservable
47
+ xScaleObservable,
48
+ // xSumScaleObservable,
49
+ yScaleObservable,
50
+ ordinalScaleDomainObservable,
51
+ ordinalPaddingObservable,
52
+ ordinalScaleObservable,
53
+ multivariateComputedDataObservable,
54
+ // valueLabelsObservable
55
+ } from './contextObservables'
56
+ import { Scatter } from './layers/Scatter'
57
+ import { ScatterBubbles } from './layers/ScatterBubbles'
58
+ import { XYAux } from './layers/XYAux'
59
+ import { XYAxes } from './layers/XYAxes'
60
+ import { XZoom } from './layers/XZoom'
61
+ const scatter = new Scatter()
62
+ const scatterBubbles = new ScatterBubbles()
63
+ const xyAux = new XYAux()
64
+ const xyAxes = new XYAxes()
65
+ const xZoom = new XZoom()
66
+
67
+ export const ScatterPlot = defineSVGPlugin<
68
+ ScatterPlotExtendContext,
69
+ ScatterPlotPluginParams,
70
+ ScatterPlotAllLayerParams
71
+ >({
72
+ name: 'ScatterPlot',
73
+ defaultParams: DEFAULT_SCATTER_PLOT_PARAMS,
74
+ layers: [scatter, scatterBubbles, xyAux, xyAxes, xZoom],
75
+ setup: (props) => {
76
+
77
+ const zoomedScaleDomain$ = new BehaviorSubject<[number, number | "max"] | undefined>(undefined)
78
+ props.context.event$.subscribe(event => {
79
+ if (event.eventName === 'zoom' && event.data) {
80
+ if (event.data.scaleDomain) {
81
+ zoomedScaleDomain$.next(event.data.scaleDomain)
82
+ }
83
+ }
84
+ })
85
+
86
+ const zoomedXAxis$ = props.pluginParams$.pipe(
87
+ switchMap(({ xAxis }) => zoomedScaleDomain$.pipe(
88
+ map(scaleDomain => {
89
+ if (!scaleDomain) {
90
+ return xAxis
91
+ }
92
+ return {
93
+ ...xAxis,
94
+ scaleDomain
95
+ }
96
+ })
97
+ )),
98
+ shareReplay(1)
99
+ )
100
+
101
+ // const zoomedYAxis$ = props.pluginParams$.pipe(
102
+ // switchMap(({ yAxis }) => zoomedScaleDomain$.pipe(
103
+ // map(scaleDomain => {
104
+ // if (!scaleDomain) {
105
+ // return yAxis
106
+ // }
107
+ // return {
108
+ // ...yAxis,
109
+ // scaleDomain
110
+ // }
111
+ // })
112
+ // )),
113
+ // shareReplay(1)
114
+ // )
115
+ const yAxis$ = props.pluginParams$.pipe(
116
+ map(params => params.yAxis),
117
+ shareReplay(1)
118
+ )
119
+
120
+ const selectedMultivariateData$ = combineLatest({
121
+ multivariateData: props.context.multivariateData$,
122
+ datasetIndex: props.pluginParams$.pipe(
123
+ map(pluginParams => pluginParams.datasetIndex)
124
+ )
125
+ }).pipe(
126
+ debounceTime(0),
127
+ map(({ multivariateData, datasetIndex }) => multivariateData[datasetIndex]),
128
+ shareReplay(1)
129
+ )
130
+
131
+ const layout$ = layoutObservable({
132
+ size$: props.context.size$,
133
+ padding$: props.pluginParams$.pipe(
134
+ map(pluginParams => pluginParams.styles.padding)
135
+ )
136
+ }).pipe(
137
+ shareReplay(1)
138
+ )
139
+
140
+ // combineLatest({
141
+ // layout: layout$,
142
+ // plugins: props.context.plugins$
143
+ // }).pipe(
144
+ // debounceTime(0)
145
+ // ).subscribe(data => {
146
+ // d3
147
+ // .select(props.context.svg)
148
+ // .selectAll(':scope > g') // 所有 layer
149
+ // .attr('transform', `translate(${data.layout.left}, ${data.layout.top})`)
150
+ // })
151
+
152
+ // const layoutSubscription = layout$.subscribe(layout => {
153
+ // props.svg.setAttribute('transform', `translate(${layout.left}, ${layout.top})`)
154
+ // })
155
+
156
+ const computedData$ = multivariateComputedDataObservable({
157
+ selectedMultivariateData$: selectedMultivariateData$,
158
+ pluginParams$: props.pluginParams$
159
+ }).pipe(
160
+ shareReplay(1)
161
+ )
162
+
163
+ const fontSizePx$ = fontSizePxObservable(props.context.theme$).pipe(
164
+ shareReplay(1)
165
+ )
166
+
167
+ const isSeriesSeprate$ = props.pluginParams$.pipe(
168
+ map(d => d.separateSeries),
169
+ distinctUntilChanged(),
170
+ shareReplay(1)
171
+ )
172
+
173
+ const containerPosition$ = containerPositionObservable({
174
+ computedData$: computedData$,
175
+ pluginParams$: props.pluginParams$,
176
+ layout$: layout$,
177
+ }).pipe(
178
+ shareReplay(1)
179
+ )
180
+
181
+ const containerSize$ = containerSizeObservable({
182
+ layout$: layout$,
183
+ containerPosition$: containerPosition$,
184
+ container$: props.pluginParams$.pipe(
185
+ map(d => d.container)
186
+ )
187
+ }).pipe(
188
+ shareReplay(1)
189
+ )
190
+
191
+ const xyValueIndex$: Observable<[number, number]> = props.context.encoding$.pipe(
192
+ // map(d => [d.xAxis.valueIndex, d.yAxis.valueIndex] as [number, number]),
193
+ map(encoding => [0, 1] as [number, number]),
194
+ distinctUntilChanged((a, b) => a[0] === b[0] && a[1] === b[1]),
195
+ shareReplay(1)
196
+ )
197
+
198
+ const datumList$ = computedData$.pipe(
199
+ map(d => d.flat())
200
+ ).pipe(
201
+ shareReplay(1)
202
+ )
203
+
204
+ const highlight$ = highlightObservable({
205
+ datumList$,
206
+ styles$: props.pluginParams$.pipe(
207
+ map(params => params.styles)
208
+ ),
209
+ event$: props.context.event$
210
+ }).pipe(
211
+ shareReplay(1)
212
+ )
213
+
214
+ const seriesLabels$ = seriesLabelsObservable({
215
+ computedData$: computedData$,
216
+ })
217
+
218
+ const SeriesDataMap$ = seriesDataMapObservable({
219
+ datumList$: datumList$
220
+ }).pipe(
221
+ shareReplay(1)
222
+ )
223
+
224
+ // const CategoryDataMap$ = categoryDataMapObservable({
225
+ // datumList$: datumList$
226
+ // }).pipe(
227
+ // shareReplay(1)
228
+ // )
229
+
230
+ const valueLabels$ = valueLabelsObservable({
231
+ encoding$: props.context.encoding$,
232
+ // computedData$: computedData$,
233
+ }).pipe(
234
+ shareReplay(1)
235
+ )
236
+
237
+ const xyMinMax$ = xyMinMaxObservable({
238
+ computedData$: computedData$,
239
+ xyValueIndex$
240
+ }).pipe(
241
+ shareReplay(1)
242
+ )
243
+
244
+ const visibleComputedData$ = visibleComputedDataObservable({
245
+ computedData$: computedData$,
246
+ }).pipe(
247
+ shareReplay(1)
248
+ )
249
+
250
+ const ordinalScaleDomain$ = ordinalScaleDomainObservable({
251
+ xAxis$: zoomedXAxis$,
252
+ visibleComputedData$: visibleComputedData$,
253
+ }).pipe(
254
+ shareReplay(1)
255
+ )
256
+
257
+ const visibleComputedSumData$ = visibleComputedSumDataObservable({
258
+ visibleComputedData$,
259
+ ordinalScaleDomain$
260
+ }).pipe(
261
+ shareReplay(1)
262
+ )
263
+
264
+ // const valueIndex$ = observer.fullDataFormatter$.pipe(
265
+ // map(d => d.yAxis.valueIndex),
266
+ // distinctUntilChanged()
267
+ // )
268
+
269
+ const visibleComputedRankingByIndexData$ = visibleComputedRankingByIndexDataObservable({
270
+ isSeriesSeprate$,
271
+ visibleComputedData$,
272
+ xyValueIndex$
273
+ }).pipe(
274
+ shareReplay(1)
275
+ )
276
+
277
+ const visibleComputedRankingBySumData$ = visibleComputedRankingBySumDataObservable({
278
+ isSeriesSeprate$,
279
+ visibleComputedSumData$
280
+ }).pipe(
281
+ shareReplay(1)
282
+ )
283
+
284
+ const computedXYData$ = computedXYDataObservable({
285
+ computedData$: computedData$,
286
+ xyMinMax$,
287
+ xyValueIndex$,
288
+ layout$: layout$,
289
+ }).pipe(
290
+ shareReplay(1)
291
+ )
292
+
293
+ const visibleComputedXYData$ = visibleComputedXYDataObservable({
294
+ computedXYData$: computedXYData$,
295
+ }).pipe(
296
+ shareReplay(1)
297
+ )
298
+
299
+ const filteredXYMinMaxData$ = filteredXYMinMaxDataObservable({
300
+ visibleComputedXYData$: visibleComputedXYData$,
301
+ xyMinMax$,
302
+ xyValueIndex$,
303
+ xAxis$: zoomedXAxis$,
304
+ yAxis$
305
+ }).pipe(
306
+ shareReplay(1)
307
+ )
308
+
309
+ // const visibleComputedRankingData$ = visibleComputedRankingDataObservable({
310
+ // visibleComputedData$
311
+ // }).pipe(
312
+ // shareReplay(1)
313
+ // )
314
+
315
+ // const rankingAmountLimit$ = rankingAmountLimitObservable({
316
+ // layout$: observer.layout$,
317
+ // textSizePx$
318
+ // }).pipe(
319
+ // shareReplay(1)
320
+ // )
321
+
322
+ // const rankingScale$ = rankingScaleObservable({
323
+ // layout$: observer.layout$,
324
+ // visibleComputedRankingData$,
325
+ // rankingAmountLimit$
326
+ // }).pipe(
327
+ // shareReplay(1)
328
+ // )
329
+
330
+ // const multiValueAxesTransform$ = multiValueAxesTransformObservable({
331
+ // fullDataFormatter$: observer.fullDataFormatter$,
332
+ // layout$: observer.layout$
333
+ // }).pipe(
334
+ // shareReplay(1)
335
+ // )
336
+
337
+ // const multiValueAxesReverseTransform$ = multiValueAxesReverseTransformObservable({
338
+ // multiValueAxesTransform$
339
+ // }).pipe(
340
+ // shareReplay(1)
341
+ // )
342
+
343
+ const graphicTransform$ = graphicTransformObservable({
344
+ xyMinMax$,
345
+ xyValueIndex$,
346
+ filteredXYMinMaxData$,
347
+ xAxis$: zoomedXAxis$,
348
+ yAxis$,
349
+ layout$: layout$
350
+ }).pipe(
351
+ shareReplay(1)
352
+ )
353
+
354
+ const graphicReverseScale$ = graphicReverseScaleObservable({
355
+ containerPosition$: containerPosition$,
356
+ // multiValueAxesTransform$: multiValueAxesTransform$,
357
+ graphicTransform$: graphicTransform$,
358
+ }).pipe(
359
+ shareReplay(1)
360
+ )
361
+
362
+ const xScale$ = xScaleObservable({
363
+ visibleComputedSumData$,
364
+ xAxis$: zoomedXAxis$,
365
+ filteredXYMinMaxData$,
366
+ containerSize$: containerSize$,
367
+ }).pipe(
368
+ shareReplay(1)
369
+ )
370
+
371
+ // const xSumScale$ = xSumScaleObservable({
372
+ // fullDataFormatter$: observer.fullDataFormatter$,
373
+ // filteredXYMinMaxData$,
374
+ // containerSize$: containerSize$,
375
+ // }).pipe(
376
+ // shareReplay(1)
377
+ // )
378
+
379
+ const yScale$ = yScaleObservable({
380
+ yAxis$,
381
+ filteredXYMinMaxData$,
382
+ containerSize$: containerSize$,
383
+ }).pipe(
384
+ shareReplay(1)
385
+ )
386
+
387
+ // const ordinalPadding$ = ordinalPaddingObservable({
388
+ // ordinalScaleDomain$,
389
+ // computedData$: computedData$,
390
+ // containerSize$: containerSize$,
391
+ // }).pipe(
392
+ // shareReplay(1)
393
+ // )
394
+
395
+ // const ordinalScale$ = ordinalScaleObservable({
396
+ // ordinalScaleDomain$,
397
+ // computedData$: computedData$,
398
+ // containerSize$: containerSize$,
399
+ // ordinalPadding$
400
+ // }).pipe(
401
+ // shareReplay(1)
402
+ // )
403
+
404
+ const extendsContext: ScatterPlotExtendContext = {
405
+ layout$,
406
+ computedData$,
407
+ fontSizePx$,
408
+ isSeriesSeprate$,
409
+ containerPosition$,
410
+ containerSize$,
411
+ highlight$,
412
+ seriesLabels$,
413
+ SeriesDataMap$,
414
+ valueLabels$,
415
+ xyMinMax$,
416
+ xyValueIndex$,
417
+ filteredXYMinMaxData$,
418
+ visibleComputedData$,
419
+ visibleComputedRankingByIndexData$,
420
+ visibleComputedXYData$,
421
+ graphicTransform$,
422
+ graphicReverseScale$,
423
+ xScale$,
424
+ yScale$,
425
+ zoomedXAxis$,
426
+ yAxis$
427
+ }
428
+
429
+ props.context = {
430
+ ...props.context,
431
+ ...extendsContext,
432
+ }
433
+
434
+ return () => {
435
+ // layoutSubscription.unsubscribe()
436
+ }
437
+ },
438
+ validator: (params: ScatterPlotPluginParams) => {
439
+ const result = validateObject(params, {
440
+ styles: {
441
+ toBeTypes: ['object'],
442
+ },
443
+ visibleFilter: {
444
+ toBeTypes: ['Function']
445
+ },
446
+ container: {
447
+ toBeTypes: ['object']
448
+ },
449
+ xAxis: {
450
+ toBeTypes: ['object']
451
+ },
452
+ yAxis: {
453
+ toBeTypes: ['object']
454
+ },
455
+ separateSeries: {
456
+ toBeTypes: ['boolean']
457
+ },
458
+ datasetIndex: {
459
+ toBeTypes: ['number']
460
+ }
461
+ })
462
+ if (result.status === 'error') {
463
+ return result
464
+ }
465
+ if (params.styles) {
466
+ const stylesResult = validateObject(params.styles, {
467
+ padding: {
468
+ toBeTypes: ['object']
469
+ },
470
+ highlightTarget: {
471
+ toBeTypes: ['string']
472
+ },
473
+ highlightDefault: {
474
+ toBeTypes: ['string', 'null']
475
+ },
476
+ unhighlightedOpacity: {
477
+ toBeTypes: ['number']
478
+ },
479
+ transitionDuration: {
480
+ toBeTypes: ['number']
481
+ },
482
+ transitionEase: {
483
+ toBeTypes: ['string']
484
+ }
485
+ })
486
+ if (stylesResult.status === 'error') {
487
+ return stylesResult
488
+ }
489
+ if (params.styles.padding) {
490
+ const paddingResult = validateObject(params.styles.padding, {
491
+ top: {
492
+ toBeTypes: ['number']
493
+ },
494
+ right: {
495
+ toBeTypes: ['number']
496
+ },
497
+ bottom: {
498
+ toBeTypes: ['number']
499
+ },
500
+ left: {
501
+ toBeTypes: ['number']
502
+ }
503
+ })
504
+ if (paddingResult.status === 'error') {
505
+ return paddingResult
506
+ }
507
+ }
508
+ }
509
+ if (params.container) {
510
+ const containerResult = validateObject(params.container, {
511
+ columnAmount: {
512
+ toBeTypes: ['number']
513
+ },
514
+ rowAmount: {
515
+ toBeTypes: ['number']
516
+ },
517
+ columnGap: {
518
+ toBe: 'number | "auto"',
519
+ test: (value: any) => typeof value === 'number' || value === 'auto'
520
+ },
521
+ rowGap: {
522
+ toBe: 'number | "auto"',
523
+ test: (value: any) => typeof value === 'number' || value === 'auto'
524
+ }
525
+ })
526
+ if (containerResult.status === 'error') {
527
+ return containerResult
528
+ }
529
+ }
530
+ if (params.yAxis) {
531
+ const valueAxisResult = validateObject(params.yAxis, {
532
+ scaleDomain: {
533
+ toBe: '[number | "min" | "auto", number | "max" | "auto"]',
534
+ test: (value) => Array.isArray(value) && value.length === 2 && (typeof value[0] === 'number' || value[0] === 'min' || value[0] === 'auto') && (typeof value[1] === 'number' || value[1] === 'max' || value[1] === 'auto')
535
+ },
536
+ scaleRange: {
537
+ toBe: '[number, number]',
538
+ test: (value) => Array.isArray(value) && value.length === 2 && typeof value[0] === 'number' && typeof value[1] === 'number'
539
+ },
540
+ label: {
541
+ toBeTypes: ['string']
542
+ },
543
+ })
544
+ if (valueAxisResult.status === 'error') {
545
+ return valueAxisResult
546
+ }
547
+ }
548
+ if (params.xAxis) {
549
+ const groupAxisResult = validateObject(params.xAxis, {
550
+ scaleDomain: {
551
+ toBe: '[number | "min" | "auto", number | "max" | "auto"]',
552
+ test: (value) => Array.isArray(value) && value.length === 2 && (typeof value[0] === 'number' || value[0] === 'min' || value[0] === 'auto') && (typeof value[1] === 'number' || value[1] === 'max' || value[1] === 'auto')
553
+ },
554
+ scaleRange: {
555
+ toBe: '[number, number]',
556
+ test: (value) => Array.isArray(value) && value.length === 2 && typeof value[0] === 'number' && typeof value[1] === 'number'
557
+ },
558
+ label: {
559
+ toBeTypes: ['string']
560
+ },
561
+ })
562
+ if (groupAxisResult.status === 'error') {
563
+ return groupAxisResult
564
+ }
565
+ }
566
+
567
+ return result
568
+ },
569
+ })