@visactor/vseed 0.1.49 → 0.1.51

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 (192) hide show
  1. package/dist/cjs/index.cjs +3 -3
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/esm/builder/builder/buildAdvanced.js +1 -1
  4. package/dist/esm/builder/builder/buildAdvanced.js.map +1 -1
  5. package/dist/esm/builder/builder/buildSpec.js +1 -1
  6. package/dist/esm/builder/builder/buildSpec.js.map +1 -1
  7. package/dist/esm/builder/builder/builder.d.ts +483 -1
  8. package/dist/esm/builder/builder/builder.js +5 -1
  9. package/dist/esm/builder/builder/builder.js.map +1 -1
  10. package/dist/esm/dataSelector/selector.d.ts +5 -0
  11. package/dist/esm/dataSelector/selector.js +92 -50
  12. package/dist/esm/dataSelector/selector.js.map +1 -1
  13. package/dist/esm/pipeline/advanced/chart/pipes/config/boxplot.js +2 -1
  14. package/dist/esm/pipeline/advanced/chart/pipes/config/boxplot.js.map +1 -1
  15. package/dist/esm/pipeline/advanced/chart/pipes/config/column.js +2 -1
  16. package/dist/esm/pipeline/advanced/chart/pipes/config/column.js.map +1 -1
  17. package/dist/esm/pipeline/advanced/chart/pipes/config/dualAxis.js +2 -1
  18. package/dist/esm/pipeline/advanced/chart/pipes/config/dualAxis.js.map +1 -1
  19. package/dist/esm/pipeline/advanced/chart/pipes/config/histogram.js +2 -1
  20. package/dist/esm/pipeline/advanced/chart/pipes/config/histogram.js.map +1 -1
  21. package/dist/esm/pipeline/advanced/chart/pipes/config/line.js +2 -1
  22. package/dist/esm/pipeline/advanced/chart/pipes/config/line.js.map +1 -1
  23. package/dist/esm/pipeline/advanced/chart/pipes/config/scatter.js +2 -1
  24. package/dist/esm/pipeline/advanced/chart/pipes/config/scatter.js.map +1 -1
  25. package/dist/esm/pipeline/advanced/chart/pipes/reshape/reshapeWithEncoding.js +1 -1
  26. package/dist/esm/pipeline/advanced/chart/pipes/reshape/reshapeWithEncoding.js.map +1 -1
  27. package/dist/esm/pipeline/spec/chart/pipeline/area.js +3 -2
  28. package/dist/esm/pipeline/spec/chart/pipeline/area.js.map +1 -1
  29. package/dist/esm/pipeline/spec/chart/pipeline/areaPercent.js +3 -2
  30. package/dist/esm/pipeline/spec/chart/pipeline/areaPercent.js.map +1 -1
  31. package/dist/esm/pipeline/spec/chart/pipeline/bar.js +3 -2
  32. package/dist/esm/pipeline/spec/chart/pipeline/bar.js.map +1 -1
  33. package/dist/esm/pipeline/spec/chart/pipeline/barParallel.js +3 -2
  34. package/dist/esm/pipeline/spec/chart/pipeline/barParallel.js.map +1 -1
  35. package/dist/esm/pipeline/spec/chart/pipeline/barPercent.js +3 -2
  36. package/dist/esm/pipeline/spec/chart/pipeline/barPercent.js.map +1 -1
  37. package/dist/esm/pipeline/spec/chart/pipeline/boxplot.js +3 -2
  38. package/dist/esm/pipeline/spec/chart/pipeline/boxplot.js.map +1 -1
  39. package/dist/esm/pipeline/spec/chart/pipeline/column.js +3 -2
  40. package/dist/esm/pipeline/spec/chart/pipeline/column.js.map +1 -1
  41. package/dist/esm/pipeline/spec/chart/pipeline/columnParallel.js +3 -2
  42. package/dist/esm/pipeline/spec/chart/pipeline/columnParallel.js.map +1 -1
  43. package/dist/esm/pipeline/spec/chart/pipeline/columnPercent.js +3 -2
  44. package/dist/esm/pipeline/spec/chart/pipeline/columnPercent.js.map +1 -1
  45. package/dist/esm/pipeline/spec/chart/pipeline/dualAxis.js +5 -4
  46. package/dist/esm/pipeline/spec/chart/pipeline/dualAxis.js.map +1 -1
  47. package/dist/esm/pipeline/spec/chart/pipeline/histogram.js +3 -2
  48. package/dist/esm/pipeline/spec/chart/pipeline/histogram.js.map +1 -1
  49. package/dist/esm/pipeline/spec/chart/pipeline/line.js +3 -2
  50. package/dist/esm/pipeline/spec/chart/pipeline/line.js.map +1 -1
  51. package/dist/esm/pipeline/spec/chart/pipeline/scatter.js +3 -2
  52. package/dist/esm/pipeline/spec/chart/pipeline/scatter.js.map +1 -1
  53. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.d.ts +2 -0
  54. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.js +94 -0
  55. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.js.map +1 -0
  56. package/dist/esm/pipeline/spec/chart/pipes/annotation/index.d.ts +1 -0
  57. package/dist/esm/pipeline/spec/chart/pipes/annotation/index.js +2 -1
  58. package/dist/esm/pipeline/spec/chart/pipes/annotation/utils.d.ts +1 -1
  59. package/dist/esm/pipeline/spec/chart/pipes/annotation/utils.js +2 -1
  60. package/dist/esm/pipeline/spec/chart/pipes/annotation/utils.js.map +1 -1
  61. package/dist/esm/pipeline/spec/chart/pipes/axes/xBand.js +12 -1
  62. package/dist/esm/pipeline/spec/chart/pipes/axes/xBand.js.map +1 -1
  63. package/dist/esm/pipeline/spec/chart/pipes/axes/yBand.js +12 -1
  64. package/dist/esm/pipeline/spec/chart/pipes/axes/yBand.js.map +1 -1
  65. package/dist/esm/pipeline/spec/chart/pipes/crosshair/horizontalCrosshairLine.js +3 -0
  66. package/dist/esm/pipeline/spec/chart/pipes/crosshair/horizontalCrosshairLine.js.map +1 -1
  67. package/dist/esm/pipeline/spec/chart/pipes/crosshair/horizontalCrosshairRect.js +3 -0
  68. package/dist/esm/pipeline/spec/chart/pipes/crosshair/horizontalCrosshairRect.js.map +1 -1
  69. package/dist/esm/pipeline/spec/chart/pipes/crosshair/verticalCrosshairLine.js +3 -0
  70. package/dist/esm/pipeline/spec/chart/pipes/crosshair/verticalCrosshairLine.js.map +1 -1
  71. package/dist/esm/pipeline/spec/chart/pipes/crosshair/verticalCrosshairRect.js +3 -0
  72. package/dist/esm/pipeline/spec/chart/pipes/crosshair/verticalCrosshairRect.js.map +1 -1
  73. package/dist/esm/pipeline/spec/chart/pipes/pivotChart/dimensionLinkage.d.ts +2 -0
  74. package/dist/esm/pipeline/spec/chart/pipes/pivotChart/dimensionLinkage.js +49 -0
  75. package/dist/esm/pipeline/spec/chart/pipes/pivotChart/dimensionLinkage.js.map +1 -0
  76. package/dist/esm/pipeline/spec/chart/pipes/pivotChart/index.d.ts +1 -0
  77. package/dist/esm/pipeline/spec/chart/pipes/pivotChart/index.js +2 -1
  78. package/dist/esm/pipeline/spec/chart/pipes/pivotChart/pivotGridStyle.js +15 -0
  79. package/dist/esm/pipeline/spec/chart/pipes/pivotChart/pivotGridStyle.js.map +1 -1
  80. package/dist/esm/pipeline/spec/chart/pipes/pivotChart/pivotIndicators.js +1 -0
  81. package/dist/esm/pipeline/spec/chart/pipes/pivotChart/pivotIndicators.js.map +1 -1
  82. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/columnRegressionLine.js +13 -9
  83. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/columnRegressionLine.js.map +1 -1
  84. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/ecdfRegressionLine.js +8 -5
  85. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/ecdfRegressionLine.js.map +1 -1
  86. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/kdeRegressionLine.js +8 -5
  87. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/kdeRegressionLine.js.map +1 -1
  88. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/linearRegressionLine.js +61 -29
  89. package/dist/esm/pipeline/spec/chart/pipes/regressionLine/linearRegressionLine.js.map +1 -1
  90. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipBoxplot.js +8 -8
  91. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipBoxplot.js.map +1 -1
  92. package/dist/esm/types/advancedVSeed.d.ts +175 -0
  93. package/dist/esm/types/advancedVSeed.js +1 -0
  94. package/dist/esm/types/advancedVSeed.js.map +1 -1
  95. package/dist/esm/types/chartType/area/area.d.ts +6 -1
  96. package/dist/esm/types/chartType/area/zArea.d.ts +5 -0
  97. package/dist/esm/types/chartType/area/zArea.js +2 -1
  98. package/dist/esm/types/chartType/area/zArea.js.map +1 -1
  99. package/dist/esm/types/chartType/areaPercent/areaPercent.d.ts +6 -1
  100. package/dist/esm/types/chartType/areaPercent/zAreaPercent.d.ts +5 -0
  101. package/dist/esm/types/chartType/areaPercent/zAreaPercent.js +2 -1
  102. package/dist/esm/types/chartType/areaPercent/zAreaPercent.js.map +1 -1
  103. package/dist/esm/types/chartType/bar/bar.d.ts +6 -1
  104. package/dist/esm/types/chartType/bar/zBar.d.ts +5 -0
  105. package/dist/esm/types/chartType/bar/zBar.js +2 -1
  106. package/dist/esm/types/chartType/bar/zBar.js.map +1 -1
  107. package/dist/esm/types/chartType/barParallel/barParallel.d.ts +6 -1
  108. package/dist/esm/types/chartType/barParallel/zBarParallel.d.ts +5 -0
  109. package/dist/esm/types/chartType/barParallel/zBarParallel.js +2 -1
  110. package/dist/esm/types/chartType/barParallel/zBarParallel.js.map +1 -1
  111. package/dist/esm/types/chartType/barPercent/barPercent.d.ts +6 -1
  112. package/dist/esm/types/chartType/barPercent/zBarPercent.d.ts +5 -0
  113. package/dist/esm/types/chartType/barPercent/zBarPercent.js +2 -1
  114. package/dist/esm/types/chartType/barPercent/zBarPercent.js.map +1 -1
  115. package/dist/esm/types/chartType/boxplot/boxplot.d.ts +6 -1
  116. package/dist/esm/types/chartType/boxplot/zBoxplot.d.ts +5 -0
  117. package/dist/esm/types/chartType/boxplot/zBoxplot.js +2 -1
  118. package/dist/esm/types/chartType/boxplot/zBoxplot.js.map +1 -1
  119. package/dist/esm/types/chartType/column/column.d.ts +6 -1
  120. package/dist/esm/types/chartType/column/zColumn.d.ts +5 -0
  121. package/dist/esm/types/chartType/column/zColumn.js +2 -1
  122. package/dist/esm/types/chartType/column/zColumn.js.map +1 -1
  123. package/dist/esm/types/chartType/columnParallel/columnParallel.d.ts +6 -1
  124. package/dist/esm/types/chartType/columnParallel/zColumnParallel.d.ts +5 -0
  125. package/dist/esm/types/chartType/columnParallel/zColumnParallel.js +2 -1
  126. package/dist/esm/types/chartType/columnParallel/zColumnParallel.js.map +1 -1
  127. package/dist/esm/types/chartType/columnPercent/columnPercent.d.ts +6 -1
  128. package/dist/esm/types/chartType/columnPercent/zColumnPercent.d.ts +5 -0
  129. package/dist/esm/types/chartType/columnPercent/zColumnPercent.js +2 -1
  130. package/dist/esm/types/chartType/columnPercent/zColumnPercent.js.map +1 -1
  131. package/dist/esm/types/chartType/dualAxis/dualAxis.d.ts +6 -1
  132. package/dist/esm/types/chartType/dualAxis/zDualAxis.d.ts +5 -0
  133. package/dist/esm/types/chartType/dualAxis/zDualAxis.js +2 -1
  134. package/dist/esm/types/chartType/dualAxis/zDualAxis.js.map +1 -1
  135. package/dist/esm/types/chartType/histogram/histogram.d.ts +6 -1
  136. package/dist/esm/types/chartType/histogram/zHistogram.d.ts +5 -0
  137. package/dist/esm/types/chartType/histogram/zHistogram.js +2 -1
  138. package/dist/esm/types/chartType/histogram/zHistogram.js.map +1 -1
  139. package/dist/esm/types/chartType/line/line.d.ts +6 -1
  140. package/dist/esm/types/chartType/line/zLine.d.ts +5 -0
  141. package/dist/esm/types/chartType/line/zLine.js +2 -1
  142. package/dist/esm/types/chartType/line/zLine.js.map +1 -1
  143. package/dist/esm/types/chartType/scatter/scatter.d.ts +6 -1
  144. package/dist/esm/types/chartType/scatter/zScatter.d.ts +5 -0
  145. package/dist/esm/types/chartType/scatter/zScatter.js +2 -1
  146. package/dist/esm/types/chartType/scatter/zScatter.js.map +1 -1
  147. package/dist/esm/types/index.d.ts +1 -0
  148. package/dist/esm/types/index.js +1 -0
  149. package/dist/esm/types/properties/config/area.d.ts +10 -0
  150. package/dist/esm/types/properties/config/area.js +3 -1
  151. package/dist/esm/types/properties/config/area.js.map +1 -1
  152. package/dist/esm/types/properties/config/bar.d.ts +15 -0
  153. package/dist/esm/types/properties/config/bar.js +3 -1
  154. package/dist/esm/types/properties/config/bar.js.map +1 -1
  155. package/dist/esm/types/properties/config/boxplot.d.ts +5 -0
  156. package/dist/esm/types/properties/config/boxplot.js +3 -1
  157. package/dist/esm/types/properties/config/boxplot.js.map +1 -1
  158. package/dist/esm/types/properties/config/column.d.ts +15 -0
  159. package/dist/esm/types/properties/config/column.js +3 -1
  160. package/dist/esm/types/properties/config/column.js.map +1 -1
  161. package/dist/esm/types/properties/config/config.d.ts +65 -0
  162. package/dist/esm/types/properties/config/dimensionLinkage/dimensionLinkage.d.ts +23 -0
  163. package/dist/esm/types/properties/config/dimensionLinkage/dimensionLinkage.js +9 -0
  164. package/dist/esm/types/properties/config/dimensionLinkage/dimensionLinkage.js.map +1 -0
  165. package/dist/esm/types/properties/config/dimensionLinkage/index.d.ts +1 -0
  166. package/dist/esm/types/properties/config/dimensionLinkage/index.js +1 -0
  167. package/dist/esm/types/properties/config/dualAxis.d.ts +5 -0
  168. package/dist/esm/types/properties/config/dualAxis.js +3 -1
  169. package/dist/esm/types/properties/config/dualAxis.js.map +1 -1
  170. package/dist/esm/types/properties/config/histogram.d.ts +5 -0
  171. package/dist/esm/types/properties/config/histogram.js +3 -1
  172. package/dist/esm/types/properties/config/histogram.js.map +1 -1
  173. package/dist/esm/types/properties/config/index.d.ts +1 -0
  174. package/dist/esm/types/properties/config/index.js +1 -0
  175. package/dist/esm/types/properties/config/label/pieLabel.d.ts +2 -2
  176. package/dist/esm/types/properties/config/line.d.ts +5 -0
  177. package/dist/esm/types/properties/config/line.js +3 -1
  178. package/dist/esm/types/properties/config/line.js.map +1 -1
  179. package/dist/esm/types/properties/config/scatter.d.ts +5 -0
  180. package/dist/esm/types/properties/config/scatter.js +3 -1
  181. package/dist/esm/types/properties/config/scatter.js.map +1 -1
  182. package/dist/esm/types/properties/regressionLine/ecdfRegressionLine.d.ts +2 -2
  183. package/dist/esm/types/properties/regressionLine/kdeRegressionLine.d.ts +2 -2
  184. package/dist/esm/types/properties/regressionLine/linearRegressionLine.d.ts +2 -2
  185. package/dist/esm/types/properties/regressionLine/logisticRegressionLine.d.ts +2 -2
  186. package/dist/esm/types/properties/regressionLine/lowessRegressionLine.d.ts +2 -2
  187. package/dist/esm/types/properties/regressionLine/polynomialRegressionLine.d.ts +2 -2
  188. package/dist/esm/types/properties/theme/customTheme.d.ts +130 -0
  189. package/dist/esm/types/zVseed.d.ts +65 -0
  190. package/dist/umd/index.js +540 -205
  191. package/dist/umd/index.js.map +1 -1
  192. package/package.json +5 -5
