From be07afeb69701980e0d1eac18bd803d74f5c4f34 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Sat, 23 May 2026 22:16:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`Axis`=E7=9A=84`inverse`?= =?UTF-8?q?=E6=B2=A1=E8=83=BD=E6=AD=A3=E7=A1=AE=E5=8F=8D=E8=BD=AC=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation~/zh/changelog.md | 3 ++- Runtime/Component/Axis/AxisHandler.cs | 13 +++++++++-- Runtime/Component/DataZoom/DataZoom.cs | 23 +++++++++++++++++-- Runtime/Component/DataZoom/DataZoomHandler.cs | 2 +- Runtime/Component/Tooltip/TooltipHandler.cs | 20 ++++++++++------ 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index 3810a760..94351edc 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -81,7 +81,8 @@ slug: /changelog ## master -* (2026.05.22) 增加`LabelStyle`的`showCondition`,`showFilter`,`showThreshold`可控制`label`显示和隐藏 +* (2026.05.23) 修复`Axis`的`inverse`没能正确反转的问题 +* (2026.05.23) 增加`LabelStyle`的`showCondition`,`showFilter`,`showThreshold`可控制`label`显示和隐藏 * (2026.05.22) 增加`LabelStyle`的`minGap`可避免`label`过于密集 * (2026.05.17) 修复`DataZoom`点击时指示区域不准的问题 * (2026.05.17) 增加`Legend`的`Width`和`Height`可设置固定宽高 diff --git a/Runtime/Component/Axis/AxisHandler.cs b/Runtime/Component/Axis/AxisHandler.cs index 2db074b4..540dbc49 100644 --- a/Runtime/Component/Axis/AxisHandler.cs +++ b/Runtime/Component/Axis/AxisHandler.cs @@ -126,6 +126,8 @@ namespace XCharts var yValue = yRate * (chart.pointerPos.y - grid.context.y - axis.context.offset); if (axis.context.minValue > 0) yValue += axis.context.minValue; + if (axis.inverse) + yValue = -yValue; var labelX = axis.GetLabelObjectPosition(0).x; axis.context.pointerValue = yValue; @@ -154,6 +156,8 @@ namespace XCharts xValue = xRate * (chart.pointerPos.x - grid.context.x - axis.context.offset); if (axis.context.minValue > 0) xValue += axis.context.minValue; + if (axis.inverse) + xValue = -xValue; } var labelY = axis.GetLabelObjectPosition(0).y; axis.context.pointerValue = xValue; @@ -188,15 +192,20 @@ namespace XCharts double tempMinValue; double tempMaxValue; axis.context.needAnimation = Application.isPlaying && axis.animation.show; + if (axis.inverse != axis.context.lastCheckInverse) + { + foreach (var serie in chart.series) + serie.context.InvalidateMinMaxCache(); + } chart.GetSeriesMinMaxValue(axis, axisIndex, out tempMinValue, out tempMaxValue); var dataZoom = chart.GetDataZoomOfAxis(axis); if (dataZoom != null && dataZoom.enable) { if (axis is XAxis) - dataZoom.SetXAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue); + dataZoom.SetXAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue, axis.inverse); else - dataZoom.SetYAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue); + dataZoom.SetYAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue, axis.inverse); } if (tempMinValue != axis.context.destMinValue || diff --git a/Runtime/Component/DataZoom/DataZoom.cs b/Runtime/Component/DataZoom/DataZoom.cs index 26edaa43..1fa0b940 100644 --- a/Runtime/Component/DataZoom/DataZoom.cs +++ b/Runtime/Component/DataZoom/DataZoom.cs @@ -415,6 +415,7 @@ namespace XCharts.Runtime public double rawMax; public double min; public double max; + public bool isInverse; } private Dictionary m_XAxisIndexInfos = new Dictionary(); private Dictionary m_YAxisIndexInfos = new Dictionary(); @@ -688,7 +689,7 @@ namespace XCharts.Runtime context.height = chartHeight - runtimeTop - runtimeBottom; } - internal void SetXAxisIndexValueInfo(int xAxisIndex, ref double min, ref double max) + internal void SetXAxisIndexValueInfo(int xAxisIndex, ref double min, ref double max, bool isInverse = false) { AxisIndexValueInfo info; if (!m_XAxisIndexInfos.TryGetValue(xAxisIndex, out info)) @@ -698,13 +699,14 @@ namespace XCharts.Runtime } info.rawMin = min; info.rawMax = max; + info.isInverse = isInverse; info.min = min + (max - min) * start / 100; info.max = min + (max - min) * end / 100; min = info.min; max = info.max; } - internal void SetYAxisIndexValueInfo(int yAxisIndex, ref double min, ref double max) + internal void SetYAxisIndexValueInfo(int yAxisIndex, ref double min, ref double max, bool isInverse = false) { AxisIndexValueInfo info; if (!m_YAxisIndexInfos.TryGetValue(yAxisIndex, out info)) @@ -714,6 +716,7 @@ namespace XCharts.Runtime } info.rawMin = min; info.rawMax = max; + info.isInverse = isInverse; info.min = min + (max - min) * start / 100; info.max = min + (max - min) * end / 100; min = info.min; @@ -738,6 +741,14 @@ namespace XCharts.Runtime var range = info.rawMax - info.rawMin; min = info.rawMin + range * m_Start / 100; max = info.rawMin + range * m_End / 100; + if (info.isInverse) + { + // Internal values are negated; convert back to original for data comparison + var originalMin = -max; + var originalMax = -min; + min = originalMin; + max = originalMax; + } } else { @@ -753,6 +764,14 @@ namespace XCharts.Runtime var range = info.rawMax - info.rawMin; min = info.rawMin + range * m_Start / 100; max = info.rawMin + range * m_End / 100; + if (info.isInverse) + { + // Internal values are negated; convert back to original for data comparison + var originalMin = -max; + var originalMax = -min; + min = originalMin; + max = originalMax; + } } else { diff --git a/Runtime/Component/DataZoom/DataZoomHandler.cs b/Runtime/Component/DataZoom/DataZoomHandler.cs index 21676d62..adec69f8 100644 --- a/Runtime/Component/DataZoom/DataZoomHandler.cs +++ b/Runtime/Component/DataZoom/DataZoomHandler.cs @@ -636,7 +636,7 @@ namespace XCharts.Runtime float pX; if (useXValueForShadow && i < showData.Count && showData[i].data.Count > 0) { - var xVal = showData[i].data[0]; + var xVal = (xAxis != null && xAxis.inverse) ? -showData[i].data[0] : showData[i].data[0]; pX = dataZoom.context.x + (float)((xVal - xMinValue) / (xMaxValue - xMinValue)) * dataZoom.context.width; } else diff --git a/Runtime/Component/Tooltip/TooltipHandler.cs b/Runtime/Component/Tooltip/TooltipHandler.cs index 64bf27cb..611da86a 100644 --- a/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Runtime/Component/Tooltip/TooltipHandler.cs @@ -427,8 +427,10 @@ namespace XCharts.Runtime private void GetSerieDataByXYAxis(Serie serie, Axis xAxis, Axis yAxis) { - var xAxisIndex = AxisHelper.GetAxisValueSplitIndex(xAxis, xAxis.context.pointerValue, false); - var yAxisIndex = AxisHelper.GetAxisValueSplitIndex(yAxis, yAxis.context.pointerValue, false); + var xPointerInternal = xAxis.inverse ? -xAxis.context.pointerValue : xAxis.context.pointerValue; + var yPointerInternal = yAxis.inverse ? -yAxis.context.pointerValue : yAxis.context.pointerValue; + var xAxisIndex = AxisHelper.GetAxisValueSplitIndex(xAxis, xPointerInternal, false); + var yAxisIndex = AxisHelper.GetAxisValueSplitIndex(yAxis, yPointerInternal, false); serie.context.pointerItemDataIndex = -1; if (serie is Heatmap) { @@ -441,8 +443,10 @@ namespace XCharts.Runtime } foreach (var serieData in serie.data) { - var x = AxisHelper.GetAxisValueSplitIndex(xAxis, serieData.GetData(0), true); - var y = AxisHelper.GetAxisValueSplitIndex(yAxis, serieData.GetData(1), true); + var xData = xAxis.inverse ? -serieData.GetData(0) : serieData.GetData(0); + var yData = yAxis.inverse ? -serieData.GetData(1) : serieData.GetData(1); + var x = AxisHelper.GetAxisValueSplitIndex(xAxis, xData, true); + var y = AxisHelper.GetAxisValueSplitIndex(yAxis, yData, true); if (xAxisIndex == x && y == yAxisIndex) { serie.context.pointerItemDataIndex = serieData.index; @@ -472,7 +476,8 @@ namespace XCharts.Runtime { var index = serie.context.pointerAxisDataIndexs[0]; serie.context.pointerItemDataIndex = index; - axis.context.axisTooltipValue = serie.GetSerieData(index).GetData(dimension); + var dataValue = serie.GetSerieData(index).GetData(dimension); + axis.context.axisTooltipValue = axis.inverse ? -dataValue : dataValue; } else { @@ -613,11 +618,12 @@ namespace XCharts.Runtime { if (serie.context.pointerItemDataIndex >= 0) { - axis.context.axisTooltipValue = serie.GetSerieData(serie.context.pointerItemDataIndex).GetData(dimension); + var dataValue = serie.GetSerieData(serie.context.pointerItemDataIndex).GetData(dimension); + axis.context.axisTooltipValue = axis.inverse ? -dataValue : dataValue; } else if (component.type == Tooltip.Type.Cross) { - axis.context.axisTooltipValue = axis.context.pointerValue; + axis.context.axisTooltipValue = axis.inverse ? -axis.context.pointerValue : axis.context.pointerValue; } else {