@easyv/charts 1.6.2 → 1.6.4

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.
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports["default"] = void 0;
9
9
 
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
10
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
13
 
12
14
  var _react = require("react");
@@ -36,16 +38,36 @@ var getCount = function getCount(num) {
36
38
 
37
39
  var getNewDomain = function getNewDomain(domain, mode, step) {
38
40
  var extent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
41
+ var numericalRangeModel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "value";
42
+ var percentageExtent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {
43
+ max: 100,
44
+ min: 100
45
+ };
39
46
  var _extent$min = extent.min,
40
- bottom = _extent$min === void 0 ? "" : _extent$min,
47
+ defaultBottom = _extent$min === void 0 ? "" : _extent$min,
41
48
  _extent$max = extent.max,
42
- top = _extent$max === void 0 ? "" : _extent$max;
49
+ defaultTop = _extent$max === void 0 ? "" : _extent$max;
50
+ var _percentageExtent$min = percentageExtent.min,
51
+ defaultPercentageMin = _percentageExtent$min === void 0 ? 100 : _percentageExtent$min,
52
+ _percentageExtent$max = percentageExtent.max,
53
+ defaultPercentageMax = _percentageExtent$max === void 0 ? 100 : _percentageExtent$max;
54
+ var bottom = defaultBottom,
55
+ top = defaultTop;
43
56
  var newDomain = []; //能进入这个函数,说明extent中min和max至少有一个是缺失的,如果max存在,意味着纵轴上限被固定
44
57
 
45
58
  var min = domain[0],
46
59
  max = domain[1];
47
60
  var minCount = Math.pow(10, getCount(min)),
48
- maxCount = Math.pow(10, getCount(max));
61
+ maxCount = Math.pow(10, getCount(max)); //轴标签,范围模式,百分比模式
62
+
63
+ if (numericalRangeModel == "percentage") {
64
+ var _max = defaultPercentageMax === "" ? 100 : defaultPercentageMax;
65
+
66
+ var _min = defaultPercentageMin === "" ? 100 : defaultPercentageMin;
67
+
68
+ bottom = min * _min / 100;
69
+ top = max * _max / 100;
70
+ }
49
71
 
50
72
  switch (mode) {
51
73
  case "count":
@@ -54,7 +76,7 @@ var getNewDomain = function getNewDomain(domain, mode, step) {
54
76
  break;
55
77
 
56
78
  case "step":
57
- if (top != "") {
79
+ if (defaultTop != "") {
58
80
  newDomain = [domain[1], domain[1]];
59
81
 
60
82
  while (newDomain[0] > domain[0]) {
@@ -114,10 +136,14 @@ var _default = function _default(_ref) {
114
136
 
115
137
  var _axes = (0, _react.useMemo)(function () {
116
138
  var tmp = new Map();
117
- var xAxisPositions = [];
139
+ var xAxisPositions = new Set(); //用Set去重,去掉重复的x轴
140
+
118
141
  axes.forEach(function (item) {
119
142
  var _item$config$label = item.config.label,
120
143
  extent = _item$config$label.extent,
144
+ percentageExtent = _item$config$label.percentageExtent,
145
+ _item$config$label$nu = _item$config$label.numericalRangeModel,
146
+ numericalRangeModel = _item$config$label$nu === void 0 ? "value" : _item$config$label$nu,
121
147
  _item$config$label$sh = _item$config$label.showLast,
122
148
  showLast = _item$config$label$sh === void 0 ? false : _item$config$label$sh,
123
149
  _item$config$label$de = _item$config$label.decimal,
@@ -176,7 +202,7 @@ var _default = function _default(_ref) {
176
202
  * @param {*} scales
177
203
  * @param {*} type 轴类型
178
204
  * @param {*} domain 数据的范围
179
- * @param {*} range 屏幕坐标的范围
205
+ * @param {*} 屏幕坐标的范围
180
206
  * @returns
181
207
  */
182
208
 
@@ -339,7 +365,7 @@ var _default = function _default(_ref) {
339
365
  var fixedDomain = extent && extent.min != "" && extent.max != ""; //判断配置项中是否强制了最大最小值,如果已经被强制了,就不计算newDomain
340
366
 
341
367
  if (type !== "ordinal" && !isNaN(domain[1]) && !auto && !fixedDomain) {
342
- newDomain = getNewDomain(domain, mode, _step, extent);
368
+ newDomain = getNewDomain(domain, mode, _step, extent, numericalRangeModel, percentageExtent);
343
369
  }
344
370
 
345
371
  var scaler = scales[type]().domain(newDomain).range(range);
@@ -373,17 +399,17 @@ var _default = function _default(_ref) {
373
399
  if (type == "linear" && config.on) {
374
400
  var zeroPosition = scaler(0);
375
401
 
376
- if (zeroPosition !== range[0] && !isNaN(zeroPosition)) {
402
+ if (!isNaN(zeroPosition)) {
377
403
  if (_direction === "horizontal") {
378
- xAxisPositions.push({
404
+ xAxisPositions.add(JSON.stringify({
379
405
  x: zeroPosition,
380
406
  y: 0
381
- });
407
+ }));
382
408
  } else if (_direction === "vertical") {
383
- xAxisPositions.push({
409
+ xAxisPositions.add(JSON.stringify({
384
410
  x: 0,
385
411
  y: zeroPosition
386
- });
412
+ }));
387
413
  }
388
414
  }
389
415
  }
@@ -433,7 +459,9 @@ var _default = function _default(_ref) {
433
459
  }));
434
460
  }
435
461
  });
436
- tmp.get("x") && (tmp.get("x").positions = xAxisPositions);
462
+ tmp.get("x") && (tmp.get("x").positions = (0, _toConsumableArray2["default"])(xAxisPositions).map(function (d) {
463
+ return JSON.parse(d);
464
+ }));
437
465
  return tmp;
438
466
  }, [axes, controlInfo]);
439
467
 
@@ -122,13 +122,17 @@ var _default = function _default(_ref) {
122
122
  // return d[1].sort((a,b)=>a.x>b.x?1:-1)
123
123
  // });
124
124
  }
125
- } //clipAxisMode如果是auto根据clipDifferenceValue设置clipValue
125
+ } // console.log("nononon", axes);
126
+ //clipAxisMode如果是auto根据clipDifferenceValue设置clipValue
126
127
 
127
128
 
128
129
  return axes.map(function (item) {
129
130
  var axisType = item.axisType,
130
131
  domain = item.domain,
131
- type = item.type;
132
+ type = item.type,
133
+ _item$config$label = item.config.label,
134
+ percentageExtent = _item$config$label.percentageExtent,
135
+ numericalRangeModel = _item$config$label.numericalRangeModel;
132
136
 
133
137
  switch (axisType) {
134
138
  case "x":
@@ -171,13 +175,13 @@ var _default = function _default(_ref) {
171
175
  }
172
176
 
173
177
  return _objectSpread(_objectSpread({}, item), {}, {
174
- domain: domain ? getDomain(y, domain) : y
178
+ domain: domain ? getDomain(y, domain, numericalRangeModel, percentageExtent) : y
175
179
  });
176
180
  }
177
181
 
178
182
  case "z":
179
183
  return _objectSpread(_objectSpread({}, item), {}, {
180
- domain: domain ? getDomain(z, domain) : z
184
+ domain: domain ? getDomain(z, domain, numericalRangeModel, percentageExtent) : z
181
185
  });
182
186
  }
183
187
  });
@@ -192,5 +196,16 @@ var getDomain = function getDomain(_ref2, _ref3) {
192
196
 
193
197
  var min = _ref3.min,
194
198
  max = _ref3.max;
199
+ var numericalRangeModel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "value";
200
+ var percentageExtent = arguments.length > 3 ? arguments[3] : undefined;
201
+
202
+ if (numericalRangeModel == "percentage" && percentageExtent) {
203
+ var _min = percentageExtent.min == "" ? 100 : +percentageExtent.min;
204
+
205
+ var _max = percentageExtent.max == "" ? 100 : +percentageExtent.max;
206
+
207
+ return [min1 * _min / 100, max1 * _max / 100];
208
+ }
209
+
195
210
  return [min !== "" ? +min : min1, max !== "" ? +max : max1];
196
211
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easyv/charts",
3
- "version": "1.6.2",
3
+ "version": "1.6.4",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -14,26 +14,49 @@ const getCount = (num) => {
14
14
  return i;
15
15
  };
16
16
 
17
- const getNewDomain = (domain, mode, step, extent={}) => {
18
- const { min:bottom="", max:top="" } = extent;
17
+ const getNewDomain = (
18
+ domain,
19
+ mode,
20
+ step,
21
+ extent = {},
22
+ numericalRangeModel = "value",
23
+ percentageExtent = { max: 100, min: 100 }
24
+ ) => {
25
+ let { min: defaultBottom = "", max: defaultTop = "" } = extent;
26
+ const { min: defaultPercentageMin = 100, max: defaultPercentageMax = 100 } =
27
+ percentageExtent;
28
+ let bottom = defaultBottom,
29
+ top = defaultTop;
30
+
19
31
  let newDomain = [];
20
32
  //能进入这个函数,说明extent中min和max至少有一个是缺失的,如果max存在,意味着纵轴上限被固定
21
33
  let min = domain[0],
22
34
  max = domain[1];
23
35
  let minCount = Math.pow(10, getCount(min)),
24
36
  maxCount = Math.pow(10, getCount(max));
37
+
38
+ //轴标签,范围模式,百分比模式
39
+ if (numericalRangeModel == "percentage") {
40
+ let _max = defaultPercentageMax === "" ? 100 : defaultPercentageMax;
41
+ let _min = defaultPercentageMin === "" ? 100 : defaultPercentageMin;
42
+ bottom = (min * _min) / 100;
43
+ top = (max * _max) / 100;
44
+ }
45
+
25
46
  switch (mode) {
26
47
  case "count":
27
- newDomain[0] = bottom!=""?bottom:Math.floor(domain[0] / minCount) * minCount;
28
- newDomain[1] = top!=""?top:Math.ceil(domain[1] / maxCount) * maxCount;
48
+ newDomain[0] =
49
+ bottom != "" ? bottom : Math.floor(domain[0] / minCount) * minCount;
50
+ newDomain[1] =
51
+ top != "" ? top : Math.ceil(domain[1] / maxCount) * maxCount;
29
52
  break;
30
53
  case "step":
31
- if(top!=""){
54
+ if (defaultTop != "") {
32
55
  newDomain = [domain[1], domain[1]];
33
56
  while (newDomain[0] > domain[0]) {
34
57
  newDomain[0] -= step;
35
58
  }
36
- }else{
59
+ } else {
37
60
  newDomain = [domain[0], domain[0]];
38
61
  while (newDomain[1] < domain[1]) {
39
62
  newDomain[1] += step;
@@ -70,19 +93,26 @@ const scales = {
70
93
 
71
94
  export default ({
72
95
  axes,
73
- context: { width:chartWidth, height:chartHeight },
74
- controlInfo, //是否为控制图
96
+ context: { width: chartWidth, height: chartHeight },
97
+ controlInfo, //是否为控制图
75
98
  }) => {
76
99
  const { isC, cHeight, cWidth, cPercent } = controlInfo;
77
100
  const width = chartWidth;
78
101
  const height = chartHeight - cHeight;
102
+
79
103
  const _axes = useMemo(() => {
80
104
  const tmp = new Map();
81
- const xAxisPositions = [];
105
+ const xAxisPositions = new Set(); //用Set去重,去掉重复的x轴
82
106
  axes.forEach((item) => {
83
107
  const {
84
108
  config: {
85
- label: { extent, showLast = false, decimal = 0 },
109
+ label: {
110
+ extent,
111
+ percentageExtent,
112
+ numericalRangeModel = "value",
113
+ showLast = false,
114
+ decimal = 0,
115
+ },
86
116
  },
87
117
  type,
88
118
  orientation,
@@ -104,7 +134,7 @@ export default ({
104
134
  bottomClipAxisStep,
105
135
  topClipAxisStep,
106
136
  clipValue,
107
- clipPosition
137
+ clipPosition,
108
138
  } = item;
109
139
  //如果是断轴类型,输出一套完全不同的values
110
140
  /**
@@ -146,7 +176,7 @@ export default ({
146
176
  * @param {*} scales
147
177
  * @param {*} type 轴类型
148
178
  * @param {*} domain 数据的范围
149
- * @param {*} range 屏幕坐标的范围
179
+ * @param {*} 屏幕坐标的范围
150
180
  * @returns
151
181
  */
152
182
  function setScaler(scales, type, domain, range) {
@@ -209,7 +239,10 @@ export default ({
209
239
  break;
210
240
  case "step":
211
241
  let newStep = +step;
212
- newStep = (newDomain[1] - newDomain[0])/newStep>30?Math.ceil((newDomain[1] - newDomain[0])/30):newStep;
242
+ newStep =
243
+ (newDomain[1] - newDomain[0]) / newStep > 30
244
+ ? Math.ceil((newDomain[1] - newDomain[0]) / 30)
245
+ : newStep;
213
246
  _ticks = getYTicksByStep(newDomain[1], newDomain[0], newStep);
214
247
  break;
215
248
  }
@@ -333,32 +366,40 @@ export default ({
333
366
  });
334
367
  } else {
335
368
  //计算真正需要的tickCount,如果domain区间太小,不能完全按照count来,需要减少count数
336
- const tickCount = type == "ordinal" ? _count : getTickCount(domain, _count, decimal);
337
- const { start, end, direction, _paddingOuter, length } = getChartsConfig(orientation, width, height, paddingOuter);
369
+ const tickCount =
370
+ type == "ordinal" ? _count : getTickCount(domain, _count, decimal);
371
+ const { start, end, direction, _paddingOuter, length } =
372
+ getChartsConfig(orientation, width, height, paddingOuter);
338
373
  let range =
339
374
  direction === "horizontal"
340
375
  ? [start, end]
341
376
  : direction === "vertical"
342
377
  ? [end, start]
343
378
  : [0, 0];
344
- if(reverse)range = [range[1],range[0]];
379
+ if (reverse) range = [range[1], range[0]];
345
380
  let newDomain = domain;
346
- const fixedDomain = extent && extent.min!="" && extent.max!=""; //判断配置项中是否强制了最大最小值,如果已经被强制了,就不计算newDomain
381
+ const fixedDomain = extent && extent.min != "" && extent.max != ""; //判断配置项中是否强制了最大最小值,如果已经被强制了,就不计算newDomain
347
382
  if (type !== "ordinal" && !isNaN(domain[1]) && !auto && !fixedDomain) {
348
- newDomain = getNewDomain(domain, mode, _step, extent);
383
+ newDomain = getNewDomain(
384
+ domain,
385
+ mode,
386
+ _step,
387
+ extent,
388
+ numericalRangeModel,
389
+ percentageExtent
390
+ );
349
391
  }
350
392
  let scaler = scales[type]().domain(newDomain).range(range);
351
-
352
393
  scaler.type = type;
353
394
  if (type !== "ordinal") scaler.clamp(true);
354
-
395
+
355
396
  const allTicks = ticks
356
397
  ? ticks
357
398
  : scaler.ticks
358
399
  ? scaler.ticks(tickCount)
359
400
  : scaler.domain();
360
401
  let _ticks = allTicks;
361
-
402
+
362
403
  if (type === "ordinal") {
363
404
  if (carousel === false || isC) {
364
405
  _ticks = getTicksOfAxis(_ticks, +tickCount, showLast);
@@ -371,7 +412,10 @@ export default ({
371
412
  break;
372
413
  case "step":
373
414
  let newStep = +_step;
374
- newStep = (newDomain[1] - newDomain[0])/newStep>30?Math.ceil((newDomain[1] - newDomain[0])/30):newStep;
415
+ newStep =
416
+ (newDomain[1] - newDomain[0]) / newStep > 30
417
+ ? Math.ceil((newDomain[1] - newDomain[0]) / 30)
418
+ : newStep;
375
419
  _ticks = getYTicksByStep(newDomain[1], newDomain[0], newStep);
376
420
  break;
377
421
  }
@@ -380,38 +424,47 @@ export default ({
380
424
  const lengthWithoutPaddingOuter = length - _paddingOuter;
381
425
  if (type == "linear" && config.on) {
382
426
  const zeroPosition = scaler(0);
383
- if (zeroPosition !== range[0] && !isNaN(zeroPosition)) {
427
+ if (!isNaN(zeroPosition)) {
384
428
  if (direction === "horizontal") {
385
- xAxisPositions.push({
429
+ xAxisPositions.add(JSON.stringify({
386
430
  x: zeroPosition,
387
431
  y: 0,
388
- });
432
+ }));
389
433
  } else if (direction === "vertical") {
390
- xAxisPositions.push({
434
+ xAxisPositions.add(JSON.stringify({
391
435
  x: 0,
392
436
  y: zeroPosition,
393
- });
437
+ }));
394
438
  }
395
439
  }
396
440
  }
397
441
  let step = lengthWithoutPaddingOuter / allTicks.length;
398
442
  const controlCfg = {
399
- controlStep:0,
400
- controlDragScaler:null
401
- }
402
- if(isC){
443
+ controlStep: 0,
444
+ controlDragScaler: null,
445
+ };
446
+ if (isC) {
403
447
  controlCfg.controlStep = step / cPercent;
404
- controlCfg.controlDragScaler = scaler.copy().range([start/cPercent, end/cPercent]);
405
- const { start:start_, end:end_, direction:direction_, _paddingOuter:outer, length:len } = getChartsConfig(orientation, cWidth, height, paddingOuter);
406
- let range = direction_ === "horizontal"
407
- ? [start_, end_]
408
- : direction_ === "vertical"
409
- ? [end_, start_]
410
- : [0, 0];
448
+ controlCfg.controlDragScaler = scaler
449
+ .copy()
450
+ .range([start / cPercent, end / cPercent]);
451
+ const {
452
+ start: start_,
453
+ end: end_,
454
+ direction: direction_,
455
+ _paddingOuter: outer,
456
+ length: len,
457
+ } = getChartsConfig(orientation, cWidth, height, paddingOuter);
458
+ let range =
459
+ direction_ === "horizontal"
460
+ ? [start_, end_]
461
+ : direction_ === "vertical"
462
+ ? [end_, start_]
463
+ : [0, 0];
411
464
  scaler = scales[type]().domain(newDomain).range(range);
412
465
  scaler.type = type;
413
466
  const controlOuter = len - outer;
414
- step = controlOuter/allTicks.length;
467
+ step = controlOuter / allTicks.length;
415
468
  }
416
469
  tmp.set(axisType, {
417
470
  ...item,
@@ -433,7 +486,7 @@ export default ({
433
486
  });
434
487
  }
435
488
  });
436
- tmp.get("x") && (tmp.get("x").positions = xAxisPositions);
489
+ tmp.get("x") && (tmp.get("x").positions = [...xAxisPositions].map(d=>JSON.parse(d)));
437
490
  return tmp;
438
491
  }, [axes, controlInfo]);
439
492
  return _axes;
@@ -10,13 +10,17 @@ import {
10
10
 
11
11
  //扩张系数,用于扩大数据的最大最小值范围,达到图表尽量居中显示的效果
12
12
  const extentRatio = 0;
13
- const extentRange = (value, type)=>{
14
- if(value>=0){
15
- return type=="min"?value*(1-extentRatio):value*(1+extentRatio);
16
- }else{
17
- return type=="min"?value*(1+extentRatio):value*(1-extentRatio);
13
+ const extentRange = (value, type) => {
14
+ if (value >= 0) {
15
+ return type == "min"
16
+ ? value * (1 - extentRatio)
17
+ : value * (1 + extentRatio);
18
+ } else {
19
+ return type == "min"
20
+ ? value * (1 + extentRatio)
21
+ : value * (1 - extentRatio);
18
22
  }
19
- }
23
+ };
20
24
  const stackData = (data, series) => {
21
25
  const dataMap = group(data, (d) => d.x);
22
26
  const stacks = getStacks(series);
@@ -48,7 +52,10 @@ const stackData = (data, series) => {
48
52
  max = Math.max(...arr, max);
49
53
  });
50
54
  dataMap.clear();
51
- return [extentRange(min || 0, "min"), extentRange(max==undefined?(min || 0) + 100:max, "max")];
55
+ return [
56
+ extentRange(min || 0, "min"),
57
+ extentRange(max == undefined ? (min || 0) + 100 : max, "max"),
58
+ ];
52
59
  };
53
60
 
54
61
  /**
@@ -68,20 +75,35 @@ export default ({ axes, series, data }) => {
68
75
  const x = useMemo(() => [...group(data, (d) => d.x).keys()], [data]);
69
76
  const y = stackData(dataY, _series.y);
70
77
  const z = stackData(dataZ, _series.z);
71
- const xAxis = axes.find(d=>d.axisType=="x");
72
- if(xAxis){
73
- const { config:{ label:{ autoSort, format:{ type } } } } = xAxis;
74
- if(type=="date" && autoSort){
75
- x.sort((a,b)=>a>b?1:-1);
78
+ const xAxis = axes.find((d) => d.axisType == "x");
79
+ if (xAxis) {
80
+ const {
81
+ config: {
82
+ label: {
83
+ autoSort,
84
+ format: { type },
85
+ },
86
+ },
87
+ } = xAxis;
88
+ if (type == "date" && autoSort) {
89
+ x.sort((a, b) => (a > b ? 1 : -1));
76
90
  // const groupBySeries = group(data, (d) => d.s);
77
91
  // data=[...groupBySeries].flatMap(d=>{
78
92
  // return d[1].sort((a,b)=>a.x>b.x?1:-1)
79
93
  // });
80
94
  }
81
95
  }
96
+ // console.log("nononon", axes);
82
97
  //clipAxisMode如果是auto根据clipDifferenceValue设置clipValue
83
98
  return axes.map((item) => {
84
- const { axisType, domain, type } = item;
99
+ const {
100
+ axisType,
101
+ domain,
102
+ type,
103
+ config: {
104
+ label: { percentageExtent, numericalRangeModel },
105
+ },
106
+ } = item;
85
107
  switch (axisType) {
86
108
  case "x":
87
109
  return {
@@ -116,19 +138,33 @@ export default ({ axes, series, data }) => {
116
138
  }
117
139
  return {
118
140
  ...item,
119
- domain: domain ? getDomain(y, domain) : y,
141
+ domain: domain
142
+ ? getDomain(y, domain, numericalRangeModel, percentageExtent)
143
+ : y,
120
144
  };
121
145
  }
122
146
 
123
147
  case "z":
124
148
  return {
125
149
  ...item,
126
- domain: domain ? getDomain(z, domain) : z,
150
+ domain: domain
151
+ ? getDomain(z, domain, numericalRangeModel, percentageExtent)
152
+ : z,
127
153
  };
128
154
  }
129
155
  });
130
156
  };
131
157
 
132
- const getDomain = ([min1, max1], { min, max }) => {
158
+ const getDomain = (
159
+ [min1, max1],
160
+ { min, max },
161
+ numericalRangeModel = "value",
162
+ percentageExtent
163
+ ) => {
164
+ if (numericalRangeModel == "percentage" && percentageExtent) {
165
+ const _min = percentageExtent.min == "" ? 100 : +percentageExtent.min;
166
+ const _max = percentageExtent.max == "" ? 100 : +percentageExtent.max;
167
+ return [(min1 * _min) / 100, (max1 * _max) / 100];
168
+ }
133
169
  return [min !== "" ? +min : min1, max !== "" ? +max : max1];
134
170
  };