You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by ov...@apache.org on 2020/04/24 02:53:10 UTC

[incubator-echarts] 01/01: WIP(bar-racing): sort axis

This is an automated email from the ASF dual-hosted git repository.

ovilia pushed a commit to branch feat-bar-race
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git

commit e2dac51319842f3a7d31aeeaee7b2a7774d09703
Author: Ovilia <zw...@gmail.com>
AuthorDate: Thu Apr 23 17:39:39 2020 +0800

    WIP(bar-racing): sort axis
---
 src/coord/Axis.ts                |  3 ++-
 src/coord/cartesian/AxisModel.ts |  4 +++-
 src/coord/cartesian/Grid.ts      | 41 ++++++++++++++++++++++++++++++++++++++++
 src/scale/Ordinal.ts             | 19 ++++++++++++++++++-
 4 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/src/coord/Axis.ts b/src/coord/Axis.ts
index 0870273..ee92be7 100644
--- a/src/coord/Axis.ts
+++ b/src/coord/Axis.ts
@@ -121,6 +121,7 @@ class Axis {
     dataToCoord(data: ScaleDataValue, clamp?: boolean): number {
         let extent = this._extent;
         const scale = this.scale;
+        // data = (scale instanceof OrdinalScale && typeof data === 'number') ? scale.getSortedDataIndex(data) : data;
         data = scale.normalize(data);
 
         if (this.onBand && scale.type === 'ordinal') {
@@ -178,7 +179,7 @@ class Axis {
         const ticksCoords = map(ticks, function (tickValue) {
             return {
                 coord: this.dataToCoord(tickValue),
-                tickValue: tickValue
+                tickValue: this.scale instanceof OrdinalScale ? this.scale.getSortedDataIndex(tickValue) : tickValue
             };
         }, this);
 
diff --git a/src/coord/cartesian/AxisModel.ts b/src/coord/cartesian/AxisModel.ts
index d8e4aee..d36faec 100644
--- a/src/coord/cartesian/AxisModel.ts
+++ b/src/coord/cartesian/AxisModel.ts
@@ -35,6 +35,7 @@ interface CartesianAxisOption extends AxisBaseOption {
     position?: CartesianAxisPosition;
     // Offset is for multiple axis on the same position.
     offset?: number;
+    sort?: boolean;
 }
 
 class CartesianAxisModel extends ComponentModel<CartesianAxisOption>
@@ -76,7 +77,8 @@ zrUtil.mixin(CartesianAxisModel, AxisModelCommonMixin);
 const extraOption: CartesianAxisOption = {
     // gridIndex: 0,
     // gridId: '',
-    offset: 0
+    offset: 0,
+    sort: false
 };
 
 axisModelCreator<CartesianAxisOption, typeof CartesianAxisModel>('x', CartesianAxisModel, extraOption);
diff --git a/src/coord/cartesian/Grid.ts b/src/coord/cartesian/Grid.ts
index 0b0f2dd..e598e50 100644
--- a/src/coord/cartesian/Grid.ts
+++ b/src/coord/cartesian/Grid.ts
@@ -48,6 +48,7 @@ import {CoordinateSystemMaster} from '../CoordinateSystem';
 import { ScaleDataValue } from '../../util/types';
 import List from '../../data/List';
 import SeriesModel from '../../model/Series';
+import OrdinalScale from '../../scale/Ordinal';
 
 
 type Cartesian2DDimensionName = 'x' | 'y';
@@ -411,6 +412,9 @@ class Grid implements CoordinateSystemMaster {
         each(this._axesList, function (axis) {
             axis.scale.setExtent(Infinity, -Infinity);
         });
+        const sortedDataValue: number[] = [];
+        const sortedDataIndex: number[] = [];
+
         ecModel.eachSeries(function (seriesModel) {
             if (isCartesian2D(seriesModel)) {
                 const axesModels = findAxesModels(seriesModel);
@@ -433,6 +437,11 @@ class Grid implements CoordinateSystemMaster {
                 if (data.type === 'list') {
                     unionExtent(data, xAxis);
                     unionExtent(data, yAxis);
+                    if (!sortedDataIndex.length) {
+                        // Only sort by the first series
+                        sortCategory(data, xAxis, xAxisModel, yAxis);
+                        sortCategory(data, yAxis, yAxisModel, xAxis);
+                    }
                 }
             }
         }, this);
@@ -447,6 +456,38 @@ class Grid implements CoordinateSystemMaster {
                 );
             });
         }
+
+        function sortCategory(
+            data: List,
+            axis: Axis2D,
+            axisModel: CartesianAxisModel,
+            otherAxis: Axis2D
+        ): void {
+            const sort = axisModel.get('sort');
+            if (axis.type === 'category' && sort) {
+                data.each(otherAxis.dim, value => {
+                    for (let i = 0, len = sortedDataValue.length; i < len; ++i) {
+                        if (value > sortedDataValue[i]) {
+                            sortedDataValue.splice(i, 0, value as number);
+
+                            for (let j = 0; j <= len; ++j) {
+                                if (sortedDataIndex[j] >= i) {
+                                    ++sortedDataIndex[j];
+                                }
+                            }
+                            sortedDataIndex.push(i);
+                            console.log(sortedDataValue, sortedDataIndex);
+                            return;
+                        }
+                    }
+                    // Smallest for now, insert at the end
+                    sortedDataValue.push(value as number);
+                    sortedDataIndex.push(sortedDataIndex.length);
+                });
+                console.log(sortedDataValue, sortedDataIndex);
+                (axis.scale as OrdinalScale).setSortedDataIndices(sortedDataIndex);
+            }
+        }
     }
 
     /**
diff --git a/src/scale/Ordinal.ts b/src/scale/Ordinal.ts
index f7057b7..b28b76c 100644
--- a/src/scale/Ordinal.ts
+++ b/src/scale/Ordinal.ts
@@ -39,6 +39,7 @@ class OrdinalScale extends Scale {
     readonly type = 'ordinal';
 
     private _ordinalMeta: OrdinalMeta;
+    private _sortedDataIndices: number[];
 
 
     constructor(setting?: {
@@ -54,6 +55,7 @@ class OrdinalScale extends Scale {
             ordinalMeta = new OrdinalMeta({categories: ordinalMeta});
         }
         this._ordinalMeta = ordinalMeta;
+        this._sortedDataIndices = [];
         this._extent = this.getSetting('extent') || [0, ordinalMeta.categories.length - 1];
     }
 
@@ -74,10 +76,12 @@ class OrdinalScale extends Scale {
      * Normalize given rank or name to linear [0, 1]
      */
     normalize(val: OrdinalRawValue | OrdinalNumber): number {
-        return scaleHelper.normalize(this.parse(val), this._extent);
+        val = this.getSortedDataIndex(this.parse(val));
+        return scaleHelper.normalize(val, this._extent);
     }
 
     scale(val: number): OrdinalNumber {
+        val = this.getSortedDataIndex(val);
         return Math.round(scaleHelper.scale(val, this._extent));
     }
 
@@ -99,6 +103,15 @@ class OrdinalScale extends Scale {
         return;
     }
 
+    getSortedDataIndex(n: OrdinalNumber): OrdinalNumber {
+        if (this._sortedDataIndices.length) {
+            return this._sortedDataIndices[n];
+        }
+        else {
+            return n;
+        }
+    }
+
     /**
      * Get item on rank n
      */
@@ -111,6 +124,10 @@ class OrdinalScale extends Scale {
         }
     }
 
+    setSortedDataIndices(index: number[]): void {
+        this._sortedDataIndices = index;
+    }
+
     count(): number {
         return this._extent[1] - this._extent[0] + 1;
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org