diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a9b2fcf..5b3ea8f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ ## master +* (2022.09.02) 优化`HeatmapChart` * (2022.08.30) 优化`RadarChart` * (2022.08.30) 修复`DataZoom`在某些情况下计算范围不准确的问题 (#221) * (2022.08.29) 优化`BarChart`在数据过密时的默认表现 diff --git a/Runtime/Chart/HeatmapChart.cs b/Runtime/Chart/HeatmapChart.cs index 421ae09e..f1df5f11 100644 --- a/Runtime/Chart/HeatmapChart.cs +++ b/Runtime/Chart/HeatmapChart.cs @@ -36,9 +36,7 @@ namespace XCharts.Runtime Heatmap.AddDefaultSerie(this, GenerateDefaultSerieName()); var visualMap = GetOrAddChartComponent(); - visualMap.max = 10; - visualMap.range[0] = 0f; - visualMap.range[1] = 10f; + visualMap.autoMinMax = true; visualMap.orient = Orient.Vertical; visualMap.calculable = true; visualMap.location.align = Location.Align.BottomLeft; @@ -71,10 +69,7 @@ namespace XCharts.Runtime { for (int j = 0; j < ySplitNumber; j++) { - var value = 0f; - var rate = Random.Range(0, 101); - if (rate > 70) value = Random.Range(8f, 10f); - else value = Random.Range(1f, 8f); + var value = Random.Range(0, 150); var list = new List { i, j, value }; AddData(0, list); } diff --git a/Runtime/Component/Tooltip/TooltipHandler.cs b/Runtime/Component/Tooltip/TooltipHandler.cs index a03205a6..ba6b4526 100644 --- a/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Runtime/Component/Tooltip/TooltipHandler.cs @@ -241,7 +241,11 @@ namespace XCharts.Runtime private void UpdateAxisPointerDataIndex(Serie serie, XAxis xAxis, YAxis yAxis, GridCoord grid, bool isTriggerAxis) { serie.context.pointerAxisDataIndexs.Clear(); - if (yAxis.IsCategory()) + if (xAxis.IsCategory() && yAxis.IsCategory()) + { + GetSerieDataByXYAxis(serie, xAxis, yAxis); + } + else if (yAxis.IsCategory()) { if (isTriggerAxis) { @@ -277,6 +281,24 @@ namespace XCharts.Runtime } } + private void GetSerieDataByXYAxis(Serie serie, Axis xAxis, Axis yAxis) + { + var xAxisIndex = xAxis.context.pointerValue; + var yAxisIndex = yAxis.context.pointerValue; + serie.context.pointerItemDataIndex = -1; + + foreach (var serieData in serie.data) + { + var x = serieData.GetData(0); + var y = serieData.GetData(1); + if (xAxisIndex == x && y == yAxisIndex) + { + serie.context.pointerItemDataIndex = serieData.index; + break; + } + } + } + private void GetSerieDataIndexByAxis(Serie serie, Axis axis, GridCoord grid, int dimension = 0) { var currValue = 0d; @@ -418,7 +440,7 @@ namespace XCharts.Runtime { var serie = series[i]; serie.context.isTriggerByAxis = isTriggerByAxis; - if (isTriggerByAxis && dataIndex >= 0) + if (isTriggerByAxis && dataIndex >= 0 && serie.context.pointerItemDataIndex < 0) serie.context.pointerItemDataIndex = dataIndex; serie.handler.UpdateTooltipSerieParams(dataIndex, showCategory, category, tooltip.marker, tooltip.itemFormatter, tooltip.numericFormatter, diff --git a/Runtime/Component/VisualMap/VisualMap.cs b/Runtime/Component/VisualMap/VisualMap.cs index 165aa809..69a0a786 100644 --- a/Runtime/Component/VisualMap/VisualMap.cs +++ b/Runtime/Component/VisualMap/VisualMap.cs @@ -81,9 +81,9 @@ namespace XCharts.Runtime [SerializeField] private SelectedMode m_SelectedMode = SelectedMode.Multiple; [SerializeField] private int m_SerieIndex = 0; [SerializeField] private double m_Min = 0; - [SerializeField] private double m_Max = 100; + [SerializeField] private double m_Max = 0; - [SerializeField] private double[] m_Range = new double[2] { 0, 100 }; + [SerializeField] private double[] m_Range = new double[2] { 0, 0 }; [SerializeField] private string[] m_Text = new string[2] { "", "" }; [SerializeField] private float[] m_TextGap = new float[2] { 10f, 10f }; [SerializeField] private int m_SplitNumber = 5; @@ -364,7 +364,8 @@ namespace XCharts.Runtime { get { - if (m_Range[0] < min || m_Range[0] > max) return min; + if (m_Range[0] == 0 && m_Range[1] == 0) return min; + else if (m_Range[0] < min || m_Range[0] > max) return min; else return m_Range[0]; } set @@ -377,6 +378,7 @@ namespace XCharts.Runtime { get { + if (m_Range[0] == 0 && m_Range[1] == 0) return max; if (m_Range[1] >= m_Range[0] && m_Range[1] < max) return m_Range[1]; else return max; } diff --git a/Runtime/Component/VisualMap/VisualMapContext.cs b/Runtime/Component/VisualMap/VisualMapContext.cs index 730b537d..afba42a2 100644 --- a/Runtime/Component/VisualMap/VisualMapContext.cs +++ b/Runtime/Component/VisualMap/VisualMapContext.cs @@ -12,6 +12,8 @@ namespace XCharts.Runtime public double pointerValue { get; set; } public bool minDrag { get; internal set; } public bool maxDrag { get; internal set; } + public double min { get; set; } + public double max { get; set; } internal List inRangeColors = new List(); diff --git a/Runtime/Component/VisualMap/VisualMapHelper.cs b/Runtime/Component/VisualMap/VisualMapHelper.cs index 6351dea4..406b2bf5 100644 --- a/Runtime/Component/VisualMap/VisualMapHelper.cs +++ b/Runtime/Component/VisualMap/VisualMapHelper.cs @@ -177,15 +177,13 @@ namespace XCharts.Runtime return true; } - public static int GetDimension(VisualMap visualMap, int serieDataCount) + public static int GetDimension(VisualMap visualMap, int defaultDimension) { - var dimension = visualMap != null && visualMap.dimension >= 0 ? - visualMap.dimension : serieDataCount - 1; + if (visualMap == null || !visualMap.show) + return defaultDimension; - if (dimension > serieDataCount - 1) - dimension = serieDataCount - 1; - - return dimension; + return visualMap != null && visualMap.dimension >= 0 ? + visualMap.dimension : defaultDimension; } } } \ No newline at end of file diff --git a/Runtime/Serie/Heatmap/Heatmap.cs b/Runtime/Serie/Heatmap/Heatmap.cs index ea1ccd72..ec4fc180 100644 --- a/Runtime/Serie/Heatmap/Heatmap.cs +++ b/Runtime/Serie/Heatmap/Heatmap.cs @@ -19,12 +19,6 @@ namespace XCharts.Runtime serie.itemStyle.show = true; serie.itemStyle.borderWidth = 1; serie.itemStyle.borderColor = Color.clear; - - var emphasis = serie.AddExtraComponent(); - emphasis.show = true; - emphasis.itemStyle.show = true; - emphasis.itemStyle.borderWidth = 1; - emphasis.itemStyle.borderColor = Color.black; return serie; } } diff --git a/Runtime/Serie/Heatmap/HeatmapHandler.cs b/Runtime/Serie/Heatmap/HeatmapHandler.cs index 806908b2..7f69c9cc 100644 --- a/Runtime/Serie/Heatmap/HeatmapHandler.cs +++ b/Runtime/Serie/Heatmap/HeatmapHandler.cs @@ -34,6 +34,8 @@ namespace XCharts.Runtime var serieData = serie.GetSerieData(dataIndex); if (serieData == null) return; + var visualMap = chart.GetVisualMapOfSerie(serie); + var dimension = VisualMapHelper.GetDimension(visualMap, defaultDimension); if (string.IsNullOrEmpty(category)) { @@ -41,13 +43,12 @@ namespace XCharts.Runtime if (xAxis != null) category = xAxis.GetData((int) serieData.GetData(0)); } - title = serie.serieName; var param = serie.context.param; param.serieName = serie.serieName; param.serieIndex = serie.index; - param.dimension = defaultDimension; + param.dimension = dimension; param.dataCount = serie.dataCount; param.serieData = serieData; param.color = serieData.context.color; @@ -58,7 +59,7 @@ namespace XCharts.Runtime param.columns.Add(param.marker); param.columns.Add(category); - param.columns.Add(ChartCached.NumberToStr(serieData.GetData(defaultDimension), param.numericFormatter)); + param.columns.Add(ChartCached.NumberToStr(serieData.GetData(dimension), param.numericFormatter)); paramList.Add(param); } @@ -121,7 +122,7 @@ namespace XCharts.Runtime private void DrawHeatmapSerie(VertexHelper vh, Heatmap serie) { - if (serie.animation.HasFadeOut()) return; + if (!serie.show || serie.animation.HasFadeOut()) return; XAxis xAxis; YAxis yAxis; if (!chart.TryGetChartComponent(out xAxis, serie.xAxisIndex)) return; @@ -138,8 +139,6 @@ namespace XCharts.Runtime var zeroX = m_SerieGrid.context.x; var zeroY = m_SerieGrid.context.y; - var rangeMin = visualMap.rangeMin; - var rangeMax = visualMap.rangeMax; var color = chart.theme.GetColor(serie.index); var borderWidth = serie.itemStyle.show ? serie.itemStyle.borderWidth : 0; var rectWid = xWidth - 2 * borderWidth; @@ -161,12 +160,21 @@ namespace XCharts.Runtime var dataChanging = false; serie.containerIndex = m_SerieGrid.index; serie.containterInstanceId = m_SerieGrid.instanceId; + + var dimension = VisualMapHelper.GetDimension(visualMap, defaultDimension); + if (visualMap.autoMinMax) + { + double maxValue, minValue; + SerieHelper.GetMinMaxData(serie, dimension, out minValue, out maxValue); + VisualMapHelper.SetMinMax(visualMap, minValue, maxValue); + } + var rangeMin = visualMap.rangeMin; + var rangeMax = visualMap.rangeMax; 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 dimension = VisualMapHelper.GetDimension(visualMap, serieData.data.Count); if (serie.IsIgnoreValue(serieData, dimension)) { serie.context.dataPoints.Add(Vector3.zero); @@ -184,7 +192,6 @@ namespace XCharts.Runtime serieData.context.canShowLabel = false; serieData.context.rect = new Rect(pos.x - rectWid / 2, pos.y - rectHig / 2, rectWid, rectHig); - if (value == 0) continue; if ((value < rangeMin && rangeMin != visualMap.min) || (value > rangeMax && rangeMax != visualMap.max)) {