@rowsncolumns/charts 27.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +100 -0
- package/Readme.md +81 -0
- package/dist/cjs/atoms/editing-chart.atom.d.ts +13 -0
- package/dist/cjs/atoms/editing-chart.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/editing-chart.atom.js +26 -0
- package/dist/cjs/basic-chart/basic-chart.d.ts +5 -0
- package/dist/cjs/basic-chart/basic-chart.d.ts.map +1 -0
- package/dist/cjs/basic-chart/basic-chart.js +2250 -0
- package/dist/cjs/basic-chart/helpers.d.ts +12 -0
- package/dist/cjs/basic-chart/helpers.d.ts.map +1 -0
- package/dist/cjs/basic-chart/helpers.js +105 -0
- package/dist/cjs/basic-chart/index.d.ts +5 -0
- package/dist/cjs/basic-chart/index.d.ts.map +1 -0
- package/dist/cjs/basic-chart/index.js +12 -0
- package/dist/cjs/components/dialogs/chart-editor-dialog.d.ts +5 -0
- package/dist/cjs/components/dialogs/chart-editor-dialog.d.ts.map +1 -0
- package/dist/cjs/components/dialogs/chart-editor-dialog.js +25 -0
- package/dist/cjs/components/editors/chart-editor.d.ts +10 -0
- package/dist/cjs/components/editors/chart-editor.d.ts.map +1 -0
- package/dist/cjs/components/editors/chart-editor.js +631 -0
- package/dist/cjs/components/editors/chart-range-input.d.ts +17 -0
- package/dist/cjs/components/editors/chart-range-input.d.ts.map +1 -0
- package/dist/cjs/components/editors/chart-range-input.js +16 -0
- package/dist/cjs/config.d.ts +19 -0
- package/dist/cjs/config.d.ts.map +1 -0
- package/dist/cjs/config.js +196 -0
- package/dist/cjs/hooks/use-chart-editor.d.ts +8 -0
- package/dist/cjs/hooks/use-chart-editor.d.ts.map +1 -0
- package/dist/cjs/hooks/use-chart-editor.js +29 -0
- package/dist/cjs/hooks/use-charts.d.ts +35 -0
- package/dist/cjs/hooks/use-charts.d.ts.map +1 -0
- package/dist/cjs/hooks/use-charts.js +67 -0
- package/dist/cjs/hooks/use-on-create-chart.d.ts +13 -0
- package/dist/cjs/hooks/use-on-create-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-create-chart.js +24 -0
- package/dist/cjs/hooks/use-on-delete-chart.d.ts +8 -0
- package/dist/cjs/hooks/use-on-delete-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-delete-chart.js +19 -0
- package/dist/cjs/hooks/use-on-move-chart.d.ts +8 -0
- package/dist/cjs/hooks/use-on-move-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-move-chart.js +15 -0
- package/dist/cjs/hooks/use-on-resize-chart.d.ts +8 -0
- package/dist/cjs/hooks/use-on-resize-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-resize-chart.js +15 -0
- package/dist/cjs/hooks/use-on-update-chart.d.ts +9 -0
- package/dist/cjs/hooks/use-on-update-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-update-chart.js +15 -0
- package/dist/cjs/index.d.ts +11 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +18 -0
- package/dist/cjs/interface/create-chart.d.ts +9 -0
- package/dist/cjs/interface/create-chart.d.ts.map +1 -0
- package/dist/cjs/interface/create-chart.js +110 -0
- package/dist/cjs/interface/delete-chart.d.ts +4 -0
- package/dist/cjs/interface/delete-chart.d.ts.map +1 -0
- package/dist/cjs/interface/delete-chart.js +26 -0
- package/dist/cjs/interface/move-chart.d.ts +5 -0
- package/dist/cjs/interface/move-chart.d.ts.map +1 -0
- package/dist/cjs/interface/move-chart.js +28 -0
- package/dist/cjs/interface/resize-chart.d.ts +5 -0
- package/dist/cjs/interface/resize-chart.d.ts.map +1 -0
- package/dist/cjs/interface/resize-chart.js +30 -0
- package/dist/cjs/interface/update-chart.d.ts +4 -0
- package/dist/cjs/interface/update-chart.d.ts.map +1 -0
- package/dist/cjs/interface/update-chart.js +29 -0
- package/dist/cjs/plotly/basic-chart/basic-chart.d.ts +5 -0
- package/dist/cjs/plotly/basic-chart/basic-chart.d.ts.map +1 -0
- package/dist/cjs/plotly/basic-chart/basic-chart.js +1586 -0
- package/dist/cjs/plotly/basic-chart/helpers.d.ts +20 -0
- package/dist/cjs/plotly/basic-chart/helpers.d.ts.map +1 -0
- package/dist/cjs/plotly/basic-chart/helpers.js +114 -0
- package/dist/cjs/plotly/basic-chart/index.d.ts +5 -0
- package/dist/cjs/plotly/basic-chart/index.d.ts.map +1 -0
- package/dist/cjs/plotly/basic-chart/index.js +12 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/types.d.ts +27 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/utils/aggregation.d.ts +6 -0
- package/dist/cjs/utils/aggregation.d.ts.map +1 -0
- package/dist/cjs/utils/aggregation.js +127 -0
- package/dist/cjs/utils/bar-layout.d.ts +57 -0
- package/dist/cjs/utils/bar-layout.d.ts.map +1 -0
- package/dist/cjs/utils/bar-layout.js +81 -0
- package/dist/cjs/utils/boxplot.d.ts +62 -0
- package/dist/cjs/utils/boxplot.d.ts.map +1 -0
- package/dist/cjs/utils/boxplot.js +105 -0
- package/dist/cjs/utils/bubble.d.ts +52 -0
- package/dist/cjs/utils/bubble.d.ts.map +1 -0
- package/dist/cjs/utils/bubble.js +139 -0
- package/dist/cjs/utils/chart-spec-utils.d.ts +67 -0
- package/dist/cjs/utils/chart-spec-utils.d.ts.map +1 -0
- package/dist/cjs/utils/chart-spec-utils.js +355 -0
- package/dist/cjs/utils/echarts-gl-loader.d.ts +11 -0
- package/dist/cjs/utils/echarts-gl-loader.d.ts.map +1 -0
- package/dist/cjs/utils/echarts-gl-loader.js +59 -0
- package/dist/cjs/utils/error-bars.d.ts +58 -0
- package/dist/cjs/utils/error-bars.d.ts.map +1 -0
- package/dist/cjs/utils/error-bars.js +154 -0
- package/dist/cjs/utils/gradient.d.ts +52 -0
- package/dist/cjs/utils/gradient.d.ts.map +1 -0
- package/dist/cjs/utils/gradient.js +93 -0
- package/dist/cjs/utils/hierarchy.d.ts +28 -0
- package/dist/cjs/utils/hierarchy.d.ts.map +1 -0
- package/dist/cjs/utils/hierarchy.js +186 -0
- package/dist/cjs/utils/histogram.d.ts +46 -0
- package/dist/cjs/utils/histogram.d.ts.map +1 -0
- package/dist/cjs/utils/histogram.js +125 -0
- package/dist/cjs/utils/of-pie.d.ts +101 -0
- package/dist/cjs/utils/of-pie.d.ts.map +1 -0
- package/dist/cjs/utils/of-pie.js +159 -0
- package/dist/cjs/utils/overrides.d.ts +12 -0
- package/dist/cjs/utils/overrides.d.ts.map +1 -0
- package/dist/cjs/utils/overrides.js +171 -0
- package/dist/cjs/utils/radar.d.ts +37 -0
- package/dist/cjs/utils/radar.d.ts.map +1 -0
- package/dist/cjs/utils/radar.js +70 -0
- package/dist/cjs/utils/region-map-loader.d.ts +22 -0
- package/dist/cjs/utils/region-map-loader.d.ts.map +1 -0
- package/dist/cjs/utils/region-map-loader.js +174 -0
- package/dist/cjs/utils/region-map.d.ts +100 -0
- package/dist/cjs/utils/region-map.d.ts.map +1 -0
- package/dist/cjs/utils/region-map.js +327 -0
- package/dist/cjs/utils/stock.d.ts +64 -0
- package/dist/cjs/utils/stock.d.ts.map +1 -0
- package/dist/cjs/utils/stock.js +153 -0
- package/dist/cjs/utils/three-d.d.ts +96 -0
- package/dist/cjs/utils/three-d.d.ts.map +1 -0
- package/dist/cjs/utils/three-d.js +191 -0
- package/dist/cjs/utils/trendline.d.ts +41 -0
- package/dist/cjs/utils/trendline.d.ts.map +1 -0
- package/dist/cjs/utils/trendline.js +303 -0
- package/dist/cjs/utils/waterfall.d.ts +24 -0
- package/dist/cjs/utils/waterfall.d.ts.map +1 -0
- package/dist/cjs/utils/waterfall.js +61 -0
- package/dist/cjs/utils/webgl.d.ts +12 -0
- package/dist/cjs/utils/webgl.d.ts.map +1 -0
- package/dist/cjs/utils/webgl.js +36 -0
- package/dist/cjs/vitest.config.d.ts +3 -0
- package/dist/cjs/vitest.config.d.ts.map +1 -0
- package/dist/cjs/vitest.config.js +9 -0
- package/dist/esm/atoms/editing-chart.atom.d.ts +13 -0
- package/dist/esm/atoms/editing-chart.atom.d.ts.map +1 -0
- package/dist/esm/atoms/editing-chart.atom.js +12 -0
- package/dist/esm/basic-chart/basic-chart.d.ts +5 -0
- package/dist/esm/basic-chart/basic-chart.d.ts.map +1 -0
- package/dist/esm/basic-chart/basic-chart.js +2343 -0
- package/dist/esm/basic-chart/helpers.d.ts +12 -0
- package/dist/esm/basic-chart/helpers.d.ts.map +1 -0
- package/dist/esm/basic-chart/helpers.js +98 -0
- package/dist/esm/basic-chart/index.d.ts +5 -0
- package/dist/esm/basic-chart/index.d.ts.map +1 -0
- package/dist/esm/basic-chart/index.js +7 -0
- package/dist/esm/components/dialogs/chart-editor-dialog.d.ts +5 -0
- package/dist/esm/components/dialogs/chart-editor-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialogs/chart-editor-dialog.js +19 -0
- package/dist/esm/components/editors/chart-editor.d.ts +10 -0
- package/dist/esm/components/editors/chart-editor.d.ts.map +1 -0
- package/dist/esm/components/editors/chart-editor.js +550 -0
- package/dist/esm/components/editors/chart-range-input.d.ts +17 -0
- package/dist/esm/components/editors/chart-range-input.d.ts.map +1 -0
- package/dist/esm/components/editors/chart-range-input.js +10 -0
- package/dist/esm/config.d.ts +19 -0
- package/dist/esm/config.d.ts.map +1 -0
- package/dist/esm/config.js +161 -0
- package/dist/esm/hooks/use-chart-editor.d.ts +8 -0
- package/dist/esm/hooks/use-chart-editor.d.ts.map +1 -0
- package/dist/esm/hooks/use-chart-editor.js +32 -0
- package/dist/esm/hooks/use-charts.d.ts +35 -0
- package/dist/esm/hooks/use-charts.d.ts.map +1 -0
- package/dist/esm/hooks/use-charts.js +62 -0
- package/dist/esm/hooks/use-on-create-chart.d.ts +13 -0
- package/dist/esm/hooks/use-on-create-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-create-chart.js +19 -0
- package/dist/esm/hooks/use-on-delete-chart.d.ts +8 -0
- package/dist/esm/hooks/use-on-delete-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-delete-chart.js +14 -0
- package/dist/esm/hooks/use-on-move-chart.d.ts +8 -0
- package/dist/esm/hooks/use-on-move-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-move-chart.js +10 -0
- package/dist/esm/hooks/use-on-resize-chart.d.ts +8 -0
- package/dist/esm/hooks/use-on-resize-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-resize-chart.js +10 -0
- package/dist/esm/hooks/use-on-update-chart.d.ts +9 -0
- package/dist/esm/hooks/use-on-update-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-update-chart.js +10 -0
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/interface/create-chart.d.ts +9 -0
- package/dist/esm/interface/create-chart.d.ts.map +1 -0
- package/dist/esm/interface/create-chart.js +126 -0
- package/dist/esm/interface/delete-chart.d.ts +4 -0
- package/dist/esm/interface/delete-chart.d.ts.map +1 -0
- package/dist/esm/interface/delete-chart.js +20 -0
- package/dist/esm/interface/move-chart.d.ts +5 -0
- package/dist/esm/interface/move-chart.d.ts.map +1 -0
- package/dist/esm/interface/move-chart.js +22 -0
- package/dist/esm/interface/resize-chart.d.ts +5 -0
- package/dist/esm/interface/resize-chart.d.ts.map +1 -0
- package/dist/esm/interface/resize-chart.js +24 -0
- package/dist/esm/interface/update-chart.d.ts +4 -0
- package/dist/esm/interface/update-chart.d.ts.map +1 -0
- package/dist/esm/interface/update-chart.js +26 -0
- package/dist/esm/plotly/basic-chart/basic-chart.d.ts +5 -0
- package/dist/esm/plotly/basic-chart/basic-chart.d.ts.map +1 -0
- package/dist/esm/plotly/basic-chart/basic-chart.js +1682 -0
- package/dist/esm/plotly/basic-chart/helpers.d.ts +20 -0
- package/dist/esm/plotly/basic-chart/helpers.d.ts.map +1 -0
- package/dist/esm/plotly/basic-chart/helpers.js +107 -0
- package/dist/esm/plotly/basic-chart/index.d.ts +5 -0
- package/dist/esm/plotly/basic-chart/index.d.ts.map +1 -0
- package/dist/esm/plotly/basic-chart/index.js +7 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/types.d.ts +27 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/utils/aggregation.d.ts +6 -0
- package/dist/esm/utils/aggregation.d.ts.map +1 -0
- package/dist/esm/utils/aggregation.js +96 -0
- package/dist/esm/utils/bar-layout.d.ts +57 -0
- package/dist/esm/utils/bar-layout.d.ts.map +1 -0
- package/dist/esm/utils/bar-layout.js +70 -0
- package/dist/esm/utils/boxplot.d.ts +62 -0
- package/dist/esm/utils/boxplot.d.ts.map +1 -0
- package/dist/esm/utils/boxplot.js +91 -0
- package/dist/esm/utils/bubble.d.ts +52 -0
- package/dist/esm/utils/bubble.d.ts.map +1 -0
- package/dist/esm/utils/bubble.js +122 -0
- package/dist/esm/utils/chart-spec-utils.d.ts +67 -0
- package/dist/esm/utils/chart-spec-utils.d.ts.map +1 -0
- package/dist/esm/utils/chart-spec-utils.js +270 -0
- package/dist/esm/utils/echarts-gl-loader.d.ts +11 -0
- package/dist/esm/utils/echarts-gl-loader.d.ts.map +1 -0
- package/dist/esm/utils/echarts-gl-loader.js +51 -0
- package/dist/esm/utils/error-bars.d.ts +58 -0
- package/dist/esm/utils/error-bars.d.ts.map +1 -0
- package/dist/esm/utils/error-bars.js +134 -0
- package/dist/esm/utils/gradient.d.ts +52 -0
- package/dist/esm/utils/gradient.d.ts.map +1 -0
- package/dist/esm/utils/gradient.js +84 -0
- package/dist/esm/utils/hierarchy.d.ts +28 -0
- package/dist/esm/utils/hierarchy.d.ts.map +1 -0
- package/dist/esm/utils/hierarchy.js +150 -0
- package/dist/esm/utils/histogram.d.ts +46 -0
- package/dist/esm/utils/histogram.d.ts.map +1 -0
- package/dist/esm/utils/histogram.js +95 -0
- package/dist/esm/utils/of-pie.d.ts +101 -0
- package/dist/esm/utils/of-pie.d.ts.map +1 -0
- package/dist/esm/utils/of-pie.js +141 -0
- package/dist/esm/utils/overrides.d.ts +12 -0
- package/dist/esm/utils/overrides.d.ts.map +1 -0
- package/dist/esm/utils/overrides.js +159 -0
- package/dist/esm/utils/radar.d.ts +37 -0
- package/dist/esm/utils/radar.d.ts.map +1 -0
- package/dist/esm/utils/radar.js +49 -0
- package/dist/esm/utils/region-map-loader.d.ts +22 -0
- package/dist/esm/utils/region-map-loader.d.ts.map +1 -0
- package/dist/esm/utils/region-map-loader.js +141 -0
- package/dist/esm/utils/region-map.d.ts +100 -0
- package/dist/esm/utils/region-map.d.ts.map +1 -0
- package/dist/esm/utils/region-map.js +266 -0
- package/dist/esm/utils/stock.d.ts +64 -0
- package/dist/esm/utils/stock.d.ts.map +1 -0
- package/dist/esm/utils/stock.js +123 -0
- package/dist/esm/utils/three-d.d.ts +96 -0
- package/dist/esm/utils/three-d.d.ts.map +1 -0
- package/dist/esm/utils/three-d.js +162 -0
- package/dist/esm/utils/trendline.d.ts +41 -0
- package/dist/esm/utils/trendline.d.ts.map +1 -0
- package/dist/esm/utils/trendline.js +257 -0
- package/dist/esm/utils/waterfall.d.ts +24 -0
- package/dist/esm/utils/waterfall.d.ts.map +1 -0
- package/dist/esm/utils/waterfall.js +55 -0
- package/dist/esm/utils/webgl.d.ts +12 -0
- package/dist/esm/utils/webgl.d.ts.map +1 -0
- package/dist/esm/utils/webgl.js +30 -0
- package/dist/esm/vitest.config.d.ts +3 -0
- package/dist/esm/vitest.config.d.ts.map +1 -0
- package/dist/esm/vitest.config.js +7 -0
- package/package.json +96 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EmbeddedChart } from "@rowsncolumns/spreadsheet";
|
|
2
|
+
export declare const chartTypeToPlotlyType: (type: EmbeddedChart["spec"]["chartType"]) => string;
|
|
3
|
+
export declare const getPlotlyTraceStyle: (type: EmbeddedChart["spec"]["chartType"]) => {
|
|
4
|
+
mode: "lines";
|
|
5
|
+
fill?: undefined;
|
|
6
|
+
} | {
|
|
7
|
+
mode: "lines";
|
|
8
|
+
fill: "tozeroy";
|
|
9
|
+
} | {
|
|
10
|
+
mode?: undefined;
|
|
11
|
+
fill?: undefined;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Map OOXML `<c:marker><c:symbol val=…>` to plotly marker symbol names.
|
|
15
|
+
* OOXML symbols don't all have direct plotly equivalents — closest
|
|
16
|
+
* visual analog is used.
|
|
17
|
+
*/
|
|
18
|
+
export declare const mapMarkerSymbolToPlotly: (symbol: string | undefined | null) => string | undefined;
|
|
19
|
+
export declare const showXAxis: (type: EmbeddedChart["spec"]["chartType"]) => boolean;
|
|
20
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../plotly/basic-chart/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,eAAO,MAAM,qBAAqB,GAChC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,KACvC,MA+DF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;;;;;;;;;CAgBzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAClC,QAAQ,MAAM,GAAG,SAAS,GAAG,IAAI,KAChC,MAAM,GAAG,SA0BX,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,YAejE,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.showXAxis = exports.mapMarkerSymbolToPlotly = exports.getPlotlyTraceStyle = exports.chartTypeToPlotlyType = void 0;
|
|
4
|
+
var chartTypeToPlotlyType = function (type) {
|
|
5
|
+
switch (type) {
|
|
6
|
+
case "column":
|
|
7
|
+
return "bar";
|
|
8
|
+
case "line":
|
|
9
|
+
return "scatter";
|
|
10
|
+
case "area":
|
|
11
|
+
return "scatter";
|
|
12
|
+
case "bar":
|
|
13
|
+
return "bar";
|
|
14
|
+
case "pie":
|
|
15
|
+
return "pie";
|
|
16
|
+
case "treemap":
|
|
17
|
+
return "treemap";
|
|
18
|
+
case "sunburst":
|
|
19
|
+
return "sunburst";
|
|
20
|
+
case "bubble":
|
|
21
|
+
return "scatter";
|
|
22
|
+
case "scatter":
|
|
23
|
+
return "scatter";
|
|
24
|
+
case "histogram":
|
|
25
|
+
return "histogram";
|
|
26
|
+
case "boxplot":
|
|
27
|
+
return "box";
|
|
28
|
+
// Radar maps to plotly's polar scatter trace; the caller also sets a
|
|
29
|
+
// `polar` layout block. See basic-chart.tsx.
|
|
30
|
+
case "radar":
|
|
31
|
+
return "scatterpolar";
|
|
32
|
+
// Stock is rendered "line-derived" — each price role becomes its own
|
|
33
|
+
// scatter line trace. See basic-chart.tsx.
|
|
34
|
+
case "stock":
|
|
35
|
+
return "scatter";
|
|
36
|
+
case "waterfall":
|
|
37
|
+
return "waterfall";
|
|
38
|
+
case "funnel":
|
|
39
|
+
return "funnel";
|
|
40
|
+
// Combo defaults to bar; per-series seriesChartType overrides each
|
|
41
|
+
// trace independently. See chart-editor "Series type" selector.
|
|
42
|
+
case "combo":
|
|
43
|
+
return "bar";
|
|
44
|
+
// Region map (filled map) — plotly's built-in choropleth trace
|
|
45
|
+
// (plotly ships its own world geometry). See basic-chart.tsx.
|
|
46
|
+
case "regionMap":
|
|
47
|
+
return "choropleth";
|
|
48
|
+
default:
|
|
49
|
+
return "scatter";
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.chartTypeToPlotlyType = chartTypeToPlotlyType;
|
|
53
|
+
var getPlotlyTraceStyle = function (type) {
|
|
54
|
+
switch (type) {
|
|
55
|
+
case "line":
|
|
56
|
+
return { mode: "lines" };
|
|
57
|
+
case "area":
|
|
58
|
+
return { mode: "lines", fill: "tozeroy" };
|
|
59
|
+
// Stock price roles render as plain lines.
|
|
60
|
+
case "stock":
|
|
61
|
+
return { mode: "lines" };
|
|
62
|
+
default:
|
|
63
|
+
return {};
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
exports.getPlotlyTraceStyle = getPlotlyTraceStyle;
|
|
67
|
+
/**
|
|
68
|
+
* Map OOXML `<c:marker><c:symbol val=…>` to plotly marker symbol names.
|
|
69
|
+
* OOXML symbols don't all have direct plotly equivalents — closest
|
|
70
|
+
* visual analog is used.
|
|
71
|
+
*/
|
|
72
|
+
var mapMarkerSymbolToPlotly = function (symbol) {
|
|
73
|
+
switch (symbol) {
|
|
74
|
+
case "circle":
|
|
75
|
+
case "dot":
|
|
76
|
+
return "circle";
|
|
77
|
+
case "square":
|
|
78
|
+
return "square";
|
|
79
|
+
case "diamond":
|
|
80
|
+
return "diamond";
|
|
81
|
+
case "triangle":
|
|
82
|
+
return "triangle-up";
|
|
83
|
+
case "x":
|
|
84
|
+
return "x";
|
|
85
|
+
case "plus":
|
|
86
|
+
return "cross";
|
|
87
|
+
case "star":
|
|
88
|
+
return "star";
|
|
89
|
+
case "dash":
|
|
90
|
+
return "line-ew";
|
|
91
|
+
case "auto":
|
|
92
|
+
case undefined:
|
|
93
|
+
case null:
|
|
94
|
+
return undefined;
|
|
95
|
+
default:
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
exports.mapMarkerSymbolToPlotly = mapMarkerSymbolToPlotly;
|
|
100
|
+
var showXAxis = function (type) {
|
|
101
|
+
if (type === "line" ||
|
|
102
|
+
type === "area" ||
|
|
103
|
+
type === "bar" ||
|
|
104
|
+
type === "column" ||
|
|
105
|
+
type === "bubble" ||
|
|
106
|
+
type === "histogram" ||
|
|
107
|
+
// Stock is line-derived on a category x-axis. Radar is polar and
|
|
108
|
+
// does not use the cartesian x-axis.
|
|
109
|
+
type === "stock") {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
return false;
|
|
113
|
+
};
|
|
114
|
+
exports.showXAxis = showXAxis;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../plotly/basic-chart/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGxD,eAAO,MAAM,cAAc,GAAI,OAAO,oBAAoB,sBAMzD,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChartComponent = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var react_1 = tslib_1.__importDefault(require("react"));
|
|
6
|
+
var basic_chart_1 = require("./basic-chart");
|
|
7
|
+
var ChartComponent = function (props) {
|
|
8
|
+
return (react_1.default.createElement("div", { className: "shadow-lg bg-rnc-background flex-1 flex break-words flex-col" },
|
|
9
|
+
react_1.default.createElement(basic_chart_1.BasicChart, tslib_1.__assign({}, props))));
|
|
10
|
+
};
|
|
11
|
+
exports.ChartComponent = ChartComponent;
|
|
12
|
+
exports.default = exports.ChartComponent;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../../config.ts","../../echarts-gl.d.ts","../../geo-modules.d.ts","../../index.ts","../../types.ts","../../vitest.config.ts","../../atoms/editing-chart.atom.ts","../../basic-chart/basic-chart.tsx","../../basic-chart/helpers.ts","../../basic-chart/index.tsx","../../components/dialogs/chart-editor-dialog.tsx","../../components/editors/chart-editor.tsx","../../components/editors/chart-range-input.tsx","../../hooks/use-chart-editor.ts","../../hooks/use-charts.ts","../../hooks/use-on-create-chart.ts","../../hooks/use-on-delete-chart.ts","../../hooks/use-on-move-chart.ts","../../hooks/use-on-resize-chart.ts","../../hooks/use-on-update-chart.ts","../../interface/create-chart.ts","../../interface/delete-chart.ts","../../interface/move-chart.ts","../../interface/resize-chart.ts","../../interface/update-chart.ts","../../plotly/basic-chart/basic-chart.tsx","../../plotly/basic-chart/helpers.ts","../../plotly/basic-chart/index.tsx","../../utils/aggregation.ts","../../utils/bar-layout.ts","../../utils/boxplot.ts","../../utils/bubble.ts","../../utils/chart-spec-utils.ts","../../utils/echarts-gl-loader.ts","../../utils/error-bars.ts","../../utils/gradient.ts","../../utils/hierarchy.ts","../../utils/histogram.ts","../../utils/of-pie.ts","../../utils/overrides.ts","../../utils/radar.ts","../../utils/region-map-loader.ts","../../utils/region-map.ts","../../utils/stock.ts","../../utils/three-d.ts","../../utils/trendline.ts","../../utils/waterfall.ts","../../utils/webgl.ts"],"version":"5.8.3"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ChartComponentProps, EmbeddedChart } from "@rowsncolumns/spreadsheet";
|
|
2
|
+
import type { useCalculation } from "@rowsncolumns/spreadsheet-state";
|
|
3
|
+
import type { useSpreadsheetState } from "@rowsncolumns/spreadsheet-state";
|
|
4
|
+
export type EChartComponentProps = ChartComponentProps & {
|
|
5
|
+
/**
|
|
6
|
+
* Dark mode
|
|
7
|
+
*/
|
|
8
|
+
isDarkMode?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Get all formatted values from a domain
|
|
11
|
+
*/
|
|
12
|
+
getDomainValuesFromRange: ReturnType<typeof useSpreadsheetState>["getDomainValuesFromRange"];
|
|
13
|
+
/**
|
|
14
|
+
* Get all effective values from a series
|
|
15
|
+
*/
|
|
16
|
+
getSeriesValuesFromRange: ReturnType<typeof useSpreadsheetState>["getSeriesValuesFromRange"];
|
|
17
|
+
/**
|
|
18
|
+
* Request edit chart
|
|
19
|
+
* @param chart
|
|
20
|
+
*/
|
|
21
|
+
onRequestEdit?(chart: EmbeddedChart): void;
|
|
22
|
+
/**
|
|
23
|
+
* Callback to trigger a calculation request
|
|
24
|
+
*/
|
|
25
|
+
onRequestCalculate: ReturnType<typeof useCalculation>["onRequestCalculate"];
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG;IACvD;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,wBAAwB,EAAE,UAAU,CAClC,OAAO,mBAAmB,CAC3B,CAAC,0BAA0B,CAAC,CAAC;IAC9B;;OAEG;IACH,wBAAwB,EAAE,UAAU,CAClC,OAAO,mBAAmB,CAC3B,CAAC,0BAA0B,CAAC,CAAC;IAC9B;;;OAGG;IACH,aAAa,CAAC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3C;;OAEG;IACH,kBAAkB,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,oBAAoB,CAAC,CAAC;CAC7E,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ChartAggregateType, ChartData } from "@rowsncolumns/spreadsheet";
|
|
2
|
+
export declare const sanitizeDomainValues: (values: (string | number | null | undefined)[]) => string[];
|
|
3
|
+
export declare const shouldAggregateSeries: (series?: ChartData[]) => boolean;
|
|
4
|
+
export declare const getDomainValuesForAxis: (domainValues: string[], aggregate: boolean) => string[];
|
|
5
|
+
export declare const aggregateSeriesByDomain: (rawDomainValues: string[], seriesValues: (string | number | boolean | undefined)[], aggregateType: ChartAggregateType, orderedDomainValues: string[]) => (number | null)[];
|
|
6
|
+
//# sourceMappingURL=aggregation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregation.d.ts","sourceRoot":"","sources":["../../../utils/aggregation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,SAAS,EACV,MAAM,2BAA2B,CAAC;AA0EnC,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KAC7C,MAAM,EAA+B,CAAC;AAEzC,eAAO,MAAM,qBAAqB,GAAI,SAAS,SAAS,EAAE,KAAG,OAM5D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,cAAc,MAAM,EAAE,EACtB,WAAW,OAAO,aACyC,CAAC;AAE9D,eAAO,MAAM,uBAAuB,GAClC,iBAAiB,MAAM,EAAE,EACzB,cAAc,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,EAAE,EACvD,eAAe,kBAAkB,EACjC,qBAAqB,MAAM,EAAE,KAC5B,CAAC,MAAM,GAAG,IAAI,CAAC,EA8BjB,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aggregateSeriesByDomain = exports.getDomainValuesForAxis = exports.shouldAggregateSeries = exports.sanitizeDomainValues = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var toDomainLabel = function (value) {
|
|
6
|
+
if (value === null || value === undefined) {
|
|
7
|
+
return "";
|
|
8
|
+
}
|
|
9
|
+
return String(value);
|
|
10
|
+
};
|
|
11
|
+
var toNumericValue = function (value) {
|
|
12
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
if (typeof value === "string") {
|
|
16
|
+
var parsed = Number(value);
|
|
17
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
18
|
+
}
|
|
19
|
+
if (typeof value === "boolean") {
|
|
20
|
+
return value ? 1 : 0;
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
};
|
|
24
|
+
var uniqueDomains = function (values) {
|
|
25
|
+
var e_1, _a;
|
|
26
|
+
var seen = new Set();
|
|
27
|
+
var ordered = [];
|
|
28
|
+
try {
|
|
29
|
+
for (var values_1 = tslib_1.__values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
|
|
30
|
+
var value = values_1_1.value;
|
|
31
|
+
if (!seen.has(value)) {
|
|
32
|
+
seen.add(value);
|
|
33
|
+
ordered.push(value);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
38
|
+
finally {
|
|
39
|
+
try {
|
|
40
|
+
if (values_1_1 && !values_1_1.done && (_a = values_1.return)) _a.call(values_1);
|
|
41
|
+
}
|
|
42
|
+
finally { if (e_1) throw e_1.error; }
|
|
43
|
+
}
|
|
44
|
+
return ordered;
|
|
45
|
+
};
|
|
46
|
+
var median = function (values) {
|
|
47
|
+
var sorted = tslib_1.__spreadArray([], tslib_1.__read(values), false).sort(function (a, b) { return a - b; });
|
|
48
|
+
var mid = Math.floor(sorted.length / 2);
|
|
49
|
+
if (sorted.length % 2 === 0) {
|
|
50
|
+
return (sorted[mid - 1] + sorted[mid]) / 2;
|
|
51
|
+
}
|
|
52
|
+
return sorted[mid];
|
|
53
|
+
};
|
|
54
|
+
var aggregateValues = function (values, aggregateType) {
|
|
55
|
+
if (values.length === 0) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
switch (aggregateType) {
|
|
59
|
+
case "SUM":
|
|
60
|
+
return values.reduce(function (total, value) { return total + value; }, 0);
|
|
61
|
+
case "AVERAGE": {
|
|
62
|
+
var sum = values.reduce(function (total, value) { return total + value; }, 0);
|
|
63
|
+
return sum / values.length;
|
|
64
|
+
}
|
|
65
|
+
case "COUNT":
|
|
66
|
+
return values.length;
|
|
67
|
+
case "MAX":
|
|
68
|
+
return Math.max.apply(Math, tslib_1.__spreadArray([], tslib_1.__read(values), false));
|
|
69
|
+
case "MIN":
|
|
70
|
+
return Math.min.apply(Math, tslib_1.__spreadArray([], tslib_1.__read(values), false));
|
|
71
|
+
case "MEDIAN":
|
|
72
|
+
return median(values);
|
|
73
|
+
default:
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
var sanitizeDomainValues = function (values) { return values.map(toDomainLabel); };
|
|
78
|
+
exports.sanitizeDomainValues = sanitizeDomainValues;
|
|
79
|
+
var shouldAggregateSeries = function (series) {
|
|
80
|
+
if (!series || series.length === 0) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return series.every(function (item) { return !!item.aggregateType; });
|
|
84
|
+
};
|
|
85
|
+
exports.shouldAggregateSeries = shouldAggregateSeries;
|
|
86
|
+
var getDomainValuesForAxis = function (domainValues, aggregate) { return (aggregate ? uniqueDomains(domainValues) : domainValues); };
|
|
87
|
+
exports.getDomainValuesForAxis = getDomainValuesForAxis;
|
|
88
|
+
var aggregateSeriesByDomain = function (rawDomainValues, seriesValues, aggregateType, orderedDomainValues) {
|
|
89
|
+
var e_2, _a;
|
|
90
|
+
var grouped = new Map();
|
|
91
|
+
try {
|
|
92
|
+
for (var orderedDomainValues_1 = tslib_1.__values(orderedDomainValues), orderedDomainValues_1_1 = orderedDomainValues_1.next(); !orderedDomainValues_1_1.done; orderedDomainValues_1_1 = orderedDomainValues_1.next()) {
|
|
93
|
+
var domain = orderedDomainValues_1_1.value;
|
|
94
|
+
grouped.set(domain, []);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
98
|
+
finally {
|
|
99
|
+
try {
|
|
100
|
+
if (orderedDomainValues_1_1 && !orderedDomainValues_1_1.done && (_a = orderedDomainValues_1.return)) _a.call(orderedDomainValues_1);
|
|
101
|
+
}
|
|
102
|
+
finally { if (e_2) throw e_2.error; }
|
|
103
|
+
}
|
|
104
|
+
rawDomainValues.forEach(function (domainValue, index) {
|
|
105
|
+
var currentGroup = grouped.get(domainValue);
|
|
106
|
+
if (!currentGroup) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (aggregateType === "COUNT") {
|
|
110
|
+
var source = seriesValues[index];
|
|
111
|
+
if (source !== undefined && source !== null && source !== "") {
|
|
112
|
+
currentGroup.push(1);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
var numericValue = toNumericValue(seriesValues[index]);
|
|
117
|
+
if (numericValue !== undefined) {
|
|
118
|
+
currentGroup.push(numericValue);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return orderedDomainValues.map(function (domain) {
|
|
122
|
+
var _a;
|
|
123
|
+
var values = (_a = grouped.get(domain)) !== null && _a !== void 0 ? _a : [];
|
|
124
|
+
return aggregateValues(values, aggregateType);
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
exports.aggregateSeriesByDomain = aggregateSeriesByDomain;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bar/column layout mapping — Excel `<c:overlap>` / `<c:gapWidth>` to
|
|
3
|
+
* echarts `barGap` / `barCategoryGap`.
|
|
4
|
+
*
|
|
5
|
+
* Excel semantics:
|
|
6
|
+
* - `overlap` (-100..100): how much adjacent bars *within* a category
|
|
7
|
+
* cluster overlap, as a percentage of one bar's width. 100 = bars
|
|
8
|
+
* fully stacked on the same X slot, 0 = side-by-side touching,
|
|
9
|
+
* -100 = a full bar-width gap between them.
|
|
10
|
+
* - `gapWidth` (0..500): the gap *between* category clusters, as a
|
|
11
|
+
* percentage of one bar's width. Excel default is 150.
|
|
12
|
+
*
|
|
13
|
+
* echarts semantics:
|
|
14
|
+
* - `barGap` ("<p>%"): gap between bars of different series in the same
|
|
15
|
+
* category, as a percentage of the bar width. Negative values overlap
|
|
16
|
+
* ("-100%" = fully overlapped).
|
|
17
|
+
* - `barCategoryGap` ("<p>%"): the gap reserved for each category slot,
|
|
18
|
+
* as a percentage of the *band width* (the whole category slot), i.e.
|
|
19
|
+
* `barWidth = (band - categoryGap) / (n + (n - 1) * barGapPercent)`.
|
|
20
|
+
*/
|
|
21
|
+
type MaybeNumber = number | null | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Map Excel series overlap (-100..100) to an echarts `barGap`
|
|
24
|
+
* percentage string.
|
|
25
|
+
*
|
|
26
|
+
* Both express the same quantity in bar-width units with opposite
|
|
27
|
+
* sign conventions (Excel measures overlap, echarts measures gap), so
|
|
28
|
+
* the mapping is a negation:
|
|
29
|
+
* overlap 100 → barGap "-100%" (fully overlapped)
|
|
30
|
+
* overlap 0 → barGap "0%" (touching)
|
|
31
|
+
* overlap -100 → barGap "100%" (one bar-width gap)
|
|
32
|
+
*
|
|
33
|
+
* Returns undefined when overlap is unset so echarts keeps its own
|
|
34
|
+
* default ("30%").
|
|
35
|
+
*/
|
|
36
|
+
export declare const overlapToBarGap: (overlap?: MaybeNumber) => string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Map Excel `gapWidth` (0..500, % of bar width) to an echarts
|
|
39
|
+
* `barCategoryGap` percentage string (% of the category band width).
|
|
40
|
+
*
|
|
41
|
+
* Derivation — measure the whole band in bar-width units:
|
|
42
|
+
* bars + in-cluster gaps: n - (n - 1) * overlap / 100
|
|
43
|
+
* category gap: gapWidth / 100
|
|
44
|
+
* so the gap's share of the band is
|
|
45
|
+
* gapWidth / (100 * n - (n - 1) * overlap + gapWidth)
|
|
46
|
+
* e.g. one series with the Excel default gapWidth=150 → 150/250 = "60%".
|
|
47
|
+
*
|
|
48
|
+
* `seriesCount` is the number of side-by-side bars per category (1 for
|
|
49
|
+
* stacked charts, where all series share one slot). Returns undefined
|
|
50
|
+
* when gapWidth is unset so echarts keeps its default ("20%").
|
|
51
|
+
*/
|
|
52
|
+
export declare const gapWidthToBarCategoryGap: (gapWidth?: MaybeNumber, options?: {
|
|
53
|
+
seriesCount?: number;
|
|
54
|
+
overlap?: MaybeNumber;
|
|
55
|
+
}) => string | undefined;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=bar-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bar-layout.d.ts","sourceRoot":"","sources":["../../../utils/bar-layout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,KAAK,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAQ7C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU,WAAW,KAAG,MAAM,GAAG,SAGhE,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,wBAAwB,GACnC,WAAW,WAAW,EACtB,UAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAO,KAC5D,MAAM,GAAG,SAWX,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bar/column layout mapping — Excel `<c:overlap>` / `<c:gapWidth>` to
|
|
4
|
+
* echarts `barGap` / `barCategoryGap`.
|
|
5
|
+
*
|
|
6
|
+
* Excel semantics:
|
|
7
|
+
* - `overlap` (-100..100): how much adjacent bars *within* a category
|
|
8
|
+
* cluster overlap, as a percentage of one bar's width. 100 = bars
|
|
9
|
+
* fully stacked on the same X slot, 0 = side-by-side touching,
|
|
10
|
+
* -100 = a full bar-width gap between them.
|
|
11
|
+
* - `gapWidth` (0..500): the gap *between* category clusters, as a
|
|
12
|
+
* percentage of one bar's width. Excel default is 150.
|
|
13
|
+
*
|
|
14
|
+
* echarts semantics:
|
|
15
|
+
* - `barGap` ("<p>%"): gap between bars of different series in the same
|
|
16
|
+
* category, as a percentage of the bar width. Negative values overlap
|
|
17
|
+
* ("-100%" = fully overlapped).
|
|
18
|
+
* - `barCategoryGap` ("<p>%"): the gap reserved for each category slot,
|
|
19
|
+
* as a percentage of the *band width* (the whole category slot), i.e.
|
|
20
|
+
* `barWidth = (band - categoryGap) / (n + (n - 1) * barGapPercent)`.
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.gapWidthToBarCategoryGap = exports.overlapToBarGap = void 0;
|
|
24
|
+
var clamp = function (value, min, max) {
|
|
25
|
+
return Math.max(min, Math.min(max, value));
|
|
26
|
+
};
|
|
27
|
+
var isFiniteNumber = function (value) {
|
|
28
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Map Excel series overlap (-100..100) to an echarts `barGap`
|
|
32
|
+
* percentage string.
|
|
33
|
+
*
|
|
34
|
+
* Both express the same quantity in bar-width units with opposite
|
|
35
|
+
* sign conventions (Excel measures overlap, echarts measures gap), so
|
|
36
|
+
* the mapping is a negation:
|
|
37
|
+
* overlap 100 → barGap "-100%" (fully overlapped)
|
|
38
|
+
* overlap 0 → barGap "0%" (touching)
|
|
39
|
+
* overlap -100 → barGap "100%" (one bar-width gap)
|
|
40
|
+
*
|
|
41
|
+
* Returns undefined when overlap is unset so echarts keeps its own
|
|
42
|
+
* default ("30%").
|
|
43
|
+
*/
|
|
44
|
+
var overlapToBarGap = function (overlap) {
|
|
45
|
+
if (!isFiniteNumber(overlap))
|
|
46
|
+
return undefined;
|
|
47
|
+
return "".concat(-clamp(overlap, -100, 100), "%");
|
|
48
|
+
};
|
|
49
|
+
exports.overlapToBarGap = overlapToBarGap;
|
|
50
|
+
/**
|
|
51
|
+
* Map Excel `gapWidth` (0..500, % of bar width) to an echarts
|
|
52
|
+
* `barCategoryGap` percentage string (% of the category band width).
|
|
53
|
+
*
|
|
54
|
+
* Derivation — measure the whole band in bar-width units:
|
|
55
|
+
* bars + in-cluster gaps: n - (n - 1) * overlap / 100
|
|
56
|
+
* category gap: gapWidth / 100
|
|
57
|
+
* so the gap's share of the band is
|
|
58
|
+
* gapWidth / (100 * n - (n - 1) * overlap + gapWidth)
|
|
59
|
+
* e.g. one series with the Excel default gapWidth=150 → 150/250 = "60%".
|
|
60
|
+
*
|
|
61
|
+
* `seriesCount` is the number of side-by-side bars per category (1 for
|
|
62
|
+
* stacked charts, where all series share one slot). Returns undefined
|
|
63
|
+
* when gapWidth is unset so echarts keeps its default ("20%").
|
|
64
|
+
*/
|
|
65
|
+
var gapWidthToBarCategoryGap = function (gapWidth, options) {
|
|
66
|
+
var _a;
|
|
67
|
+
if (options === void 0) { options = {}; }
|
|
68
|
+
if (!isFiniteNumber(gapWidth))
|
|
69
|
+
return undefined;
|
|
70
|
+
var gap = clamp(gapWidth, 0, 500);
|
|
71
|
+
var seriesCount = Math.max(1, Math.floor((_a = options.seriesCount) !== null && _a !== void 0 ? _a : 1));
|
|
72
|
+
var overlap = isFiniteNumber(options.overlap)
|
|
73
|
+
? clamp(options.overlap, -100, 100)
|
|
74
|
+
: 0;
|
|
75
|
+
var band = 100 * seriesCount - (seriesCount - 1) * overlap + gap;
|
|
76
|
+
if (band <= 0)
|
|
77
|
+
return undefined;
|
|
78
|
+
var percent = (100 * gap) / band;
|
|
79
|
+
return "".concat(Math.round(percent * 100) / 100, "%");
|
|
80
|
+
};
|
|
81
|
+
exports.gapWidthToBarCategoryGap = gapWidthToBarCategoryGap;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Box-and-whisker statistics shared by chart renderers.
|
|
3
|
+
*
|
|
4
|
+
* Plotly's box trace computes quartiles itself from raw values.
|
|
5
|
+
* Echarts' boxplot series requires pre-computed [min, Q1, median, Q3, max]
|
|
6
|
+
* tuples per box; this helper produces that shape.
|
|
7
|
+
*/
|
|
8
|
+
export type BoxplotStats = [number, number, number, number, number];
|
|
9
|
+
/**
|
|
10
|
+
* Quartile computation method, mirroring Excel's box & whisker
|
|
11
|
+
* "quartile calculation" option:
|
|
12
|
+
* - "inclusive" — QUARTILE.INC: linear interpolation over positions
|
|
13
|
+
* `(n - 1) * q` (median included in both halves).
|
|
14
|
+
* - "exclusive" — QUARTILE.EXC: linear interpolation over positions
|
|
15
|
+
* `(n + 1) * q` (median excluded), Tukey-style hinges.
|
|
16
|
+
*/
|
|
17
|
+
export type QuartileMethod = "inclusive" | "exclusive";
|
|
18
|
+
/**
|
|
19
|
+
* QUARTILE.INC — linear interpolation at position `(n - 1) * q`
|
|
20
|
+
* (0-indexed). Identical to the interpolation echarts' built-in
|
|
21
|
+
* boxplot transform uses.
|
|
22
|
+
*/
|
|
23
|
+
export declare const quartileInc: (sorted: number[], q: number) => number;
|
|
24
|
+
/**
|
|
25
|
+
* QUARTILE.EXC — linear interpolation at 1-indexed position
|
|
26
|
+
* `(n + 1) * q`. Excel returns #NUM! when the position falls outside
|
|
27
|
+
* `[1, n]` (tiny samples); for charting we clamp to the nearest order
|
|
28
|
+
* statistic instead so every box still renders.
|
|
29
|
+
*/
|
|
30
|
+
export declare const quartileExc: (sorted: number[], q: number) => number;
|
|
31
|
+
/**
|
|
32
|
+
* Full box-and-whisker summary. Quartiles follow the requested method
|
|
33
|
+
* ("inclusive" when omitted — the same interpolation
|
|
34
|
+
* `computeBoxplotStats` has always used). Outliers are points beyond
|
|
35
|
+
* the Tukey fences `Q1 - 1.5×IQR` / `Q3 + 1.5×IQR`; the whisker ends
|
|
36
|
+
* are the most extreme data points still inside the fences (Excel's
|
|
37
|
+
* behavior when "show outlier points" is on).
|
|
38
|
+
*/
|
|
39
|
+
export type BoxplotSummary = {
|
|
40
|
+
min: number;
|
|
41
|
+
q1: number;
|
|
42
|
+
median: number;
|
|
43
|
+
q3: number;
|
|
44
|
+
max: number;
|
|
45
|
+
mean: number;
|
|
46
|
+
/** Smallest data point >= Q1 - 1.5×IQR. */
|
|
47
|
+
lowerWhisker: number;
|
|
48
|
+
/** Largest data point <= Q3 + 1.5×IQR. */
|
|
49
|
+
upperWhisker: number;
|
|
50
|
+
/** Data points outside the 1.5×IQR fences, ascending. */
|
|
51
|
+
outliers: number[];
|
|
52
|
+
};
|
|
53
|
+
export declare const computeBoxplotSummary: (values: (number | null | undefined)[], options?: {
|
|
54
|
+
quartileMethod?: QuartileMethod | null;
|
|
55
|
+
}) => BoxplotSummary | null;
|
|
56
|
+
/**
|
|
57
|
+
* Compute [min, Q1, median, Q3, max] using linear interpolation between
|
|
58
|
+
* order statistics — matches echarts' built-in `dataset.transform: 'boxplot'`
|
|
59
|
+
* behavior.
|
|
60
|
+
*/
|
|
61
|
+
export declare const computeBoxplotStats: (values: (number | null | undefined)[]) => BoxplotStats | null;
|
|
62
|
+
//# sourceMappingURL=boxplot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boxplot.d.ts","sourceRoot":"","sources":["../../../utils/boxplot.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,WAAW,CAAC;AAUvD;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,EAAE,GAAG,MAAM,KAAG,MACrC,CAAC;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,EAAE,GAAG,MAAM,KAAG,MAQzD,CAAC;AAeF;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EACrC,UAAU;IAAE,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,KACnD,cAAc,GAAG,IA0BnB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,KACpC,YAAY,GAAG,IAejB,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Box-and-whisker statistics shared by chart renderers.
|
|
4
|
+
*
|
|
5
|
+
* Plotly's box trace computes quartiles itself from raw values.
|
|
6
|
+
* Echarts' boxplot series requires pre-computed [min, Q1, median, Q3, max]
|
|
7
|
+
* tuples per box; this helper produces that shape.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.computeBoxplotStats = exports.computeBoxplotSummary = exports.quartileExc = exports.quartileInc = void 0;
|
|
11
|
+
var quantile = function (sorted, q) {
|
|
12
|
+
var idx = (sorted.length - 1) * q;
|
|
13
|
+
var lo = Math.floor(idx);
|
|
14
|
+
var hi = Math.ceil(idx);
|
|
15
|
+
if (lo === hi)
|
|
16
|
+
return sorted[lo];
|
|
17
|
+
return sorted[lo] + (sorted[hi] - sorted[lo]) * (idx - lo);
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* QUARTILE.INC — linear interpolation at position `(n - 1) * q`
|
|
21
|
+
* (0-indexed). Identical to the interpolation echarts' built-in
|
|
22
|
+
* boxplot transform uses.
|
|
23
|
+
*/
|
|
24
|
+
var quartileInc = function (sorted, q) {
|
|
25
|
+
return quantile(sorted, q);
|
|
26
|
+
};
|
|
27
|
+
exports.quartileInc = quartileInc;
|
|
28
|
+
/**
|
|
29
|
+
* QUARTILE.EXC — linear interpolation at 1-indexed position
|
|
30
|
+
* `(n + 1) * q`. Excel returns #NUM! when the position falls outside
|
|
31
|
+
* `[1, n]` (tiny samples); for charting we clamp to the nearest order
|
|
32
|
+
* statistic instead so every box still renders.
|
|
33
|
+
*/
|
|
34
|
+
var quartileExc = function (sorted, q) {
|
|
35
|
+
var n = sorted.length;
|
|
36
|
+
var pos = (n + 1) * q; // 1-indexed
|
|
37
|
+
if (pos <= 1)
|
|
38
|
+
return sorted[0];
|
|
39
|
+
if (pos >= n)
|
|
40
|
+
return sorted[n - 1];
|
|
41
|
+
var lo = Math.floor(pos);
|
|
42
|
+
var frac = pos - lo;
|
|
43
|
+
return sorted[lo - 1] + (sorted[lo] - sorted[lo - 1]) * frac;
|
|
44
|
+
};
|
|
45
|
+
exports.quartileExc = quartileExc;
|
|
46
|
+
var quartile = function (sorted, q, method) {
|
|
47
|
+
return method === "exclusive" ? (0, exports.quartileExc)(sorted, q) : (0, exports.quartileInc)(sorted, q);
|
|
48
|
+
};
|
|
49
|
+
var toSortedNumeric = function (values) {
|
|
50
|
+
return values
|
|
51
|
+
.filter(function (v) { return typeof v === "number" && Number.isFinite(v); })
|
|
52
|
+
.slice()
|
|
53
|
+
.sort(function (a, b) { return a - b; });
|
|
54
|
+
};
|
|
55
|
+
var computeBoxplotSummary = function (values, options) {
|
|
56
|
+
var _a;
|
|
57
|
+
var numeric = toSortedNumeric(values);
|
|
58
|
+
if (numeric.length === 0)
|
|
59
|
+
return null;
|
|
60
|
+
var method = (_a = options === null || options === void 0 ? void 0 : options.quartileMethod) !== null && _a !== void 0 ? _a : "inclusive";
|
|
61
|
+
var q1 = quartile(numeric, 0.25, method);
|
|
62
|
+
var median = quartile(numeric, 0.5, method);
|
|
63
|
+
var q3 = quartile(numeric, 0.75, method);
|
|
64
|
+
var iqr = q3 - q1;
|
|
65
|
+
var lowerFence = q1 - 1.5 * iqr;
|
|
66
|
+
var upperFence = q3 + 1.5 * iqr;
|
|
67
|
+
var inliers = numeric.filter(function (v) { return v >= lowerFence && v <= upperFence; });
|
|
68
|
+
var outliers = numeric.filter(function (v) { return v < lowerFence || v > upperFence; });
|
|
69
|
+
var mean = numeric.reduce(function (sum, v) { return sum + v; }, 0) / numeric.length;
|
|
70
|
+
return {
|
|
71
|
+
min: numeric[0],
|
|
72
|
+
q1: q1,
|
|
73
|
+
median: median,
|
|
74
|
+
q3: q3,
|
|
75
|
+
max: numeric[numeric.length - 1],
|
|
76
|
+
mean: mean,
|
|
77
|
+
// Degenerate fences (all points outliers) can't happen — Q1/Q3 are
|
|
78
|
+
// always inside [min, max] — so inliers is never empty.
|
|
79
|
+
lowerWhisker: inliers[0],
|
|
80
|
+
upperWhisker: inliers[inliers.length - 1],
|
|
81
|
+
outliers: outliers,
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
exports.computeBoxplotSummary = computeBoxplotSummary;
|
|
85
|
+
/**
|
|
86
|
+
* Compute [min, Q1, median, Q3, max] using linear interpolation between
|
|
87
|
+
* order statistics — matches echarts' built-in `dataset.transform: 'boxplot'`
|
|
88
|
+
* behavior.
|
|
89
|
+
*/
|
|
90
|
+
var computeBoxplotStats = function (values) {
|
|
91
|
+
var numeric = values
|
|
92
|
+
.filter(function (v) { return typeof v === "number" && Number.isFinite(v); })
|
|
93
|
+
.slice()
|
|
94
|
+
.sort(function (a, b) { return a - b; });
|
|
95
|
+
if (numeric.length === 0)
|
|
96
|
+
return null;
|
|
97
|
+
return [
|
|
98
|
+
numeric[0],
|
|
99
|
+
quantile(numeric, 0.25),
|
|
100
|
+
quantile(numeric, 0.5),
|
|
101
|
+
quantile(numeric, 0.75),
|
|
102
|
+
numeric[numeric.length - 1],
|
|
103
|
+
];
|
|
104
|
+
};
|
|
105
|
+
exports.computeBoxplotStats = computeBoxplotStats;
|