mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-31 13:58:48 +00:00
修复Axis的inverse没能正确反转的问题
This commit is contained in:
@@ -81,7 +81,8 @@ slug: /changelog
|
|||||||
|
|
||||||
## master
|
## 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.22) 增加`LabelStyle`的`minGap`可避免`label`过于密集
|
||||||
* (2026.05.17) 修复`DataZoom`点击时指示区域不准的问题
|
* (2026.05.17) 修复`DataZoom`点击时指示区域不准的问题
|
||||||
* (2026.05.17) 增加`Legend`的`Width`和`Height`可设置固定宽高
|
* (2026.05.17) 增加`Legend`的`Width`和`Height`可设置固定宽高
|
||||||
|
|||||||
@@ -126,6 +126,8 @@ namespace XCharts
|
|||||||
var yValue = yRate * (chart.pointerPos.y - grid.context.y - axis.context.offset);
|
var yValue = yRate * (chart.pointerPos.y - grid.context.y - axis.context.offset);
|
||||||
if (axis.context.minValue > 0)
|
if (axis.context.minValue > 0)
|
||||||
yValue += axis.context.minValue;
|
yValue += axis.context.minValue;
|
||||||
|
if (axis.inverse)
|
||||||
|
yValue = -yValue;
|
||||||
|
|
||||||
var labelX = axis.GetLabelObjectPosition(0).x;
|
var labelX = axis.GetLabelObjectPosition(0).x;
|
||||||
axis.context.pointerValue = yValue;
|
axis.context.pointerValue = yValue;
|
||||||
@@ -154,6 +156,8 @@ namespace XCharts
|
|||||||
xValue = xRate * (chart.pointerPos.x - grid.context.x - axis.context.offset);
|
xValue = xRate * (chart.pointerPos.x - grid.context.x - axis.context.offset);
|
||||||
if (axis.context.minValue > 0)
|
if (axis.context.minValue > 0)
|
||||||
xValue += axis.context.minValue;
|
xValue += axis.context.minValue;
|
||||||
|
if (axis.inverse)
|
||||||
|
xValue = -xValue;
|
||||||
}
|
}
|
||||||
var labelY = axis.GetLabelObjectPosition(0).y;
|
var labelY = axis.GetLabelObjectPosition(0).y;
|
||||||
axis.context.pointerValue = xValue;
|
axis.context.pointerValue = xValue;
|
||||||
@@ -188,15 +192,20 @@ namespace XCharts
|
|||||||
double tempMinValue;
|
double tempMinValue;
|
||||||
double tempMaxValue;
|
double tempMaxValue;
|
||||||
axis.context.needAnimation = Application.isPlaying && axis.animation.show;
|
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);
|
chart.GetSeriesMinMaxValue(axis, axisIndex, out tempMinValue, out tempMaxValue);
|
||||||
|
|
||||||
var dataZoom = chart.GetDataZoomOfAxis(axis);
|
var dataZoom = chart.GetDataZoomOfAxis(axis);
|
||||||
if (dataZoom != null && dataZoom.enable)
|
if (dataZoom != null && dataZoom.enable)
|
||||||
{
|
{
|
||||||
if (axis is XAxis)
|
if (axis is XAxis)
|
||||||
dataZoom.SetXAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue);
|
dataZoom.SetXAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue, axis.inverse);
|
||||||
else
|
else
|
||||||
dataZoom.SetYAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue);
|
dataZoom.SetYAxisIndexValueInfo(axisIndex, ref tempMinValue, ref tempMaxValue, axis.inverse);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tempMinValue != axis.context.destMinValue ||
|
if (tempMinValue != axis.context.destMinValue ||
|
||||||
|
|||||||
@@ -415,6 +415,7 @@ namespace XCharts.Runtime
|
|||||||
public double rawMax;
|
public double rawMax;
|
||||||
public double min;
|
public double min;
|
||||||
public double max;
|
public double max;
|
||||||
|
public bool isInverse;
|
||||||
}
|
}
|
||||||
private Dictionary<int, AxisIndexValueInfo> m_XAxisIndexInfos = new Dictionary<int, AxisIndexValueInfo>();
|
private Dictionary<int, AxisIndexValueInfo> m_XAxisIndexInfos = new Dictionary<int, AxisIndexValueInfo>();
|
||||||
private Dictionary<int, AxisIndexValueInfo> m_YAxisIndexInfos = new Dictionary<int, AxisIndexValueInfo>();
|
private Dictionary<int, AxisIndexValueInfo> m_YAxisIndexInfos = new Dictionary<int, AxisIndexValueInfo>();
|
||||||
@@ -688,7 +689,7 @@ namespace XCharts.Runtime
|
|||||||
context.height = chartHeight - runtimeTop - runtimeBottom;
|
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;
|
AxisIndexValueInfo info;
|
||||||
if (!m_XAxisIndexInfos.TryGetValue(xAxisIndex, out info))
|
if (!m_XAxisIndexInfos.TryGetValue(xAxisIndex, out info))
|
||||||
@@ -698,13 +699,14 @@ namespace XCharts.Runtime
|
|||||||
}
|
}
|
||||||
info.rawMin = min;
|
info.rawMin = min;
|
||||||
info.rawMax = max;
|
info.rawMax = max;
|
||||||
|
info.isInverse = isInverse;
|
||||||
info.min = min + (max - min) * start / 100;
|
info.min = min + (max - min) * start / 100;
|
||||||
info.max = min + (max - min) * end / 100;
|
info.max = min + (max - min) * end / 100;
|
||||||
min = info.min;
|
min = info.min;
|
||||||
max = info.max;
|
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;
|
AxisIndexValueInfo info;
|
||||||
if (!m_YAxisIndexInfos.TryGetValue(yAxisIndex, out info))
|
if (!m_YAxisIndexInfos.TryGetValue(yAxisIndex, out info))
|
||||||
@@ -714,6 +716,7 @@ namespace XCharts.Runtime
|
|||||||
}
|
}
|
||||||
info.rawMin = min;
|
info.rawMin = min;
|
||||||
info.rawMax = max;
|
info.rawMax = max;
|
||||||
|
info.isInverse = isInverse;
|
||||||
info.min = min + (max - min) * start / 100;
|
info.min = min + (max - min) * start / 100;
|
||||||
info.max = min + (max - min) * end / 100;
|
info.max = min + (max - min) * end / 100;
|
||||||
min = info.min;
|
min = info.min;
|
||||||
@@ -738,6 +741,14 @@ namespace XCharts.Runtime
|
|||||||
var range = info.rawMax - info.rawMin;
|
var range = info.rawMax - info.rawMin;
|
||||||
min = info.rawMin + range * m_Start / 100;
|
min = info.rawMin + range * m_Start / 100;
|
||||||
max = info.rawMin + range * m_End / 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
|
else
|
||||||
{
|
{
|
||||||
@@ -753,6 +764,14 @@ namespace XCharts.Runtime
|
|||||||
var range = info.rawMax - info.rawMin;
|
var range = info.rawMax - info.rawMin;
|
||||||
min = info.rawMin + range * m_Start / 100;
|
min = info.rawMin + range * m_Start / 100;
|
||||||
max = info.rawMin + range * m_End / 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
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -636,7 +636,7 @@ namespace XCharts.Runtime
|
|||||||
float pX;
|
float pX;
|
||||||
if (useXValueForShadow && i < showData.Count && showData[i].data.Count > 0)
|
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;
|
pX = dataZoom.context.x + (float)((xVal - xMinValue) / (xMaxValue - xMinValue)) * dataZoom.context.width;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -427,8 +427,10 @@ namespace XCharts.Runtime
|
|||||||
|
|
||||||
private void GetSerieDataByXYAxis(Serie serie, Axis xAxis, Axis yAxis)
|
private void GetSerieDataByXYAxis(Serie serie, Axis xAxis, Axis yAxis)
|
||||||
{
|
{
|
||||||
var xAxisIndex = AxisHelper.GetAxisValueSplitIndex(xAxis, xAxis.context.pointerValue, false);
|
var xPointerInternal = xAxis.inverse ? -xAxis.context.pointerValue : xAxis.context.pointerValue;
|
||||||
var yAxisIndex = AxisHelper.GetAxisValueSplitIndex(yAxis, yAxis.context.pointerValue, false);
|
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;
|
serie.context.pointerItemDataIndex = -1;
|
||||||
if (serie is Heatmap)
|
if (serie is Heatmap)
|
||||||
{
|
{
|
||||||
@@ -441,8 +443,10 @@ namespace XCharts.Runtime
|
|||||||
}
|
}
|
||||||
foreach (var serieData in serie.data)
|
foreach (var serieData in serie.data)
|
||||||
{
|
{
|
||||||
var x = AxisHelper.GetAxisValueSplitIndex(xAxis, serieData.GetData(0), true);
|
var xData = xAxis.inverse ? -serieData.GetData(0) : serieData.GetData(0);
|
||||||
var y = AxisHelper.GetAxisValueSplitIndex(yAxis, serieData.GetData(1), true);
|
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)
|
if (xAxisIndex == x && y == yAxisIndex)
|
||||||
{
|
{
|
||||||
serie.context.pointerItemDataIndex = serieData.index;
|
serie.context.pointerItemDataIndex = serieData.index;
|
||||||
@@ -472,7 +476,8 @@ namespace XCharts.Runtime
|
|||||||
{
|
{
|
||||||
var index = serie.context.pointerAxisDataIndexs[0];
|
var index = serie.context.pointerAxisDataIndexs[0];
|
||||||
serie.context.pointerItemDataIndex = index;
|
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
|
else
|
||||||
{
|
{
|
||||||
@@ -613,11 +618,12 @@ namespace XCharts.Runtime
|
|||||||
{
|
{
|
||||||
if (serie.context.pointerItemDataIndex >= 0)
|
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)
|
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
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user