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:09 UTC

[incubator-echarts] branch feat-bar-race created (now e2dac51)

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

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


      at e2dac51  WIP(bar-racing): sort axis

This branch includes the following new commits:

     new e2dac51  WIP(bar-racing): sort axis

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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


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

Posted by ov...@apache.org.
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