@@ -12,16 +12,18 @@ const ecdfRegressionLine = (spec, context)=>{
12
12
  if (!regressionLine || !regressionLine.ecdfRegressionLine) return result;
13
13
  const rowColumnFields = uniqueBy(dimensions.filter((dim)=>'row' === dim.encoding || 'column' === dim.encoding), (item)=>item.id);
14
14
  const lineList = array(regressionLine.ecdfRegressionLine).filter((ecdfLine)=>false !== ecdfLine.enable);
15
- if (!result.customMark) result.customMark = [];
15
+ if (!result.extensionMark) result.extensionMark = [];
16
16
  lineList.forEach((line, lineIndex)=>{
17
+ if (false === line.enable) return;
17
18
  const theme = lineTheme?.ecdfRegressionLine ?? {};
18
19
  const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight } = line;
19
20
  const childrenMarks = [];
20
- result.customMark.push({
21
+ result.extensionMark.push({
21
22
  type: 'group',
22
23
  interactive: false,
23
24
  zIndex: 500,
24
25
  name: `ecdfRegressionLine-${lineIndex}`,
26
+ dataId: spec.data?.id,
25
27
  style: {
26
28
  data: (datum, ctx)=>{
27
29
  const vchart = ctx.vchart;
@@ -29,7 +31,6 @@ const ecdfRegressionLine = (spec, context)=>{
29
31
  const series = chart.getAllSeries().filter((s)=>'bar' === s.type);
30
32
  if (series && series.length) {
31
33
  const s = series[0];
32
- const region = s.getRegion().getLayoutStartPoint();
33
34
  const fieldX = s.fieldX?.[0];
34
35
  const scaleY = s.getYAxisHelper().getScale?.(0);
35
36
  const viewData = s.getViewData()?.latestData;
@@ -47,8 +48,8 @@ const ecdfRegressionLine = (spec, context)=>{
47
48
  [fieldX]: ld.x
48
49
  };
49
50
  return {
50
- x: s.dataToPositionX(d) + region.x,
51
- y: scaleR(ld.y) + region.y
51
+ x: s.dataToPositionX(d),
52
+ y: scaleR(ld.y)
52
53
  };
53
54
  });
54
55
  return {
@@ -65,6 +66,7 @@ const ecdfRegressionLine = (spec, context)=>{
65
66
  type: 'line',
66
67
  interactive: false,
67
68
  zIndex: 500,
69
+ dataId: spec.data?.id,
68
70
  style: {
69
71
  lineWidth: lineWidth ?? theme.lineWidth,
70
72
  lineDash: lineDash ?? theme.lineDash,
@@ -80,6 +82,7 @@ const ecdfRegressionLine = (spec, context)=>{
80
82
  type: 'text',
81
83
  interactive: false,
82
84
  zIndex: 500,
85
+ dataId: spec.data?.id,
83
86
  style: {
84
87
  textAlign: 'end',
85
88
  fill: textColor ?? theme.textColor,
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/regressionLine/ecdfRegressionLine.js","sources":["webpack://@visactor/vseed/./src/pipeline/spec/chart/pipes/regressionLine/ecdfRegressionLine.ts"],"sourcesContent":["import type { ICartesianSeries, IChart, IHistogramChartSpec, IVChart } from '@visactor/vchart'\nimport { isNullish, uniqueBy } from 'remeda'\nimport { ecdf, array, isArray } from '@visactor/vutils'\nimport type { Datum, Dimension, VChartSpecPipe, Encoding, RegressionLineConfig, EcdfRegressionLine } from 'src/types'\nimport { defaultRegressionLineColor, defaultRegressionLineLabelX, defaultRegressionLineLabelY } from './common'\n\nexport const ecdfRegressionLine: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as IHistogramChartSpec\n const { advancedVSeed, vseed } = context\n const { chartType, encoding = {} as Encoding, dimensions, regressionLine } = advancedVSeed\n const { dataset } = vseed\n const lineTheme = advancedVSeed.config[chartType as 'histogram']?.regressionLine as RegressionLineConfig\n\n if (!regressionLine || !regressionLine.ecdfRegressionLine) {\n return result\n }\n\n const rowColumnFields = uniqueBy(\n dimensions.filter((dim: Dimension) => dim.encoding === 'row' || dim.encoding === 'column'),\n (item: Dimension) => item.id,\n )\n\n const lineList = array(regressionLine.ecdfRegressionLine).filter((ecdfLine) => ecdfLine.enable !== false)\n\n if (!result.customMark) {\n result.customMark = []\n }\n\n lineList.forEach((line, lineIndex) => {\n const theme = (lineTheme?.ecdfRegressionLine ?? {}) as EcdfRegressionLine\n const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight } = line as EcdfRegressionLine\n\n const childrenMarks: any[] = []\n\n ;(result.customMark as any[]).push({\n type: 'group',\n interactive: false,\n zIndex: 500,\n name: `ecdfRegressionLine-${lineIndex}`,\n style: {\n data: (datum: any, ctx: any) => {\n const vchart = ctx.vchart as IVChart\n const chart = vchart.getChart() as IChart\n const series = chart.getAllSeries().filter((s: any) => s.type === 'bar')\n\n // 直方图使用的是bar系列\n if (series && series.length) {\n const s = series[0] as ICartesianSeries\n const region = s.getRegion().getLayoutStartPoint()\n\n const fieldX = s.fieldX?.[0]\n const scaleY = s.getYAxisHelper().getScale?.(0)\n const viewData = s.getViewData()?.latestData\n\n if (!dataset || !dataset.length || !viewData || !viewData.length || !scaleY) {\n return null\n }\n const simpleData = dataset\n .filter((entry: Datum) => {\n return rowColumnFields.length\n ? rowColumnFields.every((dim: Dimension) => {\n return entry[dim.id] === viewData[0][dim.id]\n })\n : true\n })\n .map((d: Datum) => +(d as any)[encoding.value?.[0] as string])\n const res = ecdf(simpleData)\n const N = Math.max(3, Math.floor(simpleData.length / 4))\n const lineData = res.evaluateGrid(N)\n const yRange = scaleY.range()\n const y0 = yRange[0]\n const y1 = yRange[yRange.length - 1]\n const scaleR = (e: number) => {\n return y0 + (y1 - y0) * e\n }\n\n const linePoints = lineData.map((ld: Datum) => {\n const d = { [fieldX]: ld.x }\n return {\n x: s.dataToPositionX(d)! + region.x,\n y: scaleR(ld.y as number) + region.y,\n }\n })\n\n return {\n linePoints,\n color: color ?? s.getOption().globalScale.getScale('color')?.scale(s.getSeriesKeys()[0]),\n }\n }\n return null\n },\n },\n children: childrenMarks,\n })\n\n childrenMarks.push({\n type: 'line',\n interactive: false,\n zIndex: 500,\n style: {\n lineWidth: lineWidth ?? theme.lineWidth,\n lineDash: lineDash ?? theme.lineDash,\n stroke: color ?? defaultRegressionLineColor,\n points: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return parentNode.attribute.data.linePoints\n }\n\n return []\n },\n },\n })\n\n if (!isNullish(text)) {\n childrenMarks.push({\n type: 'text',\n interactive: false,\n zIndex: 500,\n style: {\n textAlign: 'end',\n fill: textColor ?? theme.textColor,\n fontSize: textFontSize ?? theme.textFontSize,\n fontWeight: textFontWeight ?? theme.textFontWeight,\n text: text,\n x: defaultRegressionLineLabelX,\n y: defaultRegressionLineLabelY,\n },\n })\n }\n })\n\n // add percent axis of ecdf\n const leftAxis = result.axes?.find((v) => v.orient === 'left')\n if (leftAxis && lineList.length) {\n result.axes?.push({\n visible: true,\n orient: 'right',\n type: 'linear',\n base: 10,\n min: 0,\n max: 1,\n domainLine: {\n ...leftAxis.domainLine,\n },\n grid: {\n visible: false,\n },\n tick: {\n ...leftAxis.tick,\n },\n title: {\n ...leftAxis.title,\n visible: false,\n },\n label: {\n ...leftAxis.label,\n visible: true,\n formatMethod: (v) => {\n const text = isArray(v) ? v[0] : v\n return `${(+text * 100).toFixed(1)}%`\n },\n },\n })\n }\n\n return result\n}\n"],"names":["ecdfRegressionLine","spec","context","result","advancedVSeed","vseed","chartType","encoding","dimensions","regressionLine","dataset","lineTheme","rowColumnFields","uniqueBy","dim","item","lineList","array","ecdfLine","line","lineIndex","theme","color","lineWidth","lineDash","text","textColor","textFontSize","textFontWeight","childrenMarks","datum","ctx","vchart","chart","series","s","region","fieldX","scaleY","viewData","simpleData","entry","d","res","ecdf","N","Math","lineData","yRange","y0","y1","scaleR","e","linePoints","ld","defaultRegressionLineColor","opt","parentNode","isNullish","defaultRegressionLineLabelX","defaultRegressionLineLabelY","leftAxis","v","isArray"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/regressionLine/ecdfRegressionLine.js","sources":["webpack://@visactor/vseed/./src/pipeline/spec/chart/pipes/regressionLine/ecdfRegressionLine.ts"],"sourcesContent":["import type { ICartesianSeries, IChart, IHistogramChartSpec, IVChart } from '@visactor/vchart'\nimport { isNullish, uniqueBy } from 'remeda'\nimport { ecdf, array, isArray } from '@visactor/vutils'\nimport type { Datum, Dimension, VChartSpecPipe, Encoding, RegressionLineConfig, EcdfRegressionLine } from 'src/types'\nimport { defaultRegressionLineColor, defaultRegressionLineLabelX, defaultRegressionLineLabelY } from './common'\n\nexport const ecdfRegressionLine: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as IHistogramChartSpec\n const { advancedVSeed, vseed } = context\n const { chartType, encoding = {} as Encoding, dimensions, regressionLine } = advancedVSeed\n const { dataset } = vseed\n const lineTheme = advancedVSeed.config[chartType as 'histogram']?.regressionLine as RegressionLineConfig\n\n if (!regressionLine || !regressionLine.ecdfRegressionLine) {\n return result\n }\n\n const rowColumnFields = uniqueBy(\n dimensions.filter((dim: Dimension) => dim.encoding === 'row' || dim.encoding === 'column'),\n (item: Dimension) => item.id,\n )\n\n const lineList = array(regressionLine.ecdfRegressionLine).filter((ecdfLine) => ecdfLine.enable !== false)\n\n if (!result.extensionMark) {\n result.extensionMark = []\n }\n\n lineList.forEach((line, lineIndex) => {\n if (line.enable === false) {\n return\n }\n const theme = (lineTheme?.ecdfRegressionLine ?? {}) as EcdfRegressionLine\n const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight } = line as EcdfRegressionLine\n\n const childrenMarks: any[] = []\n\n ;(result.extensionMark as any[]).push({\n type: 'group',\n interactive: false,\n zIndex: 500,\n name: `ecdfRegressionLine-${lineIndex}`,\n dataId: (spec.data as any)?.id,\n style: {\n data: (datum: any, ctx: any) => {\n const vchart = ctx.vchart as IVChart\n const chart = vchart.getChart() as IChart\n const series = chart.getAllSeries().filter((s: any) => s.type === 'bar')\n\n // 直方图使用的是bar系列\n if (series && series.length) {\n const s = series[0] as ICartesianSeries\n\n const fieldX = s.fieldX?.[0]\n const scaleY = s.getYAxisHelper().getScale?.(0)\n const viewData = s.getViewData()?.latestData\n\n if (!dataset || !dataset.length || !viewData || !viewData.length || !scaleY) {\n return null\n }\n const simpleData = dataset\n .filter((entry: Datum) => {\n return rowColumnFields.length\n ? rowColumnFields.every((dim: Dimension) => {\n return entry[dim.id] === viewData[0][dim.id]\n })\n : true\n })\n .map((d: Datum) => +(d as any)[encoding.value?.[0] as string])\n const res = ecdf(simpleData)\n const N = Math.max(3, Math.floor(simpleData.length / 4))\n const lineData = res.evaluateGrid(N)\n const yRange = scaleY.range()\n const y0 = yRange[0]\n const y1 = yRange[yRange.length - 1]\n const scaleR = (e: number) => {\n return y0 + (y1 - y0) * e\n }\n\n const linePoints = lineData.map((ld: Datum) => {\n const d = { [fieldX]: ld.x }\n return {\n x: s.dataToPositionX(d)!,\n y: scaleR(ld.y as number),\n }\n })\n\n return {\n linePoints,\n color: color ?? s.getOption().globalScale.getScale('color')?.scale(s.getSeriesKeys()[0]),\n }\n }\n return null\n },\n },\n children: childrenMarks,\n })\n\n childrenMarks.push({\n type: 'line',\n interactive: false,\n zIndex: 500,\n dataId: (spec.data as any)?.id,\n style: {\n lineWidth: lineWidth ?? theme.lineWidth,\n lineDash: lineDash ?? theme.lineDash,\n stroke: color ?? defaultRegressionLineColor,\n points: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return parentNode.attribute.data.linePoints\n }\n\n return []\n },\n },\n })\n\n if (!isNullish(text)) {\n childrenMarks.push({\n type: 'text',\n interactive: false,\n zIndex: 500,\n dataId: (spec.data as any)?.id,\n style: {\n textAlign: 'end',\n fill: textColor ?? theme.textColor,\n fontSize: textFontSize ?? theme.textFontSize,\n fontWeight: textFontWeight ?? theme.textFontWeight,\n text: text,\n x: defaultRegressionLineLabelX,\n y: defaultRegressionLineLabelY,\n },\n })\n }\n })\n\n // add percent axis of ecdf\n const leftAxis = result.axes?.find((v) => v.orient === 'left')\n if (leftAxis && lineList.length) {\n result.axes?.push({\n visible: true,\n orient: 'right',\n type: 'linear',\n base: 10,\n min: 0,\n max: 1,\n domainLine: {\n ...leftAxis.domainLine,\n },\n grid: {\n visible: false,\n },\n tick: {\n ...leftAxis.tick,\n },\n title: {\n ...leftAxis.title,\n visible: false,\n },\n label: {\n ...leftAxis.label,\n visible: true,\n formatMethod: (v) => {\n const text = isArray(v) ? v[0] : v\n return `${(+text * 100).toFixed(1)}%`\n },\n },\n })\n }\n\n return result\n}\n"],"names":["ecdfRegressionLine","spec","context","result","advancedVSeed","vseed","chartType","encoding","dimensions","regressionLine","dataset","lineTheme","rowColumnFields","uniqueBy","dim","item","lineList","array","ecdfLine","line","lineIndex","theme","color","lineWidth","lineDash","text","textColor","textFontSize","textFontWeight","childrenMarks","datum","ctx","vchart","chart","series","s","fieldX","scaleY","viewData","simpleData","entry","d","res","ecdf","N","Math","lineData","yRange","y0","y1","scaleR","e","linePoints","ld","defaultRegressionLineColor","opt","parentNode","isNullish","defaultRegressionLineLabelX","defaultRegressionLineLabelY","leftAxis","v","isArray"],"mappings":"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"}
@@ -13,16 +13,18 @@ const kdeRegressionLine = (spec, context)=>{
13
13
  if (!regressionLine || !regressionLine.kdeRegressionLine) return result;
14
14
  const rowColumnFields = uniqueBy(dimensions.filter((dim)=>'row' === dim.encoding || 'column' === dim.encoding), (item)=>item.id);
15
15
  const lineList = array(regressionLine.kdeRegressionLine).filter((kdeLine)=>false !== kdeLine.enable);
16
- if (!result.customMark) result.customMark = [];
16
+ if (!result.extensionMark) result.extensionMark = [];
17
17
  lineList.forEach((line, lineIndex)=>{
18
+ if (false === line.enable) return;
18
19
  const theme = lineTheme.kdeRegressionLine ?? {};
19
20
  const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight } = line;
20
21
  const childrenMarks = [];
21
- result.customMark.push({
22
+ result.extensionMark.push({
22
23
  type: 'group',
23
24
  interactive: false,
24
25
  zIndex: 500,
25
26
  name: `kdeRegressionLine-${lineIndex}`,
27
+ dataId: spec.data?.id,
26
28
  style: {
27
29
  data: (datum, ctx)=>{
28
30
  const vchart = ctx.vchart;
@@ -30,7 +32,6 @@ const kdeRegressionLine = (spec, context)=>{
30
32
  const series = chart.getAllSeries().filter((s)=>'bar' === s.type);
31
33
  if (series && series.length) {
32
34
  const s = series[0];
33
- const region = s.getRegion().getLayoutStartPoint();
34
35
  const fieldX = s.fieldX?.[0];
35
36
  const scaleY = s.getYAxisHelper().getScale?.(0);
36
37
  const viewData = s.getViewData()?.latestData;
@@ -47,8 +48,8 @@ const kdeRegressionLine = (spec, context)=>{
47
48
  [fieldX]: ld.x
48
49
  };
49
50
  return {
50
- x: s.dataToPositionX(d) + region.x,
51
- y: scaleR(ld.y) + region.y
51
+ x: s.dataToPositionX(d),
52
+ y: scaleR(ld.y)
52
53
  };
53
54
  });
54
55
  return {
@@ -65,6 +66,7 @@ const kdeRegressionLine = (spec, context)=>{
65
66
  type: 'line',
66
67
  interactive: false,
67
68
  zIndex: 500,
69
+ dataId: spec.data?.id,
68
70
  style: {
69
71
  lineWidth: lineWidth ?? theme.lineWidth,
70
72
  lineDash: lineDash ?? theme.lineDash,
@@ -80,6 +82,7 @@ const kdeRegressionLine = (spec, context)=>{
80
82
  type: 'text',
81
83
  interactive: false,
82
84
  zIndex: 500,
85
+ dataId: spec.data?.id,
83
86
  style: {
84
87
  textAlign: 'end',
85
88
  fill: textColor ?? theme.textColor,
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/regressionLine/kdeRegressionLine.js","sources":["webpack://@visactor/vseed/./src/pipeline/spec/chart/pipes/regressionLine/kdeRegressionLine.ts"],"sourcesContent":["import type { ICartesianSeries, IChart, IHistogramChartSpec, IVChart } from '@visactor/vchart'\nimport type { KDEOptions } from '@visactor/vutils'\nimport { isNullish, uniqueBy } from 'remeda'\nimport { kde, array } from '@visactor/vutils'\nimport { BinEndMeasureId, BinStartMeasureId } from 'src/dataReshape'\nimport type { Datum, Dimension, VChartSpecPipe, Encoding, RegressionLineConfig, KdeRegressionLine } from 'src/types'\nimport { defaultRegressionLineColor, defaultRegressionLineLabelX, defaultRegressionLineLabelY } from './common'\n\nexport const kdeRegressionLine: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as IHistogramChartSpec\n const { advancedVSeed, vseed } = context\n const { chartType, encoding = {} as Encoding, dimensions, regressionLine } = advancedVSeed\n const { dataset } = vseed\n const lineTheme = advancedVSeed.config[chartType as 'histogram']?.regressionLine as RegressionLineConfig\n\n if (!regressionLine || !regressionLine.kdeRegressionLine) {\n return result\n }\n\n const rowColumnFields = uniqueBy(\n dimensions.filter((dim: Dimension) => dim.encoding === 'row' || dim.encoding === 'column'),\n (item: Dimension) => item.id,\n )\n\n const lineList = array(regressionLine.kdeRegressionLine).filter((kdeLine) => kdeLine.enable !== false)\n\n if (!result.customMark) {\n result.customMark = []\n }\n\n lineList.forEach((line, lineIndex) => {\n const theme = (lineTheme.kdeRegressionLine ?? {}) as KdeRegressionLine\n const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight } = line as KdeRegressionLine\n\n const childrenMarks: any[] = []\n\n ;(result.customMark as any[]).push({\n type: 'group',\n interactive: false,\n zIndex: 500,\n name: `kdeRegressionLine-${lineIndex}`,\n style: {\n data: (datum: any, ctx: any) => {\n const vchart = ctx.vchart as IVChart\n const chart = vchart.getChart() as IChart\n const series = chart.getAllSeries().filter((s: any) => s.type === 'bar')\n\n // 直方图使用的是bar系列\n if (series && series.length) {\n const s = series[0] as ICartesianSeries\n const region = s.getRegion().getLayoutStartPoint()\n\n const fieldX = s.fieldX?.[0]\n const scaleY = s.getYAxisHelper().getScale?.(0)\n const viewData = s.getViewData()?.latestData\n\n if (!dataset || !dataset.length || !viewData || !viewData.length || !scaleY) {\n return null\n }\n const simpleData = dataset\n .filter((entry: Datum) => {\n return rowColumnFields.length\n ? rowColumnFields.every((dim: Dimension) => {\n return entry[dim.id] === viewData[0][dim.id]\n })\n : true\n })\n .map((d: Datum) => +(d as any)[encoding.value?.[0] as string])\n const res = kde(simpleData, {\n bandwidth: Math.abs(viewData[0][BinEndMeasureId] - viewData[0][BinStartMeasureId]),\n } as KDEOptions)\n const N = Math.max(3, Math.floor(simpleData.length / 4))\n const lineData = res.evaluateGrid(N)\n const scaleR = (k: number) => {\n return scaleY.scale(k * simpleData.length * res.bandwidth)\n }\n\n const linePoints = lineData.map((ld: Datum) => {\n const d = { [fieldX]: ld.x }\n return {\n x: s.dataToPositionX(d)! + region.x,\n y: scaleR(ld.y as number) + region.y,\n }\n })\n\n return {\n linePoints,\n color: color ?? s.getOption().globalScale.getScale('color')?.scale(s.getSeriesKeys()[0]),\n }\n }\n return null\n },\n },\n children: childrenMarks,\n })\n\n childrenMarks.push({\n type: 'line',\n interactive: false,\n zIndex: 500,\n style: {\n lineWidth: lineWidth ?? theme.lineWidth,\n lineDash: lineDash ?? theme.lineDash,\n stroke: color ?? defaultRegressionLineColor,\n points: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return parentNode.attribute.data.linePoints\n }\n\n return []\n },\n },\n })\n\n if (!isNullish(text)) {\n childrenMarks.push({\n type: 'text',\n interactive: false,\n zIndex: 500,\n style: {\n textAlign: 'end',\n fill: textColor ?? theme.textColor,\n fontSize: textFontSize ?? theme.textFontSize,\n fontWeight: textFontWeight ?? theme.textFontWeight,\n text: text,\n x: defaultRegressionLineLabelX,\n y: defaultRegressionLineLabelY,\n },\n })\n }\n })\n\n return result\n}\n"],"names":["kdeRegressionLine","spec","context","result","advancedVSeed","vseed","chartType","encoding","dimensions","regressionLine","dataset","lineTheme","rowColumnFields","uniqueBy","dim","item","lineList","array","kdeLine","line","lineIndex","theme","color","lineWidth","lineDash","text","textColor","textFontSize","textFontWeight","childrenMarks","datum","ctx","vchart","chart","series","s","region","fieldX","scaleY","viewData","simpleData","entry","d","res","kde","Math","BinEndMeasureId","BinStartMeasureId","N","lineData","scaleR","k","linePoints","ld","defaultRegressionLineColor","opt","parentNode","isNullish","defaultRegressionLineLabelX","defaultRegressionLineLabelY"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/regressionLine/kdeRegressionLine.js","sources":["webpack://@visactor/vseed/./src/pipeline/spec/chart/pipes/regressionLine/kdeRegressionLine.ts"],"sourcesContent":["import type { ICartesianSeries, IChart, IHistogramChartSpec, IVChart } from '@visactor/vchart'\nimport type { KDEOptions } from '@visactor/vutils'\nimport { isNullish, uniqueBy } from 'remeda'\nimport { kde, array } from '@visactor/vutils'\nimport { BinEndMeasureId, BinStartMeasureId } from 'src/dataReshape'\nimport type { Datum, Dimension, VChartSpecPipe, Encoding, RegressionLineConfig, KdeRegressionLine } from 'src/types'\nimport { defaultRegressionLineColor, defaultRegressionLineLabelX, defaultRegressionLineLabelY } from './common'\n\nexport const kdeRegressionLine: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as IHistogramChartSpec\n const { advancedVSeed, vseed } = context\n const { chartType, encoding = {} as Encoding, dimensions, regressionLine } = advancedVSeed\n const { dataset } = vseed\n const lineTheme = advancedVSeed.config[chartType as 'histogram']?.regressionLine as RegressionLineConfig\n\n if (!regressionLine || !regressionLine.kdeRegressionLine) {\n return result\n }\n\n const rowColumnFields = uniqueBy(\n dimensions.filter((dim: Dimension) => dim.encoding === 'row' || dim.encoding === 'column'),\n (item: Dimension) => item.id,\n )\n\n const lineList = array(regressionLine.kdeRegressionLine).filter((kdeLine) => kdeLine.enable !== false)\n\n if (!result.extensionMark) {\n result.extensionMark = []\n }\n\n lineList.forEach((line, lineIndex) => {\n if (line.enable === false) {\n return\n }\n const theme = (lineTheme.kdeRegressionLine ?? {}) as KdeRegressionLine\n const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight } = line as KdeRegressionLine\n\n const childrenMarks: any[] = []\n\n ;(result.extensionMark as any[]).push({\n type: 'group',\n interactive: false,\n zIndex: 500,\n name: `kdeRegressionLine-${lineIndex}`,\n dataId: (spec.data as any)?.id,\n style: {\n data: (datum: any, ctx: any) => {\n const vchart = ctx.vchart as IVChart\n const chart = vchart.getChart() as IChart\n const series = chart.getAllSeries().filter((s: any) => s.type === 'bar')\n\n // 直方图使用的是bar系列\n if (series && series.length) {\n const s = series[0] as ICartesianSeries\n\n const fieldX = s.fieldX?.[0]\n const scaleY = s.getYAxisHelper().getScale?.(0)\n const viewData = s.getViewData()?.latestData\n\n if (!dataset || !dataset.length || !viewData || !viewData.length || !scaleY) {\n return null\n }\n const simpleData = dataset\n .filter((entry: Datum) => {\n return rowColumnFields.length\n ? rowColumnFields.every((dim: Dimension) => {\n return entry[dim.id] === viewData[0][dim.id]\n })\n : true\n })\n .map((d: Datum) => +(d as any)[encoding.value?.[0] as string])\n const res = kde(simpleData, {\n bandwidth: Math.abs(viewData[0][BinEndMeasureId] - viewData[0][BinStartMeasureId]),\n } as KDEOptions)\n const N = Math.max(3, Math.floor(simpleData.length / 4))\n const lineData = res.evaluateGrid(N)\n const scaleR = (k: number) => {\n return scaleY.scale(k * simpleData.length * res.bandwidth)\n }\n\n const linePoints = lineData.map((ld: Datum) => {\n const d = { [fieldX]: ld.x }\n return {\n x: s.dataToPositionX(d)!,\n y: scaleR(ld.y as number),\n }\n })\n\n return {\n linePoints,\n color: color ?? s.getOption().globalScale.getScale('color')?.scale(s.getSeriesKeys()[0]),\n }\n }\n return null\n },\n },\n children: childrenMarks,\n })\n\n childrenMarks.push({\n type: 'line',\n interactive: false,\n zIndex: 500,\n dataId: (spec.data as any)?.id,\n style: {\n lineWidth: lineWidth ?? theme.lineWidth,\n lineDash: lineDash ?? theme.lineDash,\n stroke: color ?? defaultRegressionLineColor,\n points: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return parentNode.attribute.data.linePoints\n }\n\n return []\n },\n },\n })\n\n if (!isNullish(text)) {\n childrenMarks.push({\n type: 'text',\n interactive: false,\n zIndex: 500,\n dataId: (spec.data as any)?.id,\n style: {\n textAlign: 'end',\n fill: textColor ?? theme.textColor,\n fontSize: textFontSize ?? theme.textFontSize,\n fontWeight: textFontWeight ?? theme.textFontWeight,\n text: text,\n x: defaultRegressionLineLabelX,\n y: defaultRegressionLineLabelY,\n },\n })\n }\n })\n\n return result\n}\n"],"names":["kdeRegressionLine","spec","context","result","advancedVSeed","vseed","chartType","encoding","dimensions","regressionLine","dataset","lineTheme","rowColumnFields","uniqueBy","dim","item","lineList","array","kdeLine","line","lineIndex","theme","color","lineWidth","lineDash","text","textColor","textFontSize","textFontWeight","childrenMarks","datum","ctx","vchart","chart","series","s","fieldX","scaleY","viewData","simpleData","entry","d","res","kde","Math","BinEndMeasureId","BinStartMeasureId","N","lineData","scaleR","k","linePoints","ld","defaultRegressionLineColor","opt","parentNode","isNullish","defaultRegressionLineLabelX","defaultRegressionLineLabelY"],"mappings":"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"}
@@ -9,16 +9,20 @@ const generateRegressionLinePipe = (type, regressionFunction, getOptions = getDe
9
9
  const lineTheme = advancedVSeed.config[chartType]?.regressionLine;
10
10
  if (!regressionLine || !regressionLine[type]) return result;
11
11
  const lineList = array(regressionLine[type]);
12
- if (!result.customMark) result.customMark = [];
12
+ if (!result.extensionMark) result.extensionMark = [];
13
13
  lineList.forEach((line, lineIndex)=>{
14
+ if (false === line.enable) return;
14
15
  const theme = lineTheme.linearRegressionLine ?? {};
15
16
  const { color, lineWidth, lineDash, text, textColor, textFontSize, textFontWeight, confidenceIntervalOpacity, confidenceIntervalVisible = theme.confidenceIntervalVisible } = line;
16
17
  const childrenMarks = [];
17
- result.customMark.push({
18
+ result.extensionMark.push({
18
19
  type: 'group',
19
20
  interactive: false,
20
21
  zIndex: 500,
21
22
  name: `${type}-${lineIndex}`,
23
+ layoutType: 'region-relative',
24
+ dataId: spec.data?.id,
25
+ animation: false,
22
26
  style: {
23
27
  data: (datum, ctx)=>{
24
28
  const vchart = ctx.vchart;
@@ -28,8 +32,7 @@ const generateRegressionLinePipe = (type, regressionFunction, getOptions = getDe
28
32
  const rect = s.getRegion().getLayoutRect();
29
33
  const segments = [];
30
34
  if (0 === rect.width || 0 === rect.height) return segments;
31
- const start = s.getRegion().getLayoutStartPoint();
32
- const yClamper = clamper(start.y, start.y + rect.height);
35
+ const yClamper = clamper(0, rect.height);
33
36
  const colorAttrOptions = s.getColorAttribute();
34
37
  const groups = s.getSeriesKeys();
35
38
  const data = s.getViewData()?.latestData;
@@ -38,42 +41,59 @@ const generateRegressionLinePipe = (type, regressionFunction, getOptions = getDe
38
41
  if (!groups.length) groups.push(void 0);
39
42
  groups.forEach((group)=>{
40
43
  const groupData = data.filter((d)=>d[colorAttrOptions?.field] === group);
41
- if (!groupData.length) return;
44
+ if (groupData.length <= 2) return;
42
45
  const { confidenceInterval, evaluateGrid } = regressionFunction(groupData, (datum)=>datum?.[fieldX], (datum)=>datum?.[fieldY], getOptions?.(line));
43
46
  const N = Math.max(3, Math.floor(groupData.length / 4));
44
47
  const mainColor = color ?? colorAttrOptions?.scale?.scale(group);
45
48
  const lineData = evaluateGrid(N);
46
- const linePoints = lineData.map((ld)=>{
49
+ const linePoints = [];
50
+ lineData.forEach((ld, index)=>{
47
51
  const d = {
48
52
  [fieldX]: ld.x,
49
53
  [fieldY]: ld.y
50
54
  };
51
- return {
52
- x: s.dataToPositionX(d) + start.x,
53
- y: yClamper(s.dataToPositionY(d) + start.y)
54
- };
55
+ const x = s.dataToPositionX(d);
56
+ const y = yClamper(s.dataToPositionY(d));
57
+ if (segments.length && 0 === index) segments[segments.length - 1].linePoints.push({
58
+ x,
59
+ y: NaN
60
+ });
61
+ linePoints.push({
62
+ x,
63
+ y
64
+ });
55
65
  });
56
- segments.push({
66
+ const segment = {
57
67
  color: mainColor,
58
68
  linePoints
59
- });
69
+ };
60
70
  if (confidenceIntervalVisible) {
61
71
  const intervalData = confidenceInterval(N);
62
- const areaPoints = intervalData.map((datum)=>{
72
+ const areaPoints = [];
73
+ intervalData.map((datum, index)=>{
63
74
  const d = {
64
75
  [fieldX]: datum.x,
65
76
  [fieldY]: datum.lower
66
77
  };
67
- return {
68
- x: s.dataToPositionX(d) + start.x,
69
- y: yClamper(s.dataToPositionY(d) + start.y),
70
- y1: yClamper(s.dataToPositionY({
71
- [fieldY]: datum.upper
72
- }) + start.y)
73
- };
78
+ const x = s.dataToPositionX(d);
79
+ const y = yClamper(s.dataToPositionY(d));
80
+ const y1 = yClamper(s.dataToPositionY({
81
+ [fieldY]: datum.upper
82
+ }));
83
+ if (segments.length && 0 === index) segments[segments.length - 1].areaPoints.push({
84
+ x,
85
+ y: NaN,
86
+ y1: NaN
87
+ });
88
+ areaPoints.push({
89
+ x,
90
+ y,
91
+ y1
92
+ });
74
93
  });
75
- segments[segments.length - 1].areaPoints = areaPoints;
94
+ segment.areaPoints = areaPoints;
76
95
  }
96
+ segments.push(segment);
77
97
  });
78
98
  return segments;
79
99
  }
@@ -86,17 +106,22 @@ const generateRegressionLinePipe = (type, regressionFunction, getOptions = getDe
86
106
  type: 'area',
87
107
  interactive: false,
88
108
  zIndex: 500,
109
+ dataId: spec.data?.id,
89
110
  style: {
111
+ stroke: false,
90
112
  lineWidth: lineWidth ?? theme.lineWidth,
91
113
  lineDash: lineDash ?? theme.lineDash,
92
114
  fillOpacity: confidenceIntervalOpacity ?? theme.confidenceIntervalOpacity,
93
115
  fill: 'red',
94
116
  segments: (datum, ctx, opt)=>{
95
117
  const parentNode = opt.mark?._product?.parent;
96
- if (parentNode?.attribute?.data?.length) return parentNode.attribute.data.map((d)=>({
97
- points: d.areaPoints ?? [],
98
- fill: d.color
99
- }));
118
+ if (parentNode) {
119
+ const data = parentNode.finalAttribute?.data ?? parentNode.attribute?.data;
120
+ if (data?.length) return data.map((d)=>({
121
+ points: d.areaPoints ?? [],
122
+ fill: d.color
123
+ }));
124
+ }
100
125
  return [];
101
126
  }
102
127
  }
@@ -105,16 +130,21 @@ const generateRegressionLinePipe = (type, regressionFunction, getOptions = getDe
105
130
  type: 'line',
106
131
  interactive: false,
107
132
  zIndex: 500,
133
+ animation: false,
134
+ dataId: spec.data?.id,
108
135
  style: {
109
136
  lineWidth: lineWidth ?? theme.lineWidth,
110
137
  lineDash: lineDash ?? theme.lineDash,
111
138
  stroke: 'red',
112
139
  segments: (datum, ctx, opt)=>{
113
140
  const parentNode = opt.mark?._product?.parent;
114
- if (parentNode?.attribute?.data?.length) return parentNode.attribute.data.map((d)=>({
115
- points: d.linePoints,
116
- stroke: d.color
117
- }));
141
+ if (parentNode) {
142
+ const data = parentNode.finalAttribute?.data ?? parentNode.attribute?.data;
143
+ if (data?.length) return data.map((d)=>({
144
+ points: d.linePoints,
145
+ stroke: d.color
146
+ }));
147
+ }
118
148
  return [];
119
149
  }
120
150
  }
@@ -123,6 +153,8 @@ const generateRegressionLinePipe = (type, regressionFunction, getOptions = getDe
123
153
  type: 'text',
124
154
  interactive: false,
125
155
  zIndex: 500,
156
+ animation: false,
157
+ dataId: spec.data?.id,
126
158
  style: {
127
159
  textAlign: 'end',
128
160
  fill: textColor ?? theme.textColor,
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/regressionLine/linearRegressionLine.js","sources":["webpack://@visactor/vseed/./src/pipeline/spec/chart/pipes/regressionLine/linearRegressionLine.ts"],"sourcesContent":["import type { ICartesianSeries, IChart, IScatterChartSpec, IVChart } from '@visactor/vchart'\nimport { isNullish } from 'remeda'\nimport {\n array,\n clamper,\n regressionLinear,\n regressionLowess,\n regressionPolynomial,\n regressionLogistic,\n} from '@visactor/vutils'\nimport type {\n Datum,\n VChartSpecPipe,\n RegressionLineConfig,\n LinearRegressionLine,\n PolynomialRegressionLine,\n SpecPipelineContext,\n LogisticRegressionLine,\n LowessRegressionLine,\n} from 'src/types'\n\nexport const generateRegressionLinePipe = (\n type: 'linearRegressionLine' | 'lowessRegressionLine' | 'polynomialRegressionLine' | 'logisticRegressionLine',\n regressionFunction: (\n arr: Datum[],\n xAccessor: (d: Datum) => number,\n yAccessor: (d: Datum) => number,\n options?: any,\n ) => {\n confidenceInterval: (N: number) => { lower: number; upper: number; x: number }[]\n evaluateGrid: (N: number) => { x: number; y: number }[]\n },\n getOptions: (lineConfig: any) => any = getDefaultRegressionOptions,\n): VChartSpecPipe => {\n return ((spec: Partial<IScatterChartSpec>, context: SpecPipelineContext): Partial<IScatterChartSpec> => {\n const result = { ...spec }\n const { advancedVSeed } = context\n const { chartType, regressionLine } = advancedVSeed\n const lineTheme = advancedVSeed.config[chartType as 'scatter']?.regressionLine as RegressionLineConfig\n\n if (!regressionLine || !regressionLine[type]) {\n return result\n }\n\n const lineList = array(regressionLine[type])\n\n if (!result.customMark) {\n result.customMark = []\n }\n\n lineList.forEach((line, lineIndex) => {\n const theme = (lineTheme.linearRegressionLine ?? {}) as LinearRegressionLine\n const {\n color,\n lineWidth,\n lineDash,\n text,\n textColor,\n textFontSize,\n textFontWeight,\n confidenceIntervalOpacity,\n confidenceIntervalVisible = theme.confidenceIntervalVisible,\n } = line as LinearRegressionLine\n\n const childrenMarks: any[] = []\n\n ;(result.customMark as any[]).push({\n type: 'group',\n interactive: false,\n zIndex: 500,\n name: `${type}-${lineIndex}`,\n style: {\n data: (datum: any, ctx: any) => {\n const vchart = ctx.vchart as IVChart\n const chart = vchart.getChart() as IChart\n const s = chart.getAllSeries()[0] as ICartesianSeries\n\n if (s) {\n const rect = s.getRegion().getLayoutRect()\n const segments: {\n areaPoints?: { x: number; y: number; y1: number }[]\n linePoints: { x: number; y: number }[]\n color: string\n }[] = []\n\n if (rect.width === 0 || rect.height === 0) {\n return segments\n }\n\n const start = s.getRegion().getLayoutStartPoint()\n const yClamper = clamper(start.y, start.y + rect.height)\n const colorAttrOptions = s.getColorAttribute()\n const groups: (string | undefined)[] = s.getSeriesKeys()\n const data = s.getViewData()?.latestData as Datum[]\n const fieldX = s.fieldX?.[0]\n const fieldY = s.fieldY?.[0]\n\n if (!groups.length) {\n groups.push(undefined)\n }\n\n groups.forEach((group) => {\n const groupData = data.filter((d: Datum) => d[colorAttrOptions?.field] === group)\n\n if (!groupData.length) {\n return\n }\n const { confidenceInterval, evaluateGrid } = regressionFunction(\n groupData,\n (datum: Datum) => datum?.[fieldX],\n (datum: Datum) => datum?.[fieldY],\n getOptions?.(line),\n )\n const N = Math.max(3, Math.floor(groupData.length / 4))\n const mainColor = color ?? colorAttrOptions?.scale?.scale(group)\n\n const lineData = evaluateGrid(N)\n const linePoints = lineData.map((ld: Datum) => {\n const d = { [fieldX]: ld.x, [fieldY]: ld.y }\n return {\n x: s.dataToPositionX(d)! + start.x,\n y: yClamper(s.dataToPositionY(d)! + start.y),\n }\n })\n\n segments.push({\n color: mainColor,\n linePoints,\n })\n\n if (confidenceIntervalVisible) {\n const intervalData = confidenceInterval(N)\n const areaPoints = intervalData.map((datum: Datum) => {\n const d = { [fieldX]: datum.x, [fieldY]: datum.lower }\n return {\n x: s.dataToPositionX(d)! + start.x,\n y: yClamper(s.dataToPositionY(d)! + start.y),\n y1: yClamper(s.dataToPositionY({ [fieldY]: datum.upper })! + start.y),\n }\n })\n\n segments[segments.length - 1].areaPoints = areaPoints\n }\n })\n\n return segments\n }\n return []\n },\n },\n children: childrenMarks,\n })\n\n if (confidenceIntervalVisible) {\n childrenMarks.push({\n type: 'area',\n interactive: false,\n zIndex: 500,\n style: {\n lineWidth: lineWidth ?? theme.lineWidth,\n lineDash: lineDash ?? theme.lineDash,\n fillOpacity: confidenceIntervalOpacity ?? theme.confidenceIntervalOpacity,\n fill: 'red', // vrender bug,必须要设置一个全局的fill,才会绘制\n segments: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data?.length) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call\n return parentNode.attribute.data.map((d: any) => {\n return {\n points: d.areaPoints ?? [],\n fill: d.color,\n }\n })\n }\n\n return []\n },\n },\n })\n }\n\n childrenMarks.push({\n type: 'line',\n interactive: false,\n zIndex: 500,\n style: {\n lineWidth: lineWidth ?? theme.lineWidth,\n lineDash: lineDash ?? theme.lineDash,\n stroke: 'red', // vrender bug,必须要设置一个全局的stroke,才会绘制\n segments: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data?.length) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call\n return parentNode.attribute.data.map((d: any) => {\n return {\n points: d.linePoints,\n stroke: d.color,\n }\n })\n }\n\n return []\n },\n },\n })\n\n if (!isNullish(text)) {\n childrenMarks.push({\n type: 'text',\n interactive: false,\n zIndex: 500,\n style: {\n textAlign: 'end',\n fill: textColor ?? theme.textColor,\n fontSize: textFontSize ?? theme.textFontSize,\n fontWeight: textFontWeight ?? theme.textFontWeight,\n text: text,\n x: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data?.length) {\n const point = parentNode.attribute.data[parentNode.attribute.data.length - 1].linePoints\n return point[point.length - 1]?.x\n }\n\n return undefined\n },\n y: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data?.length) {\n const point = parentNode.attribute.data[parentNode.attribute.data.length - 1].linePoints\n return point[point.length - 1]?.y\n }\n\n return undefined\n },\n },\n })\n }\n })\n\n return result\n }) as VChartSpecPipe\n}\n\nconst getDefaultRegressionOptions = (\n lineConfig: PolynomialRegressionLine | LinearRegressionLine | LogisticRegressionLine | LowessRegressionLine,\n) => {\n return { alpha: lineConfig?.confidenceLevel ?? 0.95 }\n}\n\nexport const linearRegressionLine: VChartSpecPipe = generateRegressionLinePipe('linearRegressionLine', regressionLinear)\nexport const lowessRegressionLine: VChartSpecPipe = generateRegressionLinePipe('lowessRegressionLine', regressionLowess)\nexport const polynomialRegressionLine: VChartSpecPipe = generateRegressionLinePipe(\n 'polynomialRegressionLine',\n regressionPolynomial,\n (lineConfig: PolynomialRegressionLine) => {\n return { ...getDefaultRegressionOptions(lineConfig), degree: lineConfig.degree ?? 2 }\n },\n)\nexport const logisticRegressionLine: VChartSpecPipe = generateRegressionLinePipe(\n 'logisticRegressionLine',\n regressionLogistic,\n)\n"],"names":["generateRegressionLinePipe","type","regressionFunction","getOptions","getDefaultRegressionOptions","spec","context","result","advancedVSeed","chartType","regressionLine","lineTheme","lineList","array","line","lineIndex","theme","color","lineWidth","lineDash","text","textColor","textFontSize","textFontWeight","confidenceIntervalOpacity","confidenceIntervalVisible","childrenMarks","datum","ctx","vchart","chart","s","rect","segments","start","yClamper","clamper","colorAttrOptions","groups","data","fieldX","fieldY","undefined","group","groupData","d","confidenceInterval","evaluateGrid","N","Math","mainColor","lineData","linePoints","ld","intervalData","areaPoints","opt","parentNode","isNullish","point","lineConfig","linearRegressionLine","regressionLinear","lowessRegressionLine","regressionLowess","polynomialRegressionLine","regressionPolynomial","logisticRegressionLine","regressionLogistic"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/regressionLine/linearRegressionLine.js","sources":["webpack://@visactor/vseed/./src/pipeline/spec/chart/pipes/regressionLine/linearRegressionLine.ts"],"sourcesContent":["import type { ICartesianSeries, IChart, IScatterChartSpec, IVChart } from '@visactor/vchart'\nimport { isNullish } from 'remeda'\nimport {\n array,\n clamper,\n regressionLinear,\n regressionLowess,\n regressionPolynomial,\n regressionLogistic,\n} from '@visactor/vutils'\nimport type {\n Datum,\n VChartSpecPipe,\n RegressionLineConfig,\n LinearRegressionLine,\n PolynomialRegressionLine,\n SpecPipelineContext,\n LogisticRegressionLine,\n LowessRegressionLine,\n} from 'src/types'\n\nexport const generateRegressionLinePipe = (\n type: 'linearRegressionLine' | 'lowessRegressionLine' | 'polynomialRegressionLine' | 'logisticRegressionLine',\n regressionFunction: (\n arr: Datum[],\n xAccessor: (d: Datum) => number,\n yAccessor: (d: Datum) => number,\n options?: any,\n ) => {\n confidenceInterval: (N: number) => { lower: number; upper: number; x: number }[]\n evaluateGrid: (N: number) => { x: number; y: number }[]\n },\n getOptions: (lineConfig: any) => any = getDefaultRegressionOptions,\n): VChartSpecPipe => {\n return ((spec: Partial<IScatterChartSpec>, context: SpecPipelineContext): Partial<IScatterChartSpec> => {\n const result = { ...spec }\n const { advancedVSeed } = context\n const { chartType, regressionLine } = advancedVSeed\n const lineTheme = advancedVSeed.config[chartType as 'scatter']?.regressionLine as RegressionLineConfig\n\n if (!regressionLine || !regressionLine[type]) {\n return result\n }\n\n const lineList = array(regressionLine[type])\n\n if (!result.extensionMark) {\n result.extensionMark = []\n }\n\n lineList.forEach((line, lineIndex) => {\n if (line.enable === false) {\n return\n }\n\n const theme = (lineTheme.linearRegressionLine ?? {}) as LinearRegressionLine\n const {\n color,\n lineWidth,\n lineDash,\n text,\n textColor,\n textFontSize,\n textFontWeight,\n confidenceIntervalOpacity,\n confidenceIntervalVisible = theme.confidenceIntervalVisible,\n } = line as LinearRegressionLine\n\n const childrenMarks: any[] = []\n\n ;(result.extensionMark as any[]).push({\n type: 'group',\n interactive: false,\n zIndex: 500,\n name: `${type}-${lineIndex}`,\n layoutType: 'region-relative',\n dataId: (spec.data as any)?.id,\n animation: false,\n style: {\n data: (datum: any, ctx: any) => {\n const vchart = ctx.vchart as IVChart\n const chart = vchart.getChart() as IChart\n const s = chart.getAllSeries()[0] as ICartesianSeries\n\n if (s) {\n const rect = s.getRegion().getLayoutRect()\n const segments: {\n areaPoints?: { x: number; y: number; y1: number }[]\n linePoints: { x: number; y: number }[]\n color: string\n }[] = []\n\n if (rect.width === 0 || rect.height === 0) {\n return segments\n }\n\n const yClamper = clamper(0, rect.height)\n const colorAttrOptions = s.getColorAttribute()\n const groups: (string | undefined)[] = s.getSeriesKeys()\n const data = s.getViewData()?.latestData as Datum[]\n const fieldX = s.fieldX?.[0]\n const fieldY = s.fieldY?.[0]\n\n if (!groups.length) {\n groups.push(undefined)\n }\n\n groups.forEach((group) => {\n const groupData = data.filter((d: Datum) => d[colorAttrOptions?.field] === group)\n\n if (groupData.length <= 2) {\n return\n }\n const { confidenceInterval, evaluateGrid } = regressionFunction(\n groupData,\n (datum: Datum) => datum?.[fieldX],\n (datum: Datum) => datum?.[fieldY],\n getOptions?.(line),\n )\n const N = Math.max(3, Math.floor(groupData.length / 4))\n const mainColor = color ?? colorAttrOptions?.scale?.scale(group)\n\n const lineData = evaluateGrid(N)\n const linePoints: { x: number; y: number }[] = []\n\n lineData.forEach((ld: Datum, index: number) => {\n const d = { [fieldX]: ld.x, [fieldY]: ld.y }\n const x = s.dataToPositionX(d)!\n const y = yClamper(s.dataToPositionY(d)!)\n\n if (segments.length && index === 0) {\n segments[segments.length - 1].linePoints.push({ x, y: NaN }) // 断开线段用的\n }\n\n linePoints.push({\n x,\n y,\n })\n })\n\n const segment: {\n color: string\n linePoints: { x: number; y: number }[]\n areaPoints?: { x: number; y: number; y1: number }[]\n } = {\n color: mainColor,\n linePoints,\n }\n\n if (confidenceIntervalVisible) {\n const intervalData = confidenceInterval(N)\n const areaPoints: { x: number; y: number; y1: number }[] = []\n\n intervalData.map((datum: Datum, index: number) => {\n const d = { [fieldX]: datum.x, [fieldY]: datum.lower }\n const x = s.dataToPositionX(d)!\n const y = yClamper(s.dataToPositionY(d)!)\n const y1 = yClamper(s.dataToPositionY({ [fieldY]: datum.upper })!)\n\n if (segments.length && index === 0) {\n segments[segments.length - 1].areaPoints!.push({ x, y: NaN, y1: NaN }) // 断开线段用的\n }\n\n areaPoints.push({ x, y, y1 })\n })\n\n segment.areaPoints = areaPoints\n }\n\n segments.push(segment)\n })\n\n return segments\n }\n return []\n },\n },\n children: childrenMarks,\n })\n\n if (confidenceIntervalVisible) {\n childrenMarks.push({\n type: 'area',\n interactive: false,\n zIndex: 500,\n dataId: (spec.data as any)?.id,\n style: {\n stroke: false,\n lineWidth: lineWidth ?? theme.lineWidth,\n lineDash: lineDash ?? theme.lineDash,\n fillOpacity: confidenceIntervalOpacity ?? theme.confidenceIntervalOpacity,\n fill: 'red', // vrender bug,必须要设置一个全局的fill,才会绘制\n segments: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode) {\n const data = parentNode.finalAttribute?.data ?? parentNode.attribute?.data\n\n if (data?.length) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call\n return data.map((d: any) => {\n return {\n points: d.areaPoints ?? [],\n fill: d.color,\n }\n })\n }\n }\n\n return []\n },\n },\n })\n }\n\n childrenMarks.push({\n type: 'line',\n interactive: false,\n zIndex: 500,\n animation: false,\n dataId: (spec.data as any)?.id,\n style: {\n lineWidth: lineWidth ?? theme.lineWidth,\n lineDash: lineDash ?? theme.lineDash,\n stroke: 'red', // vrender bug,必须要设置一个全局的stroke,才会绘制\n segments: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode) {\n const data = parentNode.finalAttribute?.data ?? parentNode.attribute?.data\n if (data?.length) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call\n return data.map((d: any) => {\n return {\n points: d.linePoints,\n stroke: d.color,\n }\n })\n }\n }\n\n return []\n },\n },\n })\n\n if (!isNullish(text)) {\n childrenMarks.push({\n type: 'text',\n interactive: false,\n zIndex: 500,\n animation: false,\n dataId: (spec.data as any)?.id,\n style: {\n textAlign: 'end',\n fill: textColor ?? theme.textColor,\n fontSize: textFontSize ?? theme.textFontSize,\n fontWeight: textFontWeight ?? theme.textFontWeight,\n text: text,\n x: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data?.length) {\n const point = parentNode.attribute.data[parentNode.attribute.data.length - 1].linePoints\n return point[point.length - 1]?.x\n }\n\n return undefined\n },\n y: (datum: any, ctx: any, opt: any) => {\n const parentNode = opt.mark?._product?.parent\n\n if (parentNode?.attribute?.data?.length) {\n const point = parentNode.attribute.data[parentNode.attribute.data.length - 1].linePoints\n return point[point.length - 1]?.y\n }\n\n return undefined\n },\n },\n })\n }\n })\n\n return result\n }) as VChartSpecPipe\n}\n\nconst getDefaultRegressionOptions = (\n lineConfig: PolynomialRegressionLine | LinearRegressionLine | LogisticRegressionLine | LowessRegressionLine,\n) => {\n return { alpha: lineConfig?.confidenceLevel ?? 0.95 }\n}\n\nexport const linearRegressionLine: VChartSpecPipe = generateRegressionLinePipe('linearRegressionLine', regressionLinear)\nexport const lowessRegressionLine: VChartSpecPipe = generateRegressionLinePipe('lowessRegressionLine', regressionLowess)\nexport const polynomialRegressionLine: VChartSpecPipe = generateRegressionLinePipe(\n 'polynomialRegressionLine',\n regressionPolynomial,\n (lineConfig: PolynomialRegressionLine) => {\n return { ...getDefaultRegressionOptions(lineConfig), degree: lineConfig.degree ?? 2 }\n },\n)\nexport const logisticRegressionLine: VChartSpecPipe = generateRegressionLinePipe(\n 'logisticRegressionLine',\n regressionLogistic,\n)\n"],"names":["generateRegressionLinePipe","type","regressionFunction","getOptions","getDefaultRegressionOptions","spec","context","result","advancedVSeed","chartType","regressionLine","lineTheme","lineList","array","line","lineIndex","theme","color","lineWidth","lineDash","text","textColor","textFontSize","textFontWeight","confidenceIntervalOpacity","confidenceIntervalVisible","childrenMarks","datum","ctx","vchart","chart","s","rect","segments","yClamper","clamper","colorAttrOptions","groups","data","fieldX","fieldY","undefined","group","groupData","d","confidenceInterval","evaluateGrid","N","Math","mainColor","lineData","linePoints","ld","index","x","y","NaN","segment","intervalData","areaPoints","y1","opt","parentNode","isNullish","point","lineConfig","linearRegressionLine","regressionLinear","lowessRegressionLine","regressionLowess","polynomialRegressionLine","regressionPolynomial","logisticRegressionLine","regressionLogistic"],"mappings":"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"}
@@ -10,14 +10,6 @@ const boxPlotMeasureKeys = [
10
10
  Q1MeasureValue,
11
11
  LowerWhisker
12
12
  ];
13
- const measureAliasMapping = {
14
- [OutliersMeasureId]: intl.i18n`异常点`,
15
- [UpperWhisker]: intl.i18n`上边界`,
16
- [Q3MeasureValue]: intl.i18n`上四分位数`,
17
- [MedianMeasureId]: intl.i18n`中位数`,
18
- [Q1MeasureValue]: intl.i18n`下四分位数`,
19
- [LowerWhisker]: intl.i18n`下边界`
20
- };
21
13
  const VCHART_OUTLIER_KEY = '__VCHART_BOX_PLOT_OUTLIER_VALUE';
22
14
  const tooltipBoxplot = (spec, context)=>{
23
15
  const result = {
@@ -33,6 +25,14 @@ const tooltipBoxplot = (spec, context)=>{
33
25
  const meas = findAllMeasures(vseed.measures);
34
26
  const valueMeasure = meas.find((item)=>'value' === item.encoding || isNullish(item.encoding));
35
27
  const defaultFormatter = valueMeasure ? createFormatterByMeasure(valueMeasure) : (v)=>v;
28
+ const measureAliasMapping = {
29
+ [OutliersMeasureId]: intl.i18n`异常点`,
30
+ [UpperWhisker]: intl.i18n`上边界`,
31
+ [Q3MeasureValue]: intl.i18n`上四分位数`,
32
+ [MedianMeasureId]: intl.i18n`中位数`,
33
+ [Q1MeasureValue]: intl.i18n`下四分位数`,
34
+ [LowerWhisker]: intl.i18n`下边界`
35
+ };
36
36
  result.tooltip = {
37
37
  visible: enable,
38
38
  style: getTooltipStyle(tooltip),
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/tooltip/tooltipBoxplot.js","sources":["webpack://@visactor/vseed/./src/pipeline/spec/chart/pipes/tooltip/tooltipBoxplot.ts"],"sourcesContent":["import { pipe, uniqueBy, isNullish } from 'remeda'\nimport { createFormatterByMeasure, findAllMeasures } from '../../../../utils'\nimport type { Dimension, Dimensions, Encoding, VChartSpecPipe, Tooltip } from 'src/types'\nimport type { Datum, ISpec, ITooltipLinePattern, ITooltipLineActual, TooltipData } from '@visactor/vchart'\nimport {\n ColorEncoding,\n LowerWhisker,\n MedianMeasureId,\n OutliersMeasureId,\n Q1MeasureValue,\n Q3MeasureValue,\n UpperWhisker,\n XEncoding,\n} from 'src/dataReshape'\nimport { getTooltipStyle } from './tooltipStyle'\nimport { intl } from 'src/i18n'\n\nconst boxPlotMeasureKeys = [UpperWhisker, Q3MeasureValue, MedianMeasureId, Q1MeasureValue, LowerWhisker]\nconst measureAliasMapping: Record<string, string> = {\n [OutliersMeasureId]: intl.i18n`异常点`,\n [UpperWhisker]: intl.i18n`上边界`,\n [Q3MeasureValue]: intl.i18n`上四分位数`,\n [MedianMeasureId]: intl.i18n`中位数`,\n [Q1MeasureValue]: intl.i18n`下四分位数`,\n [LowerWhisker]: intl.i18n`下边界`,\n}\nconst VCHART_OUTLIER_KEY = '__VCHART_BOX_PLOT_OUTLIER_VALUE'\n\nexport const tooltipBoxplot: VChartSpecPipe = (spec, context) => {\n const result = { ...spec }\n const { advancedVSeed, vseed } = context\n const { chartType, dimensions, encoding } = advancedVSeed\n const baseConfig = advancedVSeed.config[chartType] as { tooltip: Tooltip }\n const { tooltip = { enable: true } } = baseConfig\n const { enable } = tooltip\n const meas = findAllMeasures(vseed.measures)\n const valueMeasure = meas.find((item) => item.encoding === 'value' || isNullish(item.encoding))\n const defaultFormatter = valueMeasure ? createFormatterByMeasure(valueMeasure) : (v: unknown) => v\n\n result.tooltip = {\n visible: enable,\n style: getTooltipStyle(tooltip),\n mark: {\n title: {\n visible: false,\n },\n content: createMarkContent(encoding.tooltip || [], dimensions, encoding as Encoding),\n updateContent: (prev: ITooltipLineActual[] | undefined, data: TooltipData | undefined) => {\n const datum = (data as any)?.[0]?.datum?.[0]\n\n if (!isNullish(datum?.[VCHART_OUTLIER_KEY])) {\n const tooltipItems: ITooltipLineActual[] = (prev ?? []).filter(\n (item: any) => !boxPlotMeasureKeys.includes(item.key as string),\n )\n const outerlierMeasure = meas.find((item) => item.id === OutliersMeasureId)\n const formatter = outerlierMeasure ? createFormatterByMeasure(outerlierMeasure) : defaultFormatter\n\n tooltipItems.push({\n ...(tooltipItems[0] as any),\n key: outerlierMeasure?.alias ?? measureAliasMapping[OutliersMeasureId],\n value: formatter(datum?.[VCHART_OUTLIER_KEY] as number) as string,\n } as ITooltipLineActual)\n\n return tooltipItems\n }\n\n return (prev ?? []).map((entry) => {\n if (boxPlotMeasureKeys.includes((entry as any).key as string)) {\n const mea = meas.find((item) => item.id === (entry as any).key)\n const formatter = mea ? createFormatterByMeasure(mea) : defaultFormatter\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return {\n ...(entry as any),\n value: formatter(datum?.[(entry as any).key] as number) as string,\n key: mea?.alias ?? measureAliasMapping[entry?.key as string] ?? (entry as any).key,\n }\n }\n\n return entry\n }) as ITooltipLineActual[]\n },\n },\n dimension: {\n visible: false,\n },\n }\n return result as unknown as ISpec\n}\n\nconst createMarkContent = (tooltip: string[], dimensions: Dimensions, encoding: Encoding) => {\n const dims = pipe(\n dimensions.filter((item) => tooltip.includes(item.id)),\n uniqueBy((item: Dimension) => item.id),\n uniqueBy((item: Dimension) => item.alias),\n )\n\n const dimContent = dims.map((item: Dimension) => ({\n visible: true,\n hasShape: true,\n shapeType: 'rectRound',\n key: item.alias ?? item.id,\n value: (datum: Datum | undefined) => {\n if (!isNullish(datum?.[VCHART_OUTLIER_KEY])) {\n if (encoding.color?.includes(item.id)) {\n return datum?.[ColorEncoding] as string\n }\n if (encoding.x?.includes(item.id)) {\n return datum?.[XEncoding] as string\n }\n }\n\n return datum?.[item.id] as string\n },\n }))\n\n const defaultContent = boxPlotMeasureKeys.map((key: string) => {\n return {\n visible: true,\n hasShape: true,\n shapeType: 'rectRound',\n key,\n value: (datum: Datum | undefined) => {\n if (!datum) {\n return ''\n }\n return datum[key] as string | number\n },\n }\n })\n\n return [...dimContent, defaultContent] as ITooltipLinePattern[]\n}\n"],"names":["boxPlotMeasureKeys","UpperWhisker","Q3MeasureValue","MedianMeasureId","Q1MeasureValue","LowerWhisker","measureAliasMapping","OutliersMeasureId","intl","VCHART_OUTLIER_KEY","tooltipBoxplot","spec","context","result","advancedVSeed","vseed","chartType","dimensions","encoding","baseConfig","tooltip","enable","meas","findAllMeasures","valueMeasure","item","isNullish","defaultFormatter","createFormatterByMeasure","v","getTooltipStyle","createMarkContent","prev","data","datum","tooltipItems","outerlierMeasure","formatter","entry","mea","dims","pipe","uniqueBy","dimContent","ColorEncoding","XEncoding","defaultContent","key"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/tooltip/tooltipBoxplot.js","sources":["webpack://@visactor/vseed/./src/pipeline/spec/chart/pipes/tooltip/tooltipBoxplot.ts"],"sourcesContent":["import { pipe, uniqueBy, isNullish } from 'remeda'\nimport { createFormatterByMeasure, findAllMeasures } from '../../../../utils'\nimport type { Dimension, Dimensions, Encoding, VChartSpecPipe, Tooltip } from 'src/types'\nimport type { Datum, ISpec, ITooltipLinePattern, ITooltipLineActual, TooltipData } from '@visactor/vchart'\nimport {\n ColorEncoding,\n LowerWhisker,\n MedianMeasureId,\n OutliersMeasureId,\n Q1MeasureValue,\n Q3MeasureValue,\n UpperWhisker,\n XEncoding,\n} from 'src/dataReshape'\nimport { getTooltipStyle } from './tooltipStyle'\nimport { intl } from 'src/i18n'\n\nconst boxPlotMeasureKeys = [UpperWhisker, Q3MeasureValue, MedianMeasureId, Q1MeasureValue, LowerWhisker]\nconst VCHART_OUTLIER_KEY = '__VCHART_BOX_PLOT_OUTLIER_VALUE'\n\nexport const tooltipBoxplot: VChartSpecPipe = (spec, context) => {\n const result = { ...spec }\n const { advancedVSeed, vseed } = context\n const { chartType, dimensions, encoding } = advancedVSeed\n const baseConfig = advancedVSeed.config[chartType] as { tooltip: Tooltip }\n const { tooltip = { enable: true } } = baseConfig\n const { enable } = tooltip\n const meas = findAllMeasures(vseed.measures)\n const valueMeasure = meas.find((item) => item.encoding === 'value' || isNullish(item.encoding))\n const defaultFormatter = valueMeasure ? createFormatterByMeasure(valueMeasure) : (v: unknown) => v\n const measureAliasMapping: Record<string, string> = {\n [OutliersMeasureId]: intl.i18n`异常点`,\n [UpperWhisker]: intl.i18n`上边界`,\n [Q3MeasureValue]: intl.i18n`上四分位数`,\n [MedianMeasureId]: intl.i18n`中位数`,\n [Q1MeasureValue]: intl.i18n`下四分位数`,\n [LowerWhisker]: intl.i18n`下边界`,\n }\n\n result.tooltip = {\n visible: enable,\n style: getTooltipStyle(tooltip),\n mark: {\n title: {\n visible: false,\n },\n content: createMarkContent(encoding.tooltip || [], dimensions, encoding as Encoding),\n updateContent: (prev: ITooltipLineActual[] | undefined, data: TooltipData | undefined) => {\n const datum = (data as any)?.[0]?.datum?.[0]\n\n if (!isNullish(datum?.[VCHART_OUTLIER_KEY])) {\n const tooltipItems: ITooltipLineActual[] = (prev ?? []).filter(\n (item: any) => !boxPlotMeasureKeys.includes(item.key as string),\n )\n const outerlierMeasure = meas.find((item) => item.id === OutliersMeasureId)\n const formatter = outerlierMeasure ? createFormatterByMeasure(outerlierMeasure) : defaultFormatter\n\n tooltipItems.push({\n ...(tooltipItems[0] as any),\n key: outerlierMeasure?.alias ?? measureAliasMapping[OutliersMeasureId],\n value: formatter(datum?.[VCHART_OUTLIER_KEY] as number) as string,\n } as ITooltipLineActual)\n\n return tooltipItems\n }\n\n return (prev ?? []).map((entry) => {\n if (boxPlotMeasureKeys.includes((entry as any).key as string)) {\n const mea = meas.find((item) => item.id === (entry as any).key)\n const formatter = mea ? createFormatterByMeasure(mea) : defaultFormatter\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return {\n ...(entry as any),\n value: formatter(datum?.[(entry as any).key] as number) as string,\n key: mea?.alias ?? measureAliasMapping[entry?.key as string] ?? (entry as any).key,\n }\n }\n\n return entry\n }) as ITooltipLineActual[]\n },\n },\n dimension: {\n visible: false,\n },\n }\n return result as unknown as ISpec\n}\n\nconst createMarkContent = (tooltip: string[], dimensions: Dimensions, encoding: Encoding) => {\n const dims = pipe(\n dimensions.filter((item) => tooltip.includes(item.id)),\n uniqueBy((item: Dimension) => item.id),\n uniqueBy((item: Dimension) => item.alias),\n )\n\n const dimContent = dims.map((item: Dimension) => ({\n visible: true,\n hasShape: true,\n shapeType: 'rectRound',\n key: item.alias ?? item.id,\n value: (datum: Datum | undefined) => {\n if (!isNullish(datum?.[VCHART_OUTLIER_KEY])) {\n if (encoding.color?.includes(item.id)) {\n return datum?.[ColorEncoding] as string\n }\n if (encoding.x?.includes(item.id)) {\n return datum?.[XEncoding] as string\n }\n }\n\n return datum?.[item.id] as string\n },\n }))\n\n const defaultContent = boxPlotMeasureKeys.map((key: string) => {\n return {\n visible: true,\n hasShape: true,\n shapeType: 'rectRound',\n key,\n value: (datum: Datum | undefined) => {\n if (!datum) {\n return ''\n }\n return datum[key] as string | number\n },\n }\n })\n\n return [...dimContent, defaultContent] as ITooltipLinePattern[]\n}\n"],"names":["boxPlotMeasureKeys","UpperWhisker","Q3MeasureValue","MedianMeasureId","Q1MeasureValue","LowerWhisker","VCHART_OUTLIER_KEY","tooltipBoxplot","spec","context","result","advancedVSeed","vseed","chartType","dimensions","encoding","baseConfig","tooltip","enable","meas","findAllMeasures","valueMeasure","item","isNullish","defaultFormatter","createFormatterByMeasure","v","measureAliasMapping","OutliersMeasureId","intl","getTooltipStyle","createMarkContent","prev","data","datum","tooltipItems","outerlierMeasure","formatter","entry","mea","dims","pipe","uniqueBy","dimContent","ColorEncoding","XEncoding","defaultContent","key"],"mappings":"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"}