@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,518 @@
1
+ import * as d3 from 'd3'
2
+ import {
3
+ combineLatest,
4
+ map,
5
+ switchMap,
6
+ debounceTime,
7
+ takeUntil,
8
+ distinctUntilChanged,
9
+ Observable,
10
+ Subject
11
+ } from 'rxjs'
12
+ import type { Theme, EventData } from '@orbcharts/core'
13
+ import type { ScatterPlotPluginParams, ScatterPlotExtendContext, ScatterParams, ComputedXYDataMultivariate } from '../types'
14
+ import { defineSVGLayer } from '@orbcharts/core'
15
+ import { validateObject } from '@orbcharts/core'
16
+ import { DEFAULT_SCATTER_PARAMS } from "../defaults"
17
+ import { multivariateSelectionsObservable } from "../../../utils/multivariateObservables"
18
+ import { getDatumColor } from '../../../utils/orbchartsUtils'
19
+ import { createClassName, createUniID } from '../../../utils/orbchartsUtils'
20
+ import type { ComputedDatumMultivariate, ComputedDatumSeries } from '../../../types/ComputedData'
21
+ import type { ContainerPosition, GraphicStyles, Layout } from '../../../types/PluginParams'
22
+ import { LAYER_INDEX_OF_GRAPHIC } from '../../../const/layerIndex'
23
+
24
+ type ClipPathDatum = {
25
+ id: string;
26
+ // x: number;
27
+ // y: number;
28
+ width: number;
29
+ height: number;
30
+ }
31
+
32
+ const pluginName = 'ScatterPlot'
33
+ const layerName = 'Scatter'
34
+
35
+ function renderDots ({ graphicGSelection, circleGClassName, circleClassName, visibleComputedXYData, layerParams, styles, theme, graphicReverseScale }: {
36
+ graphicGSelection: d3.Selection<SVGGElement, any, any, any>
37
+ circleGClassName: string
38
+ circleClassName: string
39
+ visibleComputedXYData: ComputedXYDataMultivariate
40
+ layerParams: ScatterParams
41
+ styles: GraphicStyles
42
+ theme: Theme
43
+ graphicReverseScale: [number, number][]
44
+ }) {
45
+ const createEnterDuration = (enter: d3.Selection<d3.EnterElement, ComputedDatumMultivariate, SVGGElement, any>) => {
46
+ const enterSize = enter.size()
47
+ const eachDuration = styles.transitionDuration / enterSize
48
+ return eachDuration
49
+ }
50
+ // enterDuration
51
+ let enterDuration = 0
52
+
53
+ graphicGSelection
54
+ .each((categoryData, categoryIndex, g) => {
55
+ d3.select(g[categoryIndex])
56
+ .selectAll<SVGGElement, ComputedDatumMultivariate>('g')
57
+ .data(visibleComputedXYData[categoryIndex], d => d.id)
58
+ .join(
59
+ enter => {
60
+ // enterDuration
61
+ enterDuration = createEnterDuration(enter)
62
+
63
+ return enter
64
+ .append('g')
65
+ .classed(circleGClassName, true)
66
+ },
67
+ update => update,
68
+ exit => exit.remove()
69
+ )
70
+ .attr('transform', d => `translate(${d.axisX}, ${d.axisY})`)
71
+ .each((d, i, g) => {
72
+ const circle = d3.select(g[i])
73
+ .selectAll('circle')
74
+ .data([d])
75
+ .join(
76
+ enter => {
77
+ return enter
78
+ .append('circle')
79
+ .style('cursor', 'pointer')
80
+ .style('vector-effect', 'non-scaling-stroke')
81
+ .classed(circleClassName, true)
82
+ .attr('opacity', 0)
83
+ .transition()
84
+ .delay((_d, _i) => {
85
+ return i * enterDuration
86
+ })
87
+ .attr('opacity', 1)
88
+ },
89
+ update => {
90
+ return update
91
+ .transition()
92
+ .duration(50)
93
+ // .attr('cx', d => d.axisX)
94
+ // .attr('cy', d => d.axisY)
95
+ .attr('opacity', 1)
96
+ },
97
+ exit => exit.remove()
98
+ )
99
+ .attr('r', layerParams.radius)
100
+ .attr('fill', (d, i) => getDatumColor({ datum: d, colorType: layerParams.fillColorType, theme }))
101
+ .attr('stroke', (d, i) => getDatumColor({ datum: d, colorType: layerParams.strokeColorType, theme }))
102
+ .attr('stroke-width', layerParams.strokeWidth)
103
+ .attr('transform', `scale(${graphicReverseScale[categoryIndex][0] ?? 1}, ${graphicReverseScale[categoryIndex][1] ?? 1})`)
104
+ })
105
+ })
106
+
107
+ const graphicCircleSelection: d3.Selection<SVGRectElement, ComputedDatumMultivariate, SVGGElement, unknown> = graphicGSelection.selectAll(`circle.${circleClassName}`)
108
+
109
+ return graphicCircleSelection
110
+ }
111
+
112
+
113
+ function highlightDots ({ selection, ids, styles }: {
114
+ selection: d3.Selection<SVGGElement, ComputedDatumMultivariate, any, any>
115
+ ids: string[]
116
+ styles: GraphicStyles
117
+ }) {
118
+ selection.interrupt('highlight')
119
+ if (!ids.length) {
120
+ // remove highlight
121
+ selection
122
+ .transition('highlight')
123
+ .duration(200)
124
+ .style('opacity', 1)
125
+ // selection
126
+ // .attr('stroke-width', layerParams.strokeWidth)
127
+
128
+ return
129
+ }
130
+
131
+ selection
132
+ .each((d, i, n) => {
133
+ if (ids.includes(d.id)) {
134
+ const dot = d3.select(n[i])
135
+ dot
136
+ .style('opacity', 1)
137
+ .transition('highlight')
138
+ .duration(200)
139
+ // dot
140
+ // .attr('stroke-width', layerParams.strokeWidthWhileHighlight)
141
+ } else {
142
+ const dot = d3.select(n[i])
143
+ dot
144
+ .style('opacity', styles.unhighlightedOpacity)
145
+ .transition('highlight')
146
+ .duration(200)
147
+ // dot
148
+ // .attr('stroke-width', layerParams.strokeWidth)
149
+
150
+ }
151
+ })
152
+ }
153
+
154
+ function renderClipPath ({ defsSelection, clipPathData }: {
155
+ defsSelection: d3.Selection<SVGDefsElement, any, any, any>
156
+ clipPathData: ClipPathDatum[]
157
+ }) {
158
+ const clipPath = defsSelection
159
+ .selectAll<SVGClipPathElement, Layout>('clipPath')
160
+ .data(clipPathData)
161
+ .join(
162
+ enter => {
163
+ return enter
164
+ .append('clipPath')
165
+ },
166
+ update => update,
167
+ exit => exit.remove()
168
+ )
169
+ .attr('id', d => d.id)
170
+ .each((d, i, g) => {
171
+ const rect = d3.select(g[i])
172
+ .selectAll<SVGRectElement, typeof d>('rect')
173
+ .data([d])
174
+ .join('rect')
175
+ .attr('x', 0)
176
+ .attr('y', 0)
177
+ .attr('width', _d => _d.width)
178
+ .attr('height', _d => _d.height)
179
+ })
180
+
181
+ }
182
+
183
+ export const Scatter = defineSVGLayer<ScatterPlotExtendContext, ScatterPlotPluginParams, ScatterParams>({
184
+ name: layerName,
185
+ defaultParams: DEFAULT_SCATTER_PARAMS,
186
+ layerIndex: LAYER_INDEX_OF_GRAPHIC,
187
+ initShow: true,
188
+ validator: (params) => {
189
+ const result = validateObject(params, {
190
+ radius: {
191
+ toBeTypes: ['number']
192
+ },
193
+ fillColorType: {
194
+ toBeOption: 'ColorType',
195
+ },
196
+ strokeColorType: {
197
+ toBeOption: 'ColorType',
198
+ },
199
+ strokeWidth: {
200
+ toBeTypes: ['number']
201
+ },
202
+ })
203
+
204
+ return result
205
+ },
206
+ setup: ({ svgG, pluginParams$, layerParams$, context }) => {
207
+
208
+ // const subscription = layerParams$.subscribe((params) => {
209
+ // // Handle params update
210
+ // })
211
+
212
+ // context.seriesData$.subscribe((data) => {
213
+ // // Handle series data update
214
+ // console.log(data)
215
+ // })
216
+ const destroy$ = new Subject()
217
+
218
+ context.layout$
219
+ .pipe(
220
+ takeUntil(destroy$)
221
+ )
222
+ .subscribe(layout => {
223
+ d3.select(svgG)
224
+ .attr('transform', `translate(${layout.left}, ${layout.top})`)
225
+ })
226
+
227
+ const clipPathID = createUniID(pluginName, layerName, 'clipPath-box')
228
+ const circleGClassName = createClassName(pluginName, layerName, 'circleG')
229
+ const circleClassName = createClassName(pluginName, layerName, 'circle')
230
+
231
+ const {
232
+ seriesSelection$,
233
+ axesSelection$,
234
+ defsSelection$,
235
+ graphicGSelection$
236
+ } = multivariateSelectionsObservable({
237
+ selection: d3.select(svgG),
238
+ pluginName,
239
+ layerName,
240
+ clipPathID,
241
+ seriesLabels$: context.seriesLabels$,
242
+ containerPosition$: context.containerPosition$,
243
+ graphicTransform$: context.graphicTransform$
244
+ })
245
+
246
+ const graphicReverseScale$: Observable<[number, number][]> = combineLatest({
247
+ computedData: context.computedData$,
248
+ graphicReverseScale: context.graphicReverseScale$
249
+ }).pipe(
250
+ takeUntil(destroy$),
251
+ debounceTime(0),
252
+ map(data => {
253
+ return data.computedData.map((series, categoryIndex) => {
254
+ return data.graphicReverseScale[categoryIndex]
255
+ })
256
+ })
257
+ )
258
+
259
+ const clipPathSubscription = combineLatest({
260
+ defsSelection: defsSelection$,
261
+ layout: context.layout$,
262
+ }).pipe(
263
+ takeUntil(destroy$),
264
+ debounceTime(0),
265
+ ).subscribe(data => {
266
+ // 外層的遮罩
267
+ const clipPathData = [{
268
+ id: clipPathID,
269
+ width: data.layout.width,
270
+ height: data.layout.height
271
+ }]
272
+ renderClipPath({
273
+ defsSelection: data.defsSelection,
274
+ clipPathData,
275
+ })
276
+ })
277
+
278
+ const graphicSelection$ = combineLatest({
279
+ graphicGSelection: graphicGSelection$,
280
+ visibleComputedXYData: context.visibleComputedXYData$,
281
+ layerParams: layerParams$,
282
+ graphicReverseScale: graphicReverseScale$,
283
+ styles: pluginParams$.pipe(
284
+ map(params => params.styles)
285
+ ),
286
+ theme: context.theme$
287
+ }).pipe(
288
+ takeUntil(destroy$),
289
+ debounceTime(0),
290
+ map(data => {
291
+ return renderDots({
292
+ graphicGSelection: data.graphicGSelection,
293
+ circleGClassName,
294
+ circleClassName,
295
+ visibleComputedXYData: data.visibleComputedXYData,
296
+ layerParams: data.layerParams,
297
+ styles: data.styles,
298
+ theme: data.theme,
299
+ graphicReverseScale: data.graphicReverseScale
300
+ })
301
+ })
302
+ )
303
+
304
+ const valueLabels$ = context.valueLabels$.pipe(
305
+ takeUntil(destroy$),
306
+ map(valueLabels => {
307
+ return [
308
+ valueLabels[0] ?? 'X',
309
+ valueLabels[1] ?? 'Y'
310
+ ]
311
+ }),
312
+ distinctUntilChanged((a, b) => a[0] === b[0] && a[1] === b[1])
313
+ )
314
+
315
+ const highlightTarget$ = pluginParams$.pipe(
316
+ takeUntil(destroy$),
317
+ map(d => d.styles.highlightTarget),
318
+ distinctUntilChanged()
319
+ )
320
+
321
+ combineLatest({
322
+ graphicSelection: graphicSelection$,
323
+ computedData: context.computedData$,
324
+ // CategoryDataMap: context.CategoryDataMap$,
325
+ highlightTarget: highlightTarget$,
326
+ valueLabels: valueLabels$
327
+ }).pipe(
328
+ takeUntil(destroy$),
329
+ debounceTime(0),
330
+ ).subscribe(data => {
331
+
332
+ data.graphicSelection
333
+ .on('mouseover', (event, datum) => {
334
+ // event.stopPropagation()
335
+ // console.log({
336
+ // type: 'multiValue',
337
+ // eventName: 'mouseover',
338
+ // pluginName,
339
+ // highlightTarget: data.highlightTarget,
340
+ // datum,
341
+ // category: data.CategoryDataMap.get(datum.categoryLabel)!,
342
+ // categoryIndex: datum.categoryIndex,
343
+ // categoryLabel: datum.categoryLabel,
344
+ // data: data.computedData,
345
+ // event,
346
+ // })
347
+ context.eventTrigger$.next({
348
+ // type: 'multiValue',
349
+ // eventName: 'mouseover',
350
+ // pluginName,
351
+ // highlightTarget: data.highlightTarget,
352
+ // valueDetail: [
353
+ // {
354
+ // value: datum.value[0],
355
+ // valueIndex: 0,
356
+ // valueLabel: data.valueLabels[0]
357
+ // },
358
+ // {
359
+ // value: datum.value[1],
360
+ // valueIndex: 1,
361
+ // valueLabel: data.valueLabels[1]
362
+ // }
363
+ // ],
364
+ // datum,
365
+ // category: data.CategoryDataMap.get(datum.categoryLabel)!,
366
+ // categoryIndex: datum.categoryIndex,
367
+ // categoryLabel: datum.categoryLabel,
368
+ // data: data.computedData,
369
+ // event,
370
+ eventName: 'mouseover',
371
+ pluginName,
372
+ layerName,
373
+ target: datum,
374
+ event
375
+ })
376
+ })
377
+ .on('mousemove', (event, datum) => {
378
+ // event.stopPropagation()
379
+
380
+ context.eventTrigger$.next({
381
+ // type: 'multiValue',
382
+ // eventName: 'mousemove',
383
+ // pluginName,
384
+ // highlightTarget: data.highlightTarget,
385
+ // valueDetail: [
386
+ // {
387
+ // value: datum.value[0],
388
+ // valueIndex: 0,
389
+ // valueLabel: data.valueLabels[0]
390
+ // },
391
+ // {
392
+ // value: datum.value[1],
393
+ // valueIndex: 1,
394
+ // valueLabel: data.valueLabels[1]
395
+ // }
396
+ // ],
397
+ // datum,
398
+ // category: data.CategoryDataMap.get(datum.categoryLabel)!,
399
+ // categoryIndex: datum.categoryIndex,
400
+ // categoryLabel: datum.categoryLabel,
401
+ // data: data.computedData,
402
+ // event,
403
+ eventName: 'mousemove',
404
+ pluginName,
405
+ layerName,
406
+ target: datum,
407
+ event
408
+ })
409
+ })
410
+ .on('mouseout', (event, datum) => {
411
+ // event.stopPropagation()
412
+
413
+ context.eventTrigger$.next({
414
+ // type: 'multiValue',
415
+ // eventName: 'mouseout',
416
+ // pluginName,
417
+ // highlightTarget: data.highlightTarget,
418
+ // valueDetail: [
419
+ // {
420
+ // value: datum.value[0],
421
+ // valueIndex: 0,
422
+ // valueLabel: data.valueLabels[0]
423
+ // },
424
+ // {
425
+ // value: datum.value[1],
426
+ // valueIndex: 1,
427
+ // valueLabel: data.valueLabels[1]
428
+ // }
429
+ // ],
430
+ // datum,
431
+ // category: data.CategoryDataMap.get(datum.categoryLabel)!,
432
+ // categoryIndex: datum.categoryIndex,
433
+ // categoryLabel: datum.categoryLabel,
434
+ // data: data.computedData,
435
+ // event,
436
+ eventName: 'mouseout',
437
+ pluginName,
438
+ layerName,
439
+ target: datum,
440
+ event
441
+ })
442
+ })
443
+ .on('click', (event, datum) => {
444
+ // event.stopPropagation()
445
+
446
+ context.eventTrigger$.next({
447
+ // type: 'multiValue',
448
+ // eventName: 'click',
449
+ // pluginName,
450
+ // highlightTarget: data.highlightTarget,
451
+ // valueDetail: [
452
+ // {
453
+ // value: datum.value[0],
454
+ // valueIndex: 0,
455
+ // valueLabel: data.valueLabels[0]
456
+ // },
457
+ // {
458
+ // value: datum.value[1],
459
+ // valueIndex: 1,
460
+ // valueLabel: data.valueLabels[1]
461
+ // }
462
+ // ],
463
+ // datum,
464
+ // category: data.CategoryDataMap.get(datum.categoryLabel)!,
465
+ // categoryIndex: datum.categoryIndex,
466
+ // categoryLabel: datum.categoryLabel,
467
+ // data: data.computedData,
468
+ // event,
469
+ eventName: 'click',
470
+ pluginName,
471
+ layerName,
472
+ target: datum,
473
+ event
474
+ })
475
+ })
476
+
477
+ })
478
+
479
+ combineLatest({
480
+ graphicSelection: graphicSelection$,
481
+ highlight: context.highlight$.pipe(
482
+ map(data => data.map(d => d.id))
483
+ ),
484
+ styles: pluginParams$.pipe(
485
+ map(pluginName => pluginName.styles)
486
+ )
487
+ }).pipe(
488
+ takeUntil(destroy$),
489
+ switchMap(async d => d)
490
+ ).subscribe(data => {
491
+ highlightDots({
492
+ selection: data.graphicSelection,
493
+ ids: data.highlight,
494
+ styles: data.styles
495
+ })
496
+ })
497
+
498
+ // graphicGSelection$.subscribe(data => {
499
+ // console.log('graphicGSelection$', data)
500
+ // })
501
+
502
+ // observer.visibleComputedXYData$.subscribe(data => {
503
+ // console.log('visibleComputedXYData$', data)
504
+ // })
505
+
506
+ // observer.fullChartParams$.subscribe(data => {
507
+ // console.log('fullChartParams$', data)
508
+ // })
509
+
510
+ // observer.layerParams$.subscribe(data => {
511
+ // console.log('layerParams$', data)
512
+ // })
513
+
514
+ return () => {
515
+ destroy$.next(undefined)
516
+ }
517
+ }
518
+ })