@orbcharts/plugins-basic 3.0.0-alpha.47 → 3.0.0-alpha.49

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,9 @@
1
- import { BubblesParams, PieParams, PieEventTextsParams, PieLabelsParams, SeriesLegendParams } from './types';
1
+ import { BubblesParams, PieParams, PieEventTextsParams, PieLabelsParams, RoseParams, RoseLabelsParams, SeriesLegendParams } from './types';
2
2
 
3
3
  export declare const DEFAULT_BUBBLES_PARAMS: BubblesParams;
4
4
  export declare const DEFAULT_PIE_PARAMS: PieParams;
5
5
  export declare const DEFAULT_PIE_EVENT_TEXTS_PARAMS: PieEventTextsParams;
6
6
  export declare const DEFAULT_PIE_LABELS_PARAMS: PieLabelsParams;
7
+ export declare const DEFAULT_ROSE_PARAMS: RoseParams;
8
+ export declare const DEFAULT_ROSE_LABELS_PARAMS: RoseLabelsParams;
7
9
  export declare const DEFAULT_SERIES_LEGEND_PARAMS: SeriesLegendParams;
@@ -4,4 +4,6 @@ export { Bubbles } from './plugins/Bubbles';
4
4
  export { Pie } from './plugins/Pie';
5
5
  export { PieEventTexts } from './plugins/PieEventTexts';
6
6
  export { PieLabels } from './plugins/PieLabels';
7
+ export { Rose } from './plugins/Rose';
8
+ export { RoseLabels } from './plugins/RoseLabels';
7
9
  export { SeriesLegend } from './plugins/SeriesLegend';
@@ -0,0 +1,10 @@
1
+ import { ComputedDatumSeries } from '@orbcharts/core';
2
+ import { D3PieDatum } from '../seriesUtils';
3
+ import { RoseParams } from '../types';
4
+
5
+ export interface PieDatum extends D3PieDatum {
6
+ data: ComputedDatumSeries;
7
+ id: string;
8
+ prevValue: number;
9
+ }
10
+ export declare const Rose: import('@orbcharts/core').PluginConstructor<"series", string, RoseParams>;
@@ -0,0 +1,3 @@
1
+ import { RoseLabelsParams } from '../types';
2
+
3
+ export declare const RoseLabels: import('@orbcharts/core').PluginConstructor<"series", string, RoseLabelsParams>;
@@ -1,6 +1,6 @@
1
1
  import { ComputedDatumSeries, EventSeries, EventName, ColorType } from '@orbcharts/core';
2
2
 
