From ce702fd1e3d60e5aee02784c9e2b53d5028a2635 Mon Sep 17 00:00:00 2001 From: monitor1394 Date: Mon, 5 Sep 2022 13:18:00 +0800 Subject: [PATCH] [improve][tooltip] improve tooltip for heatmap --- CHANGELOG.md | 1 + Runtime/Component/Axis/Axis.cs | 2 + Runtime/Component/Axis/AxisHelper.cs | 50 +++++++++++++++++++-- Runtime/Component/Tooltip/TooltipHandler.cs | 10 ++--- Runtime/Serie/Heatmap/HeatmapHandler.cs | 15 ++++--- Runtime/Serie/SerieHelper.cs | 10 +++++ 6 files changed, 73 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea92c446..762e3cdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ ## master +* (2022.09.05) 优化`Tooltip`在热力图为数值轴时的指示 * (2022.09.02) 增加`onPointerEnterPie`回调支持 * (2022.09.02) 优化`HeatmapChart` * (2022.08.30) 优化`RadarChart` diff --git a/Runtime/Component/Axis/Axis.cs b/Runtime/Component/Axis/Axis.cs index 46bbb8e5..1a988b1f 100644 --- a/Runtime/Component/Axis/Axis.cs +++ b/Runtime/Component/Axis/Axis.cs @@ -719,6 +719,8 @@ namespace XCharts.Runtime } } + + /// /// 获得指定区域缩放的类目数据列表 /// diff --git a/Runtime/Component/Axis/AxisHelper.cs b/Runtime/Component/Axis/AxisHelper.cs index e24be302..73c96f5d 100644 --- a/Runtime/Component/Axis/AxisHelper.cs +++ b/Runtime/Component/Axis/AxisHelper.cs @@ -19,6 +19,24 @@ namespace XCharts.Runtime return 0; } + /// + /// 获得分割网格个数,包含次刻度 + /// + /// + /// + public static int GetTotalSplitGridNum(Axis axis) + { + if (axis.IsCategory()) + return axis.data.Count; + else + { + var splitNum = axis.splitNumber <= 0 ? GetSplitNumber(axis, 0, null) : axis.splitNumber; + return axis.minorTick.show ? + splitNum * axis.minorTick.splitNumber : + splitNum; + } + } + /// /// 获得分割段数 /// @@ -519,6 +537,34 @@ namespace XCharts.Runtime return GetAxisPositionInternal(grid, axis, scaleWidth, value, false, true); } + /// + /// 获得数值value在坐标轴上对应的split索引 + /// + /// + /// + /// + public static int GetAxisValueSplitIndex(Axis axis, double value, int totalSplitNumber = -1) + { + if (axis.IsCategory()) + { + return (int) value; + } + else + { + if (value == axis.context.minValue) + return 0; + else + { + if (totalSplitNumber == -1) + totalSplitNumber = GetTotalSplitGridNum(axis); + if (axis.minMaxType == Axis.AxisMinMaxType.Custom) + return Mathf.CeilToInt(((float) ((value - axis.min) / axis.max) * totalSplitNumber) - 1); + else + return Mathf.CeilToInt(((float) ((value - axis.context.minValue) / axis.context.minMaxRange) * totalSplitNumber) - 1); + } + } + } + private static float GetAxisPositionInternal(GridCoord grid, Axis axis, float scaleWidth, double value, bool includeGridXY, bool realLength) { var isY = axis is YAxis; @@ -589,9 +635,5 @@ namespace XCharts.Runtime startX += relativedAxis.context.offset; return startX; } - - public static void UpdateAxisOffset(){ - - } } } \ No newline at end of file diff --git a/Runtime/Component/Tooltip/TooltipHandler.cs b/Runtime/Component/Tooltip/TooltipHandler.cs index ba6b4526..2520cd79 100644 --- a/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Runtime/Component/Tooltip/TooltipHandler.cs @@ -241,7 +241,7 @@ namespace XCharts.Runtime private void UpdateAxisPointerDataIndex(Serie serie, XAxis xAxis, YAxis yAxis, GridCoord grid, bool isTriggerAxis) { serie.context.pointerAxisDataIndexs.Clear(); - if (xAxis.IsCategory() && yAxis.IsCategory()) + if (serie is Heatmap) { GetSerieDataByXYAxis(serie, xAxis, yAxis); } @@ -283,14 +283,14 @@ namespace XCharts.Runtime private void GetSerieDataByXYAxis(Serie serie, Axis xAxis, Axis yAxis) { - var xAxisIndex = xAxis.context.pointerValue; - var yAxisIndex = yAxis.context.pointerValue; + var xAxisIndex = AxisHelper.GetAxisValueSplitIndex(xAxis, xAxis.context.pointerValue); + var yAxisIndex = AxisHelper.GetAxisValueSplitIndex(yAxis, yAxis.context.pointerValue); serie.context.pointerItemDataIndex = -1; foreach (var serieData in serie.data) { - var x = serieData.GetData(0); - var y = serieData.GetData(1); + var x = AxisHelper.GetAxisValueSplitIndex(xAxis,serieData.GetData(0)); + var y = AxisHelper.GetAxisValueSplitIndex(yAxis,serieData.GetData(1)); if (xAxisIndex == x && y == yAxisIndex) { serie.context.pointerItemDataIndex = serieData.index; diff --git a/Runtime/Serie/Heatmap/HeatmapHandler.cs b/Runtime/Serie/Heatmap/HeatmapHandler.cs index 7f69c9cc..0edd024d 100644 --- a/Runtime/Serie/Heatmap/HeatmapHandler.cs +++ b/Runtime/Serie/Heatmap/HeatmapHandler.cs @@ -132,8 +132,8 @@ namespace XCharts.Runtime yAxis.boundaryGap = true; var visualMap = chart.GetVisualMapOfSerie(serie); var emphasisStyle = serie.emphasisStyle; - var xCount = xAxis.data.Count; - var yCount = yAxis.data.Count; + var xCount = AxisHelper.GetTotalSplitGridNum(xAxis); + var yCount = AxisHelper.GetTotalSplitGridNum(yAxis); var xWidth = m_SerieGrid.context.width / xCount; var yWidth = m_SerieGrid.context.height / yCount; @@ -173,8 +173,11 @@ namespace XCharts.Runtime for (int n = 0; n < serie.dataCount; n++) { var serieData = serie.data[n]; - var i = (int) serieData.GetData(0); - var j = (int) serieData.GetData(1); + var xValue = serieData.GetData(0); + var yValue = serieData.GetData(1); + var i = AxisHelper.GetAxisValueSplitIndex(xAxis, xValue, xCount); + var j = AxisHelper.GetAxisValueSplitIndex(yAxis, yValue, yCount); + if (serie.IsIgnoreValue(serieData, dimension)) { serie.context.dataPoints.Add(Vector3.zero); @@ -184,8 +187,8 @@ namespace XCharts.Runtime var value = serieData.GetCurrData(dimension, dataChangeDuration, yAxis.inverse, yAxis.context.minValue, yAxis.context.maxValue); if (serieData.IsDataChanged()) dataChanging = true; - var pos = new Vector3(zeroX + (i + (xAxis.boundaryGap ? 0.5f : 0)) * xWidth, - zeroY + (j + (yAxis.boundaryGap ? 0.5f : 0)) * yWidth); + var pos = new Vector3(zeroX + (i + 0.5f) * xWidth, + zeroY + (j + 0.5f) * yWidth); serie.context.dataPoints.Add(pos); serie.context.dataIndexs.Add(serieData.index); serieData.context.position = pos; diff --git a/Runtime/Serie/SerieHelper.cs b/Runtime/Serie/SerieHelper.cs index 7e7491f8..95e04f70 100644 --- a/Runtime/Serie/SerieHelper.cs +++ b/Runtime/Serie/SerieHelper.cs @@ -144,6 +144,11 @@ namespace XCharts.Runtime } } } + if (min == double.MaxValue && max == double.MinValue) + { + min = 0; + max = 0; + } } /// @@ -180,6 +185,11 @@ namespace XCharts.Runtime } } } + if (min == double.MaxValue && max == double.MinValue) + { + min = 0; + max = 0; + } } ///