You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by GitBox <gi...@apache.org> on 2022/04/16 07:22:04 UTC

[GitHub] [echarts] jiawulin001 commented on a diff in pull request #16895: fix: all data mapped to one col when zooming in

jiawulin001 commented on code in PR #16895:
URL: https://github.com/apache/echarts/pull/16895#discussion_r851597412


##########
src/scale/helper.ts:
##########
@@ -128,7 +128,12 @@ export function contain(val: number, extent: [number, number]): boolean {
 
 export function normalize(val: number, extent: [number, number]): number {
     if (extent[1] === extent[0]) {
-        return 0.5;
+        if (val !== extent[0]) {

Review Comment:
   My apologies I didn't explain enough in the PR and comment. Let me show you the dataflow and then the strategy would be clear.
   First, we are zooming in to 'b' category and only 'b' at this chart:
   <img width="437" alt="before#16746" src="https://user-images.githubusercontent.com/14244944/163664209-7654625a-2349-41dd-9eea-9531553b9d92.png">
   Then Echarts tries to determine the location of 'a', 'b' and 'c' column in the chart **AFTER ZOOMING**. So the `extent` here is `[1, 1]`:
   https://github.com/apache/echarts/blob/a5257e38ad7776c766879c83854b1faa2771a454/src/coord/Axis.ts#L122-L133
   At line 125, we enter function `normalize` which returns the **relative location** (0~1) of the column according to their location **BEFORE ZOOMING** (which is 0, 1, 2 for 'a', 'b', 'c' respectively):
   https://github.com/apache/echarts/blob/a5257e38ad7776c766879c83854b1faa2771a454/src/scale/helper.ts#L129-L132
   At this moment, remember that `extent` is `[1, 1]`, so no matter what `data` is, function `normalize` returns 0.5, which means all the three columns are located at the middle of the chart after zooming. 
   To solve this, I add a judgement: `if (val !== extent[0])` which checks whether the column is the one we are zooming in at. If it's not, then we return a correct relative location of the column. Here for 'a', 'b', 'c', they are 0, 1, 2 before zooming and then -0.5, 0.5, 1.5 (locate at -50%, 50%, 150%) after zooming. 
   ![before#16746](https://user-images.githubusercontent.com/14244944/163665200-004e2945-c010-4332-a7fe-a22c8504951c.png)
   
   Also, another bug is preventing me to distinguish the three columns. At line 132 we enters function `linearMap`, `subRange` is 0 because r0 = r1 = 320, which result in `return (val - d0) / subDomain * subRange + r0` equaling r0 no matter what `val` is. That means all three columns still locate at 320 (0.5 * 640).
   https://github.com/apache/echarts/blob/a5257e38ad7776c766879c83854b1faa2771a454/src/util/number.ts#L47-L100
   To solve this, I add a check whether `subRange` is 0 and if yes then just return `val * 2 * r0`. When `subRange` is 0, `r0` is exactly half length of the chart, 0.5*640 = 320. So `val * 2 * r0` = val * chartLength would be the absolute location of corresponding relative location.
   
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


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