diff --git a/Documentation~/zh/changelog.md b/Documentation~/zh/changelog.md index e14e9c09..59f227e4 100644 --- a/Documentation~/zh/changelog.md +++ b/Documentation~/zh/changelog.md @@ -79,6 +79,7 @@ slug: /changelog ## master +* (2025.03.09) 修复`Bar`在同一个`Chart`不同`Grid`里时绘制有些异常的问题 * (2025.03.07) 增加`Animation`的`speed`可指定动画速度 * (2025.03.06) 优化`Animation`的新增动画表现 * (2025.03.04) 修复`Treemap`的`label`显示异常的问题 diff --git a/Runtime/Internal/BaseChart.Serie.cs b/Runtime/Internal/BaseChart.Serie.cs index 640ce59b..86412ddc 100644 --- a/Runtime/Internal/BaseChart.Serie.cs +++ b/Runtime/Internal/BaseChart.Serie.cs @@ -851,7 +851,7 @@ namespace XCharts.Runtime } } - public float GetSerieBarGap() where T : Serie + public float GetSerieBarGap(int gridIndex) where T : Serie { float gap = 0f; for (int i = 0; i < m_Series.Count; i++) @@ -859,6 +859,7 @@ namespace XCharts.Runtime var serie = m_Series[i]; if (serie.show && serie is T) { + if (!CheckSerieGridIndex(serie, gridIndex)) continue; if (serie.barGap != 0) { gap = serie.barGap; @@ -868,7 +869,7 @@ namespace XCharts.Runtime return gap; } - public double GetSerieSameStackTotalValue(string stack, int dataIndex) where T : Serie + public double GetSerieSameStackTotalValue(string stack, int dataIndex, int gridIndex) where T : Serie { if (string.IsNullOrEmpty(stack)) return 0; double total = 0; @@ -876,6 +877,7 @@ namespace XCharts.Runtime { if (serie is T) { + if (!CheckSerieGridIndex(serie, gridIndex)) continue; if (stack.Equals(serie.stack)) { total += serie.data[dataIndex].data[1]; @@ -885,7 +887,7 @@ namespace XCharts.Runtime return total; } - public int GetSerieBarRealCount() where T : Serie + public int GetSerieBarRealCount(int gridIndex) where T : Serie { var count = 0; barStackSet.Clear(); @@ -895,6 +897,7 @@ namespace XCharts.Runtime if (!serie.show) continue; if (serie is T) { + if (!CheckSerieGridIndex(serie, gridIndex)) continue; if (!string.IsNullOrEmpty(serie.stack)) { if (barStackSet.Contains(serie.stack)) continue; @@ -907,8 +910,26 @@ namespace XCharts.Runtime return count; } + private bool CheckSerieGridIndex(Serie serie, int gridIndex) + { + if (gridIndex >= 0) + { + if (serie.xAxisIndex >= 0 && serie.xAxisIndex < m_XAxes.Count) + { + var xAxis = m_XAxes[serie.xAxisIndex]; + if (xAxis.gridIndex != gridIndex) return false; + } + if (serie.yAxisIndex >= 0 && serie.yAxisIndex < m_YAxes.Count) + { + var yAxis = m_YAxes[serie.yAxisIndex]; + if (yAxis.gridIndex != gridIndex) return false; + } + } + return true; + } + private HashSet barStackSet = new HashSet(); - public float GetSerieTotalWidth(float categoryWidth, float gap, int realBarCount) where T : Serie + public float GetSerieTotalWidth(float categoryWidth, float gap, int realBarCount, int gridIndex) where T : Serie { float total = 0; float lastGap = 0; @@ -919,6 +940,7 @@ namespace XCharts.Runtime if (!serie.show) continue; if (serie is T) { + if (!CheckSerieGridIndex(serie, gridIndex)) continue; if (!string.IsNullOrEmpty(serie.stack)) { if (barStackSet.Contains(serie.stack)) continue; @@ -941,12 +963,12 @@ namespace XCharts.Runtime return total; } - public float GetSerieTotalGap(float categoryWidth, float gap, int index) where T : Serie + public float GetSerieTotalGap(float categoryWidth, float gap, int index, int gridIndex) where T : Serie { if (index <= 0) return 0; var total = 0f; var count = 0; - var totalRealBarCount = GetSerieBarRealCount(); + var totalRealBarCount = GetSerieBarRealCount(gridIndex); barStackSet.Clear(); for (int i = 0; i < m_Series.Count; i++) { @@ -954,6 +976,7 @@ namespace XCharts.Runtime if (!serie.show) continue; if (serie is T) { + if (!CheckSerieGridIndex(serie, gridIndex)) continue; if (!string.IsNullOrEmpty(serie.stack)) { if (barStackSet.Contains(serie.stack)) continue; @@ -1003,7 +1026,7 @@ namespace XCharts.Runtime } private List tempList = new List(); - public int GetSerieIndexIfStack(Serie currSerie) where T : Serie + public int GetSerieIndexIfStack(Serie currSerie, int gridIndex) where T : Serie { tempList.Clear(); int index = 0; @@ -1012,6 +1035,7 @@ namespace XCharts.Runtime var serie = m_Series[i]; if (!serie.show) continue; if (!(serie is T)) continue; + if (!CheckSerieGridIndex(serie, gridIndex)) continue; if (string.IsNullOrEmpty(serie.stack)) { if (serie.index == currSerie.index) return index; diff --git a/Runtime/Serie/Bar/BarHandler.PolarCoord.cs b/Runtime/Serie/Bar/BarHandler.PolarCoord.cs index 8a2ecfdb..868204d8 100644 --- a/Runtime/Serie/Bar/BarHandler.PolarCoord.cs +++ b/Runtime/Serie/Bar/BarHandler.PolarCoord.cs @@ -125,16 +125,17 @@ namespace XCharts.Runtime if (isStack) SeriesHelper.UpdateStackDataList(chart.series, serie, null, m_StackSerieData); - var barCount = chart.GetSerieBarRealCount(); + var barCount = chart.GetSerieBarRealCount(-1); var categoryWidth = m_AngleAxis.IsCategory() ? AxisHelper.GetDataWidth(m_AngleAxis, 360, datas.Count, null) : AxisHelper.GetDataWidth(m_RadiusAxis, m_SeriePolar.context.radius, datas.Count, null); - var barGap = chart.GetSerieBarGap(); - var totalBarWidth = chart.GetSerieTotalWidth(categoryWidth, barGap, barCount); + var barGap = chart.GetSerieBarGap(-1); + var totalBarWidth = chart.GetSerieTotalWidth(categoryWidth, barGap, barCount, -1); var barWidth = serie.GetBarWidth(categoryWidth, barCount); var offset = (categoryWidth - totalBarWidth) * 0.5f; - var serieReadIndex = chart.GetSerieIndexIfStack(serie); - float gap = serie.barGap == -1 ? offset : offset + chart.GetSerieTotalGap(categoryWidth, barGap, serieReadIndex); + var serieReadIndex = chart.GetSerieIndexIfStack(serie, -1); + float gap = serie.barGap == -1 ? offset : + offset + chart.GetSerieTotalGap(categoryWidth, barGap, serieReadIndex, -1); var areaColor = ColorUtil.clearColor32; var areaToColor = ColorUtil.clearColor32; @@ -157,7 +158,7 @@ namespace XCharts.Runtime angleValue = serieData.GetData(1); if (m_AngleAxis.IsCategory()) { - start = (float) (startAngle + categoryWidth * angleValue + gap); + start = (float)(startAngle + categoryWidth * angleValue + gap); end = start + barWidth; inside = m_SeriePolar.context.insideRadius; if (isStack) @@ -178,7 +179,7 @@ namespace XCharts.Runtime } end = start + m_AngleAxis.GetValueLength(angleValue, 360); serieData.context.stackHeight = end - start; - inside = m_SeriePolar.context.insideRadius + categoryWidth * (float) radiusValue + gap; + inside = m_SeriePolar.context.insideRadius + categoryWidth * (float)radiusValue + gap; outside = inside + barWidth; } serieData.context.startAngle = start; diff --git a/Runtime/Serie/Bar/BarHandler.cs b/Runtime/Serie/Bar/BarHandler.cs index 3b68293d..f2990c19 100644 --- a/Runtime/Serie/Bar/BarHandler.cs +++ b/Runtime/Serie/Bar/BarHandler.cs @@ -161,7 +161,7 @@ namespace XCharts.Runtime m_SerieGrid = chart.GetChartComponent(axis.gridIndex); if (m_SerieGrid == null) return; - if(serie.useSortData) + if (serie.useSortData) { SerieHelper.UpdateSerieRuntimeFilterData(serie); } @@ -180,15 +180,16 @@ namespace XCharts.Runtime if (isStack) SeriesHelper.UpdateStackDataList(chart.series, serie, dataZoom, m_StackSerieData); - var barCount = chart.GetSerieBarRealCount(); + var barCount = chart.GetSerieBarRealCount(m_SerieGrid.index); float categoryWidth = AxisHelper.GetDataWidth(axis, axisLength, showData.Count, dataZoom); float relativedCategoryWidth = AxisHelper.GetDataWidth(relativedAxis, relativedAxisLength, showData.Count, dataZoom); - float barGap = chart.GetSerieBarGap(); - float totalBarWidth = chart.GetSerieTotalWidth(categoryWidth, barGap, barCount); + float barGap = chart.GetSerieBarGap(m_SerieGrid.index); + float totalBarWidth = chart.GetSerieTotalWidth(categoryWidth, barGap, barCount, m_SerieGrid.index); float barWidth = serie.GetBarWidth(categoryWidth, barCount); float offset = (categoryWidth - totalBarWidth) * 0.5f; - var serieReadIndex = chart.GetSerieIndexIfStack(serie); - float gap = serie.barGap == -1 ? offset : offset + chart.GetSerieTotalGap(categoryWidth, barGap, serieReadIndex); + var serieReadIndex = chart.GetSerieIndexIfStack(serie, m_SerieGrid.index); + float gap = serie.barGap == -1 ? offset : + offset + chart.GetSerieTotalGap(categoryWidth, barGap, serieReadIndex, m_SerieGrid.index); int maxCount = serie.maxShow > 0 ? (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) : showData.Count; @@ -240,7 +241,7 @@ namespace XCharts.Runtime var barHig = 0f; if (isPercentStack) { - var valueTotal = chart.GetSerieSameStackTotalValue(serie.stack, i); + var valueTotal = chart.GetSerieSameStackTotalValue(serie.stack, i, m_SerieGrid.index); barHig = valueTotal != 0 ? (float)(relativedValue / valueTotal * relativedAxisLength) : 0; } else diff --git a/Runtime/Serie/Bar/SimplifiedBarHandler.cs b/Runtime/Serie/Bar/SimplifiedBarHandler.cs index 91908bf1..ab687679 100644 --- a/Runtime/Serie/Bar/SimplifiedBarHandler.cs +++ b/Runtime/Serie/Bar/SimplifiedBarHandler.cs @@ -122,11 +122,11 @@ namespace XCharts.Runtime var relativedAxisLength = isY ? m_SerieGrid.context.width : m_SerieGrid.context.height; var axisXY = isY ? m_SerieGrid.context.y : m_SerieGrid.context.x; - var barCount = chart.GetSerieBarRealCount(); + var barCount = chart.GetSerieBarRealCount(m_SerieGrid.index); float categoryWidth = AxisHelper.GetDataWidth(axis, axisLength, showData.Count, dataZoom); float relativedCategoryWidth = AxisHelper.GetDataWidth(relativedAxis, relativedAxisLength, showData.Count, dataZoom); - float barGap = chart.GetSerieBarGap(); - float totalBarWidth = chart.GetSerieTotalWidth(categoryWidth, barGap, barCount); + float barGap = chart.GetSerieBarGap(m_SerieGrid.index); + float totalBarWidth = chart.GetSerieTotalWidth(categoryWidth, barGap, barCount,m_SerieGrid.index); float barWidth = serie.GetBarWidth(categoryWidth, barCount); float offset = (categoryWidth - totalBarWidth) * 0.5f; float barGapWidth = barWidth + barWidth * barGap;