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-unsubscr...@echarts.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@echarts.apache.org For additional commands, e-mail: commits-h...@echarts.apache.org