3
- export type BubbleScaleType = 'area' | 'radius';
3
+ export type ArcScaleType = 'area' | 'radius';
4
4
  export interface BubblesParams {
5
5
  force: {
6
6
  strength: number;
@@ -13,13 +13,12 @@ export interface BubblesParams {
13
13
  lineLengthMin: number;
14
14
  };
15
15
  highlightRIncrease: number;
16
- bubbleScaleType: BubbleScaleType;
16
+ arcScaleType: ArcScaleType;
17
17
  }
18
18
  export interface PieParams {
19
19
  outerRadius: number;
20
20
  innerRadius: number;
21
- outerMouseoverRadius: number;
22
- enterDuration: number;
21
+ mouseoverOuterRadius: number;
23
22
  startAngle: number;
24
23
  endAngle: number;
25
24
  padAngle: number;
@@ -36,13 +35,26 @@ export interface PieEventTextsParams {
36
35
  }
37
36
  export interface PieLabelsParams {
38
37
  outerRadius: number;
39
- outerMouseoverRadius: number;
38
+ mouseoverOuterRadius: number;
40
39
  startAngle: number;
41
40
  endAngle: number;
42
41
  labelCentroid: number;
43
42
  labelFn: ((d: ComputedDatumSeries) => string);
44
43
  labelColorType: ColorType;
45
44
  }
45
+ export interface RoseParams {
46
+ outerRadius: number;
47
+ cornerRadius: number;
48
+ arcScaleType: ArcScaleType;
49
+ mouseoverAngleIncrease: number;
50
+ }
51
+ export interface RoseLabelsParams {
52
+ outerRadius: number;
53
+ labelCentroid: number;
54
+ labelFn: ((d: ComputedDatumSeries) => string);
55
+ labelColorType: ColorType;
56
+ arcScaleType: ArcScaleType;
57
+ }
46
58
  export interface SeriesLegendParams {
47
59
  position: 'top' | 'bottom' | 'left' | 'right';
48
60
  justify: 'start' | 'center' | 'end';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbcharts/plugins-basic",
3
- "version": "3.0.0-alpha.47",
3
+ "version": "3.0.0-alpha.49",
4
4
  "description": "plugins for OrbCharts",
5
5
  "author": "Blue Planet Inc.",
6
6
  "license": "Apache-2.0",
@@ -35,7 +35,7 @@
35
35
  "vite-plugin-dts": "^3.7.3"
36
36
  },
37
37
  "dependencies": {
38
- "@orbcharts/core": "^3.0.0-alpha.45",
38
+ "@orbcharts/core": "^3.0.0-alpha.47",
39
39
  "d3": "^7.8.5",
40
40
  "rxjs": "^7.8.1"
41
41
  }
@@ -4,6 +4,8 @@ import type {
4
4
  PieParams,
5
5
  PieEventTextsParams,
6
6
  PieLabelsParams,
7
+ RoseParams,
8
+ RoseLabelsParams,
7
9
  SeriesLegendParams } from './types'
8
10
 
9
11
 
@@ -19,7 +21,7 @@ export const DEFAULT_BUBBLES_PARAMS: BubblesParams = {
19
21
  lineLengthMin: 4
20
22
  },
21
23
  highlightRIncrease: 0,
22
- bubbleScaleType: 'area'
24
+ arcScaleType: 'area'
23
25
  }
24
26
 
25
27
  export const DEFAULT_PIE_PARAMS: PieParams = {
@@ -31,9 +33,9 @@ export const DEFAULT_PIE_PARAMS: PieParams = {
31
33
  // },
32
34
  outerRadius: 0.95,
33
35
  innerRadius: 0,
34
- outerMouseoverRadius: 1,
36
+ mouseoverOuterRadius: 1,
35
37
  // label?: LabelStyle
36
- enterDuration: 800,
38
+ // enterDuration: 800,
37
39
  startAngle: 0,
38
40
  endAngle: Math.PI * 2,
39
41
  padAngle: 0.02,
@@ -82,7 +84,7 @@ export const DEFAULT_PIE_LABELS_PARAMS: PieLabelsParams = {
82
84
  // solidColor: undefined,
83
85
  // colors: DEFAULT_COLORS,
84
86
  outerRadius: 0.95,
85
- outerMouseoverRadius: 1,
87
+ mouseoverOuterRadius: 1,
86
88
  // innerRadius: 0,
87
89
  // enterDuration: 800,
88
90
  startAngle: 0,
@@ -90,7 +92,22 @@ export const DEFAULT_PIE_LABELS_PARAMS: PieLabelsParams = {
90
92
  labelCentroid: 2.3,
91
93
  // fontSize: 12,
92
94
  labelColorType: 'series',
93
- labelFn: d => String(d.value),
95
+ labelFn: d => String(d.label),
96
+ }
97
+
98
+ export const DEFAULT_ROSE_PARAMS: RoseParams = {
99
+ outerRadius: 0.95,
100
+ cornerRadius: 0,
101
+ arcScaleType: 'area',
102
+ mouseoverAngleIncrease: 0.05
103
+ }
104
+
105
+ export const DEFAULT_ROSE_LABELS_PARAMS: RoseLabelsParams = {
106
+ outerRadius: 0.95,
107
+ labelCentroid: 2.5,
108
+ labelFn: d => String(d.label),
109
+ labelColorType: 'series',
110
+ arcScaleType: 'area'
94
111
  }
95
112
 
96
113
  export const DEFAULT_SERIES_LEGEND_PARAMS: SeriesLegendParams = {
@@ -4,4 +4,6 @@ export { Bubbles } from './plugins/Bubbles'
4
4
  export { Pie } from './plugins/Pie'
5
5
  export { PieEventTexts } from './plugins/PieEventTexts'
6
6
  export { PieLabels } from './plugins/PieLabels'
7
- export { SeriesLegend } from './plugins/SeriesLegend'
7
+ export { Rose } from './plugins/Rose'
8
+ export { RoseLabels } from './plugins/RoseLabels'
9
+ export { SeriesLegend } from './plugins/SeriesLegend'
@@ -18,7 +18,7 @@ import type {
18
18
  SeriesContainerPosition } from '@orbcharts/core'
19
19
  import {
20
20
  defineSeriesPlugin } from '@orbcharts/core'
21
- import type { BubblesParams, BubbleScaleType } from '../types'
21
+ import type { BubblesParams, ArcScaleType } from '../types'
22
22
  import { DEFAULT_BUBBLES_PARAMS } from '../defaults'
23
23
  import { renderCircleText } from '../../utils/d3Graphics'
24
24
 
@@ -80,7 +80,7 @@ function getMaxR ({ data, bubbleGroupR, maxValue, avgValue }: {
80
80
  const maxSize = maxValue * sizeRate
81
81
  const maxR = Math.pow(maxSize / Math.PI, 0.5)
82
82
 
83
- const modifier = 0.75 // @Q@ 因為以下公式是假設泡泡是正方型來計算,所以畫出來的圖會偏大一些,這個數值是用來修正用的
83
+ const modifier = 0.785 // @Q@ 因為以下公式是假設泡泡是正方型來計算,所以畫出來的圖會偏大一些,這個數值是用來修正用的
84
84
  return maxR * modifier
85
85
  }
86
86
 
@@ -90,7 +90,7 @@ function createBubblesData ({ data, LastBubbleDataMap, graphicWidth, graphicHeig
90
90
  graphicWidth: number
91
91
  graphicHeight: number
92
92
  SeriesContainerPositionMap: Map<string, SeriesContainerPosition>
93
- scaleType: BubbleScaleType
93
+ scaleType: ArcScaleType
94
94
  // highlightIds: string[]
95
95
  }) {
96
96
  const bubbleGroupR = Math.min(...[graphicWidth, graphicHeight]) / 2
@@ -392,7 +392,7 @@ export const Bubbles = defineSeriesPlugin('Bubbles', DEFAULT_BUBBLES_PARAMS)(({
392
392
 
393
393
  const scaleType$ = observer.fullParams$.pipe(
394
394
  takeUntil(destroy$),
395
- map(d => d.bubbleScaleType),
395
+ map(d => d.arcScaleType),
396
396
  distinctUntilChanged()
397
397
  )
398
398
 
@@ -162,7 +162,7 @@ function highlight ({ pathSelection, ids, fullChartParams, arc, arcMouseover }:
162
162
  function createEachPie (pluginName: string, context: {
163
163
  containerSelection: d3.Selection<SVGGElement, any, any, unknown>
164
164
  computedData$: Observable<ComputedDatumSeries[][]>
165
- containerComputedLayoutData$: Observable<ComputedDatumSeries[]>
165
+ containerVisibleComputedLayoutData$: Observable<ComputedDatumSeries[]>
166
166
  SeriesDataMap$: Observable<Map<string, ComputedDatumSeries[]>>
167
167
  fullParams$: Observable<PieParams>
168
168
  fullChartParams$: Observable<ChartParams>
@@ -199,12 +199,13 @@ function createEachPie (pluginName: string, context: {
199
199
 
200
200
  const shorterSideWith$ = context.seriesContainerPosition$.pipe(
201
201
  takeUntil(destroy$),
202
- map(d => d.width < d.height ? d.width : d.height)
202
+ map(d => d.width < d.height ? d.width : d.height),
203
+ distinctUntilChanged()
203
204
  )
204
205
 
205
206
  const pieData$: Observable<PieDatum[]> = new Observable(subscriber => {
206
207
  combineLatest({
207
- containerComputedLayoutData: context.containerComputedLayoutData$,
208
+ containerVisibleComputedLayoutData: context.containerVisibleComputedLayoutData$,
208
209
  fullParams: context.fullParams$,
209
210
  }).pipe(
210
211
  takeUntil(destroy$),
@@ -212,7 +213,7 @@ function createEachPie (pluginName: string, context: {
212
213
  ).subscribe(data => {
213
214
  // console.log('pieData', data)
214
215
  const pieData: PieDatum[] = makePieData({
215
- data: data.containerComputedLayoutData,
216
+ data: data.containerVisibleComputedLayoutData,
216
217
  startAngle: data.fullParams.startAngle,
217
218
  endAngle: data.fullParams.endAngle
218
219
  })
@@ -256,7 +257,7 @@ function createEachPie (pluginName: string, context: {
256
257
  const arcMouseover = makeD3Arc({
257
258
  axisWidth: data.shorterSideWith,
258
259
  innerRadius: data.fullParams.innerRadius,
259
- outerRadius: data.fullParams.outerMouseoverRadius, // 外半徑變化
260
+ outerRadius: data.fullParams.mouseoverOuterRadius, // 外半徑變化
260
261
  padAngle: data.fullParams.padAngle,
261
262
  cornerRadius: data.fullParams.cornerRadius
262
263
  })
@@ -385,18 +386,33 @@ function createEachPie (pluginName: string, context: {
385
386
  })
386
387
 
387
388
  // -- 更新資料 --
388
- if (!enter.size() && update.size() > 0) {
389
- // console.log('test')
390
- const pathSelection = renderPie({
391
- selection: context.containerSelection,
392
- data: data.pieData,
393
- arc: data.arc,
394
- pathClassName
395
- })
396
- subscriber.next(pathSelection)
397
- }
389
+ // if (!enter.size() && update.size() > 0) {
390
+ // // console.log('test')
391
+ // const pathSelection = renderPie({
392
+ // selection: context.containerSelection,
393
+ // data: data.pieData,
394
+ // arc: data.arc,
395
+ // pathClassName
396
+ // })
397
+ // subscriber.next(pathSelection)
398
+ // }
398
399
  })
399
- })
400
+ }).pipe(
401
+ shareReplay(1)
402
+ )
403
+
404
+ // pathSelection$.subscribe(data => {
405
+ // console.log('pathSelection', data)
406
+ // })
407
+ // context.SeriesDataMap$.subscribe(data => {
408
+ // console.log('SeriesDataMap', data)
409
+ // })
410
+ // context.computedData$.subscribe(data => {
411
+ // console.log('computedData', data)
412
+ // })
413
+ // highlightTarget$.subscribe(data => {
414
+ // console.log('highlightTarget', data)
415
+ // })
400
416
 
401
417
  combineLatest({
402
418
  pathSelection: pathSelection$,
@@ -513,9 +529,6 @@ export const Pie = defineSeriesPlugin(pluginName, DEFAULT_PIE_PARAMS)(({ selecti
513
529
 
514
530
  const unsubscribeFnArr: (() => void)[] = []
515
531
 
516
- // @Q@ 在seriesCenterSelection$之後才訂閱會造成fullParams$訂閱不到最初次的值,還需找時間研究先workaround
517
- observer.fullParams$.subscribe()
518
-
519
532
  seriesCenterSelection$
520
533
  .pipe(
521
534
  takeUntil(destroy$)
@@ -532,7 +545,7 @@ export const Pie = defineSeriesPlugin(pluginName, DEFAULT_PIE_PARAMS)(({ selecti
532
545
  // console.log('containerIndex', containerIndex)
533
546
  const containerSelection = d3.select(g[containerIndex])
534
547
 
535
- const containerComputedLayoutData$ = observer.computedLayoutData$.pipe(
548
+ const containerVisibleComputedLayoutData$ = observer.visibleComputedLayoutData$.pipe(
536
549
  takeUntil(destroy$),
537
550
  map(data => data[containerIndex] ?? data[0])
538
551
  )
@@ -545,7 +558,7 @@ export const Pie = defineSeriesPlugin(pluginName, DEFAULT_PIE_PARAMS)(({ selecti
545
558
  unsubscribeFnArr[containerIndex] = createEachPie(pluginName, {
546
559
  containerSelection: containerSelection,
547
560
  computedData$: observer.computedData$,
548
- containerComputedLayoutData$: containerComputedLayoutData$,
561
+ containerVisibleComputedLayoutData$: containerVisibleComputedLayoutData$,
549
562
  SeriesDataMap$: observer.SeriesDataMap$,
550
563
  fullParams$: observer.fullParams$,
551
564
  fullChartParams$: observer.fullChartParams$,
@@ -6,6 +6,7 @@ import {
6
6
  map,
7
7
  takeUntil,
8
8
  Observable,
9
+ distinctUntilChanged,
9
10
  Subject,
10
11
  BehaviorSubject } from 'rxjs'
11
12
  import {
@@ -160,7 +161,7 @@ function highlight ({ labelSelection, ids, fullChartParams }: {
160
161
  function createEachPieLabel (pluginName: string, context: {
161
162
  containerSelection: d3.Selection<SVGGElement, any, any, unknown>
162
163
  // computedData$: Observable<ComputedDatumSeries[][]>
163
- containerComputedLayoutData$: Observable<ComputedDatumSeries[]>
164
+ containerVisibleComputedLayoutData$: Observable<ComputedDatumSeries[]>
164
165
  // SeriesDataMap$: Observable<Map<string, ComputedDatumSeries[]>>
165
166
  fullParams$: Observable<PieLabelsParams>
166
167
  fullChartParams$: Observable<ChartParams>
@@ -173,52 +174,16 @@ function createEachPieLabel (pluginName: string, context: {
173
174
  // const graphicSelection: d3.Selection<SVGGElement, any, any, any> = selection.append('g')
174
175
  let labelSelection$: Subject<d3.Selection<SVGPathElement, RenderDatum, any, any>> = new Subject()
175
176
  let renderData: RenderDatum[] = []
176
- // let highlightTarget: HighlightTarget | undefined
177
- // let fullChartParams: ChartParams | undefined
178
-
179
- // observer.layout$
180
- // .pipe(
181
- // first()
182
- // )
183
- // .subscribe(size => {
184
- // selection
185
- // .attr('transform', `translate(${size.width / 2}, ${size.height / 2})`)
186
- // observer.layout$
187
- // .pipe(
188
- // takeUntil(destroy$)
189
- // )
190
- // .subscribe(size => {
191
- // selection
192
- // .transition()
193
- // .attr('transform', `translate(${size.width / 2}, ${size.height / 2})`)
194
- // })
195
- // })
196
-
197
177
 
198
-
199
- // combineLatest({
200
- // event: store.event$,
201
- // fullChartParams: fullChartParams$
202
- // }).pipe(
203
- // // 轉換後會退訂前一個未完成的訂閱事件,因此可以取到「同時間」最後一次的訂閱事件
204
- // switchMap(async (d) => d),
205
- // ).subscribe(d => {
206
- // if (d.event.eventName === 'mouseover' && d.event.datum) {
207
- // highlight({
208
- // labelSelection,
209
- // data: renderData,
210
- // id: d.fullChartParams.highlightTarget === 'datum' ? d.event.datum!.id : undefined,
211
- // label: d.fullChartParams.highlightTarget === 'series' ? d.event.datum!.label : undefined,
212
- // fullChartParams: d.fullChartParams
213
- // })
214
- // } else if (d.event.eventName === 'mouseout') {
215
- // removeHighlight({ labelSelection })
216
- // }
217
- // })
178
+ const shorterSideWith$ = context.seriesContainerPosition$.pipe(
179
+ takeUntil(destroy$),
180
+ map(d => d.width < d.height ? d.width : d.height),
181
+ distinctUntilChanged()
182
+ )
218
183
 
219
184
  combineLatest({
220
- layout: context.seriesContainerPosition$,
221
- containerComputedLayoutData: context.containerComputedLayoutData$,
185
+ shorterSideWith: shorterSideWith$,
186
+ containerVisibleComputedLayoutData: context.containerVisibleComputedLayoutData$,
222
187
  fullParams: context.fullParams$,
223
188
  fullChartParams: context.fullChartParams$
224
189
  }).pipe(
@@ -226,11 +191,11 @@ function createEachPieLabel (pluginName: string, context: {
226
191
  switchMap(async (d) => d),
227
192
  ).subscribe(data => {
228
193
 
229
- const shorterSideWith = data.layout.width < data.layout.height ? data.layout.width : data.layout.height
194
+ // const shorterSideWith = data.layout.width < data.layout.height ? data.layout.width : data.layout.height
230
195
 
231
196
  // 弧產生器 (d3.arc())
232
197
  const arc = makeD3Arc({
233
- axisWidth: shorterSideWith,
198
+ axisWidth: data.shorterSideWith,
234
199
  innerRadius: 0,
235
200
  outerRadius: data.fullParams.outerRadius,
236
201
  padAngle: 0,
@@ -238,15 +203,15 @@ function createEachPieLabel (pluginName: string, context: {
238
203
  })
239
204
 
240
205
  const arcMouseover = makeD3Arc({
241
- axisWidth: shorterSideWith,
206
+ axisWidth: data.shorterSideWith,
242
207
  innerRadius: 0,
243
- outerRadius: data.fullParams.outerMouseoverRadius, // 外半徑變化
208
+ outerRadius: data.fullParams.mouseoverOuterRadius, // 外半徑變化
244
209
  padAngle: 0,
245
210
  cornerRadius: 0
246
211
  })
247
212
 
248
213
  const pieData = makePieData({
249
- data: data.containerComputedLayoutData,
214
+ data: data.containerVisibleComputedLayoutData,
250
215
  startAngle: data.fullParams.startAngle,
251
216
  endAngle: data.fullParams.endAngle
252
217
  })
@@ -308,7 +273,7 @@ export const PieLabels = defineSeriesPlugin(pluginName, DEFAULT_PIE_LABELS_PARAM
308
273
 
309
274
  const containerSelection = d3.select(g[containerIndex])
310
275
 
311
- const containerComputedLayoutData$ = observer.computedLayoutData$.pipe(
276
+ const containerVisibleComputedLayoutData$ = observer.visibleComputedLayoutData$.pipe(
312
277
  takeUntil(destroy$),
313
278
  map(data => data[containerIndex] ?? data[0])
314
279
  )
@@ -321,7 +286,7 @@ export const PieLabels = defineSeriesPlugin(pluginName, DEFAULT_PIE_LABELS_PARAM
321
286
  unsubscribeFnArr[containerIndex] = createEachPieLabel(pluginName, {
322
287
  containerSelection: containerSelection,
323
288
  // computedData$: observer.computedData$,
324
- containerComputedLayoutData$: containerComputedLayoutData$,
289
+ containerVisibleComputedLayoutData$: containerVisibleComputedLayoutData$,
325
290
  // SeriesDataMap$: observer.SeriesDataMap$,
326
291
  fullParams$: observer.fullParams$,
327
292
  fullChartParams$: observer.fullChartParams$,