diff --git a/CHANGELOG.md b/CHANGELOG.md index a7d201d6..6c4407c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ ## master +* (2022.09.19) 增加`PolarChart`对多柱图和堆叠柱图的支持 * (2022.09.16) 增加`PolarChart`对`Bar`柱图的支持 * (2022.09.14) 增加`PolarCoord`可通过`radius`设置环形极坐标的支持 * (2022.09.09) 修复`Editor`下编辑参数部分组件可能不会实时刷新的问题 diff --git a/Runtime/Component/Axis/AngleAxis/AngleAxisHandler.cs b/Runtime/Component/Axis/AngleAxis/AngleAxisHandler.cs index c464b8c0..b3006ba8 100644 --- a/Runtime/Component/Axis/AngleAxis/AngleAxisHandler.cs +++ b/Runtime/Component/Axis/AngleAxis/AngleAxisHandler.cs @@ -116,11 +116,12 @@ namespace XCharts.Runtime for (int i = 1; i < size; i++) { var scaleWidth = AxisHelper.GetScaleWidth(angleAxis, total, i); - var pos = ChartHelper.GetPos(cenPos, radius, currAngle, true); + var pos1 = ChartHelper.GetPos(cenPos, polar.context.insideRadius, currAngle, true); + var pos2 = ChartHelper.GetPos(cenPos, polar.context.outsideRadius, currAngle, true); if (angleAxis.show && angleAxis.splitLine.show) { var lineWidth = angleAxis.splitLine.GetWidth(chart.theme.axis.splitLineWidth); - UGL.DrawLine(vh, cenPos, pos, lineWidth, splitLineColor); + UGL.DrawLine(vh, pos1, pos2, lineWidth, splitLineColor); } if (angleAxis.show && angleAxis.axisTick.show) { @@ -130,7 +131,7 @@ namespace XCharts.Runtime { var tickY = radius + tickLength; var tickPos = ChartHelper.GetPos(cenPos, tickY, currAngle, true); - UGL.DrawLine(vh, pos, tickPos, tickWidth, tickColor); + UGL.DrawLine(vh, pos2, tickPos, tickWidth, tickColor); } } currAngle += scaleWidth; diff --git a/Runtime/Component/Axis/RadiusAxis/RadiusAxisHandler.cs b/Runtime/Component/Axis/RadiusAxis/RadiusAxisHandler.cs index 2eb27023..8c227a20 100644 --- a/Runtime/Component/Axis/RadiusAxis/RadiusAxisHandler.cs +++ b/Runtime/Component/Axis/RadiusAxis/RadiusAxisHandler.cs @@ -135,6 +135,10 @@ namespace XCharts.Runtime var tickLength = axis.axisTick.GetLength(chart.theme.axis.tickLength); var tickVector = ChartHelper.GetVertialDire(dire) * (tickLength + axis.axisLabel.distance); + if (axis.IsCategory()) + { + totalWidth += polar.context.radius / axis.data.Count / 2; + } return ChartHelper.GetPos(cenPos, totalWidth, startAngle, true) + tickVector; } diff --git a/Runtime/Component/Tooltip/TooltipHandler.cs b/Runtime/Component/Tooltip/TooltipHandler.cs index 372305d9..1572b9f2 100644 --- a/Runtime/Component/Tooltip/TooltipHandler.cs +++ b/Runtime/Component/Tooltip/TooltipHandler.cs @@ -647,10 +647,10 @@ namespace XCharts.Runtime var lineWidth = tooltip.lineStyle.GetWidth(theme.tooltip.lineWidth); var cenPos = m_Polar.context.center; var radius = m_Polar.context.outsideRadius; - var sp = m_Polar.context.center; var tooltipAngle = m_AngleAxis.GetValueAngle(tooltip.context.angle); - var ep = ChartHelper.GetPos(sp, radius, tooltipAngle, true); + var sp = ChartHelper.GetPos(m_Polar.context.center, m_Polar.context.insideRadius, tooltipAngle, true); + var ep = ChartHelper.GetPos(m_Polar.context.center, m_Polar.context.outsideRadius, tooltipAngle, true); switch (tooltip.type) { diff --git a/Runtime/Coord/Polar/PolarHelper.cs b/Runtime/Coord/Polar/PolarHelper.cs index 8cfc7196..f80f5216 100644 --- a/Runtime/Coord/Polar/PolarHelper.cs +++ b/Runtime/Coord/Polar/PolarHelper.cs @@ -12,8 +12,16 @@ namespace XCharts.Runtime var minWidth = Mathf.Min(chartWidth, chartHeight); polar.context.center = chartPosition + new Vector3(centerX, centerY); - polar.context.insideRadius = polar.radius[0] <= 1 ? minWidth * polar.radius[0] : polar.radius[0]; - polar.context.outsideRadius = polar.radius[1] <= 1 ? minWidth * polar.radius[1] : polar.radius[1]; + polar.context.insideRadius = polar.context.outsideRadius = 0; + if (polar.radius.Length >= 2) + { + polar.context.insideRadius = ChartHelper.GetActualValue(polar.radius[0], minWidth, 1); + polar.context.outsideRadius = ChartHelper.GetActualValue(polar.radius[1], minWidth, 1); + } + else if (polar.radius.Length >= 1) + { + polar.context.outsideRadius = ChartHelper.GetActualValue(polar.radius[0], minWidth, 1); + } polar.context.radius = polar.context.outsideRadius - polar.context.insideRadius; } diff --git a/Runtime/Serie/Bar/BarHandler.PolarCoord.cs b/Runtime/Serie/Bar/BarHandler.PolarCoord.cs index f44f0ee4..f4688f57 100644 --- a/Runtime/Serie/Bar/BarHandler.PolarCoord.cs +++ b/Runtime/Serie/Bar/BarHandler.PolarCoord.cs @@ -126,32 +126,63 @@ namespace XCharts.Runtime SeriesHelper.UpdateStackDataList(chart.series, serie, null, m_StackSerieData); var barCount = chart.GetSerieBarRealCount(); - float categoryWidth = AxisHelper.GetDataWidth(m_AngleAxis, 360, datas.Count, null); - float barGap = chart.GetSerieBarGap(); - float totalBarWidth = chart.GetSerieTotalWidth(categoryWidth, barGap, barCount); - 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 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 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 areaColor = ColorUtil.clearColor32; var areaToColor = ColorUtil.clearColor32; var interacting = false; + float start, end; + float inside, outside; + double radiusValue, angleValue; for (int i = 0; i < datas.Count; i++) { if (serie.animation.CheckDetailBreak(i)) break; var serieData = datas[i]; - var value = serieData.GetData(1); - var start = startAngle + categoryWidth * i + offset; - var end = start + barWidth; var itemStyle = SerieHelper.GetItemStyle(serie, serieData); var borderWidth = itemStyle.borderWidth; var borderColor = itemStyle.borderColor; + radiusValue = serieData.GetData(0); + angleValue = serieData.GetData(1); + if (m_AngleAxis.IsCategory()) + { + start = (float) (startAngle + categoryWidth * angleValue + gap); + end = start + barWidth; + inside = m_SeriePolar.context.insideRadius; + if (isStack) + { + for (int n = 0; n < m_StackSerieData.Count - 1; n++) + inside += m_StackSerieData[n][i].context.stackHeight; + } + outside = inside + m_RadiusAxis.GetValueLength(radiusValue, m_SeriePolar.context.radius); + serieData.context.stackHeight = outside - inside; + } + else + { + start = startAngle; + if (isStack) + { + for (int n = 0; n < m_StackSerieData.Count - 1; n++) + start += m_StackSerieData[n][i].context.stackHeight; + } + end = startAngle + m_AngleAxis.GetValueLength(angleValue, 360); + serieData.context.stackHeight = end - start; + inside = m_SeriePolar.context.insideRadius + categoryWidth * (float) radiusValue + gap; + outside = inside + barWidth; + } serieData.context.startAngle = start; serieData.context.toAngle = end; + serieData.context.halfAngle = (start + end) / 2; if (!serieData.interact.TryGetColor(ref areaColor, ref areaToColor, ref interacting)) { @@ -159,13 +190,12 @@ namespace XCharts.Runtime serieData.interact.SetColor(ref interacting, areaColor, areaToColor); } - var inside = m_SeriePolar.context.insideRadius; - var outside = inside + m_RadiusAxis.GetValueLength(value, m_SeriePolar.context.radius); var needRoundCap = serie.roundCap && inside > 0; serieData.context.insideRadius = inside; serieData.context.outsideRadius = outside; - serieData.context.position = ChartHelper.GetPosition(m_SeriePolar.context.center, (inside + outside) / 2, outside); + serieData.context.areaCenter = m_SeriePolar.context.center; + serieData.context.position = ChartHelper.GetPosition(m_SeriePolar.context.center, (start + end) / 2, (inside + outside) / 2); UGL.DrawDoughnut(vh, m_SeriePolar.context.center, inside, outside, areaColor, areaToColor, ColorUtil.clearColor32, start, end, borderWidth, borderColor, serie.gap / 2, chart.settings.cicleSmoothness, diff --git a/Runtime/Serie/Bar/BarHandler.cs b/Runtime/Serie/Bar/BarHandler.cs index 8537a821..c3c70c0f 100644 --- a/Runtime/Serie/Bar/BarHandler.cs +++ b/Runtime/Serie/Bar/BarHandler.cs @@ -44,16 +44,37 @@ namespace XCharts.Runtime public override Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label) { - switch (label.position) + if (serie.IsUseCoord()) { - case LabelStyle.Position.Bottom: - var center = serieData.context.rect.center; - return new Vector3(center.x, center.y - serieData.context.rect.height / 2); - case LabelStyle.Position.Center: - case LabelStyle.Position.Inside: - return serieData.context.rect.center; - default: - return serieData.context.position; + switch (label.position) + { + case LabelStyle.Position.Bottom: + var center = serieData.context.areaCenter; + var angle = serieData.context.halfAngle; + var radius = serieData.context.insideRadius; + return ChartHelper.GetPosition(center, angle, radius); + case LabelStyle.Position.Top: + center = serieData.context.areaCenter; + angle = serieData.context.halfAngle; + radius = serieData.context.outsideRadius; + return ChartHelper.GetPosition(center, angle, radius); + default: + return serieData.context.position; + } + } + else + { + switch (label.position) + { + case LabelStyle.Position.Bottom: + var center = serieData.context.rect.center; + return new Vector3(center.x, center.y - serieData.context.rect.height / 2); + case LabelStyle.Position.Center: + case LabelStyle.Position.Inside: + return serieData.context.rect.center; + default: + return serieData.context.position; + } } } @@ -137,14 +158,15 @@ namespace XCharts.Runtime Axis axis; Axis relativedAxis; var isY = chart.GetSerieGridCoordAxis(serie, out axis, out relativedAxis); - m_SerieGrid = chart.GetChartComponent(axis.gridIndex); - if (axis == null) return; if (relativedAxis == null) return; + + m_SerieGrid = chart.GetChartComponent(axis.gridIndex); if (m_SerieGrid == null) return; + var dataZoom = chart.GetDataZoomOfAxis(axis); var showData = serie.GetDataList(dataZoom); diff --git a/Runtime/Serie/SeriesHelper.cs b/Runtime/Serie/SeriesHelper.cs index c2bb721f..4055b8f1 100644 --- a/Runtime/Serie/SeriesHelper.cs +++ b/Runtime/Serie/SeriesHelper.cs @@ -330,7 +330,7 @@ namespace XCharts.Runtime double max = double.MinValue; var series = chart.series; var isPercentStack = SeriesHelper.IsPercentStack(series); - if (!SeriesHelper.IsStack(series) || (isValueAxis && !yValue)) + if (!SeriesHelper.IsStack(series)) { for (int i = 0; i < series.Count; i++) {