mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-29 20:58:47 +00:00
[feature][polar] support multiple bar and stack bar in polar
This commit is contained in:
@@ -58,6 +58,7 @@
|
|||||||
|
|
||||||
## master
|
## master
|
||||||
|
|
||||||
|
* (2022.09.19) 增加`PolarChart`对多柱图和堆叠柱图的支持
|
||||||
* (2022.09.16) 增加`PolarChart`对`Bar`柱图的支持
|
* (2022.09.16) 增加`PolarChart`对`Bar`柱图的支持
|
||||||
* (2022.09.14) 增加`PolarCoord`可通过`radius`设置环形极坐标的支持
|
* (2022.09.14) 增加`PolarCoord`可通过`radius`设置环形极坐标的支持
|
||||||
* (2022.09.09) 修复`Editor`下编辑参数部分组件可能不会实时刷新的问题
|
* (2022.09.09) 修复`Editor`下编辑参数部分组件可能不会实时刷新的问题
|
||||||
|
|||||||
@@ -116,11 +116,12 @@ namespace XCharts.Runtime
|
|||||||
for (int i = 1; i < size; i++)
|
for (int i = 1; i < size; i++)
|
||||||
{
|
{
|
||||||
var scaleWidth = AxisHelper.GetScaleWidth(angleAxis, total, 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)
|
if (angleAxis.show && angleAxis.splitLine.show)
|
||||||
{
|
{
|
||||||
var lineWidth = angleAxis.splitLine.GetWidth(chart.theme.axis.splitLineWidth);
|
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)
|
if (angleAxis.show && angleAxis.axisTick.show)
|
||||||
{
|
{
|
||||||
@@ -130,7 +131,7 @@ namespace XCharts.Runtime
|
|||||||
{
|
{
|
||||||
var tickY = radius + tickLength;
|
var tickY = radius + tickLength;
|
||||||
var tickPos = ChartHelper.GetPos(cenPos, tickY, currAngle, true);
|
var tickPos = ChartHelper.GetPos(cenPos, tickY, currAngle, true);
|
||||||
UGL.DrawLine(vh, pos, tickPos, tickWidth, tickColor);
|
UGL.DrawLine(vh, pos2, tickPos, tickWidth, tickColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
currAngle += scaleWidth;
|
currAngle += scaleWidth;
|
||||||
|
|||||||
@@ -135,6 +135,10 @@ namespace XCharts.Runtime
|
|||||||
var tickLength = axis.axisTick.GetLength(chart.theme.axis.tickLength);
|
var tickLength = axis.axisTick.GetLength(chart.theme.axis.tickLength);
|
||||||
var tickVector = ChartHelper.GetVertialDire(dire) *
|
var tickVector = ChartHelper.GetVertialDire(dire) *
|
||||||
(tickLength + axis.axisLabel.distance);
|
(tickLength + axis.axisLabel.distance);
|
||||||
|
if (axis.IsCategory())
|
||||||
|
{
|
||||||
|
totalWidth += polar.context.radius / axis.data.Count / 2;
|
||||||
|
}
|
||||||
return ChartHelper.GetPos(cenPos, totalWidth, startAngle, true) + tickVector;
|
return ChartHelper.GetPos(cenPos, totalWidth, startAngle, true) + tickVector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -647,10 +647,10 @@ namespace XCharts.Runtime
|
|||||||
var lineWidth = tooltip.lineStyle.GetWidth(theme.tooltip.lineWidth);
|
var lineWidth = tooltip.lineStyle.GetWidth(theme.tooltip.lineWidth);
|
||||||
var cenPos = m_Polar.context.center;
|
var cenPos = m_Polar.context.center;
|
||||||
var radius = m_Polar.context.outsideRadius;
|
var radius = m_Polar.context.outsideRadius;
|
||||||
var sp = m_Polar.context.center;
|
|
||||||
var tooltipAngle = m_AngleAxis.GetValueAngle(tooltip.context.angle);
|
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)
|
switch (tooltip.type)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,8 +12,16 @@ namespace XCharts.Runtime
|
|||||||
var minWidth = Mathf.Min(chartWidth, chartHeight);
|
var minWidth = Mathf.Min(chartWidth, chartHeight);
|
||||||
|
|
||||||
polar.context.center = chartPosition + new Vector3(centerX, centerY);
|
polar.context.center = chartPosition + new Vector3(centerX, centerY);
|
||||||
polar.context.insideRadius = polar.radius[0] <= 1 ? minWidth * polar.radius[0] : polar.radius[0];
|
polar.context.insideRadius = polar.context.outsideRadius = 0;
|
||||||
polar.context.outsideRadius = polar.radius[1] <= 1 ? minWidth * polar.radius[1] : polar.radius[1];
|
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;
|
polar.context.radius = polar.context.outsideRadius - polar.context.insideRadius;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -126,32 +126,63 @@ namespace XCharts.Runtime
|
|||||||
SeriesHelper.UpdateStackDataList(chart.series, serie, null, m_StackSerieData);
|
SeriesHelper.UpdateStackDataList(chart.series, serie, null, m_StackSerieData);
|
||||||
|
|
||||||
var barCount = chart.GetSerieBarRealCount<Bar>();
|
var barCount = chart.GetSerieBarRealCount<Bar>();
|
||||||
float categoryWidth = AxisHelper.GetDataWidth(m_AngleAxis, 360, datas.Count, null);
|
var categoryWidth = m_AngleAxis.IsCategory() ?
|
||||||
float barGap = chart.GetSerieBarGap<Bar>();
|
AxisHelper.GetDataWidth(m_AngleAxis, 360, datas.Count, null) :
|
||||||
float totalBarWidth = chart.GetSerieTotalWidth<Bar>(categoryWidth, barGap, barCount);
|
AxisHelper.GetDataWidth(m_RadiusAxis, m_SeriePolar.context.radius, datas.Count, null);
|
||||||
float barWidth = serie.GetBarWidth(categoryWidth, barCount);
|
var barGap = chart.GetSerieBarGap<Bar>();
|
||||||
float offset = (categoryWidth - totalBarWidth) * 0.5f;
|
var totalBarWidth = chart.GetSerieTotalWidth<Bar>(categoryWidth, barGap, barCount);
|
||||||
//var serieReadIndex = chart.GetSerieIndexIfStack<Bar>(serie);
|
var barWidth = serie.GetBarWidth(categoryWidth, barCount);
|
||||||
//float gap = serie.barGap == -1 ? offset : offset + chart.GetSerieTotalGap<Bar>(categoryWidth, barGap, serieReadIndex);
|
var offset = (categoryWidth - totalBarWidth) * 0.5f;
|
||||||
|
var serieReadIndex = chart.GetSerieIndexIfStack<Bar>(serie);
|
||||||
|
float gap = serie.barGap == -1 ? offset : offset + chart.GetSerieTotalGap<Bar>(categoryWidth, barGap, serieReadIndex);
|
||||||
|
|
||||||
var areaColor = ColorUtil.clearColor32;
|
var areaColor = ColorUtil.clearColor32;
|
||||||
var areaToColor = ColorUtil.clearColor32;
|
var areaToColor = ColorUtil.clearColor32;
|
||||||
var interacting = false;
|
var interacting = false;
|
||||||
|
|
||||||
|
float start, end;
|
||||||
|
float inside, outside;
|
||||||
|
double radiusValue, angleValue;
|
||||||
for (int i = 0; i < datas.Count; i++)
|
for (int i = 0; i < datas.Count; i++)
|
||||||
{
|
{
|
||||||
if (serie.animation.CheckDetailBreak(i))
|
if (serie.animation.CheckDetailBreak(i))
|
||||||
break;
|
break;
|
||||||
var serieData = datas[i];
|
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 itemStyle = SerieHelper.GetItemStyle(serie, serieData);
|
||||||
var borderWidth = itemStyle.borderWidth;
|
var borderWidth = itemStyle.borderWidth;
|
||||||
var borderColor = itemStyle.borderColor;
|
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.startAngle = start;
|
||||||
serieData.context.toAngle = end;
|
serieData.context.toAngle = end;
|
||||||
|
serieData.context.halfAngle = (start + end) / 2;
|
||||||
|
|
||||||
if (!serieData.interact.TryGetColor(ref areaColor, ref areaToColor, ref interacting))
|
if (!serieData.interact.TryGetColor(ref areaColor, ref areaToColor, ref interacting))
|
||||||
{
|
{
|
||||||
@@ -159,13 +190,12 @@ namespace XCharts.Runtime
|
|||||||
serieData.interact.SetColor(ref interacting, areaColor, areaToColor);
|
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;
|
var needRoundCap = serie.roundCap && inside > 0;
|
||||||
|
|
||||||
serieData.context.insideRadius = inside;
|
serieData.context.insideRadius = inside;
|
||||||
serieData.context.outsideRadius = outside;
|
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,
|
UGL.DrawDoughnut(vh, m_SeriePolar.context.center, inside, outside, areaColor, areaToColor,
|
||||||
ColorUtil.clearColor32, start, end, borderWidth, borderColor, serie.gap / 2, chart.settings.cicleSmoothness,
|
ColorUtil.clearColor32, start, end, borderWidth, borderColor, serie.gap / 2, chart.settings.cicleSmoothness,
|
||||||
|
|||||||
@@ -44,16 +44,37 @@ namespace XCharts.Runtime
|
|||||||
|
|
||||||
public override Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)
|
public override Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)
|
||||||
{
|
{
|
||||||
switch (label.position)
|
if (serie.IsUseCoord<PolarCoord>())
|
||||||
{
|
{
|
||||||
case LabelStyle.Position.Bottom:
|
switch (label.position)
|
||||||
var center = serieData.context.rect.center;
|
{
|
||||||
return new Vector3(center.x, center.y - serieData.context.rect.height / 2);
|
case LabelStyle.Position.Bottom:
|
||||||
case LabelStyle.Position.Center:
|
var center = serieData.context.areaCenter;
|
||||||
case LabelStyle.Position.Inside:
|
var angle = serieData.context.halfAngle;
|
||||||
return serieData.context.rect.center;
|
var radius = serieData.context.insideRadius;
|
||||||
default:
|
return ChartHelper.GetPosition(center, angle, radius);
|
||||||
return serieData.context.position;
|
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 axis;
|
||||||
Axis relativedAxis;
|
Axis relativedAxis;
|
||||||
var isY = chart.GetSerieGridCoordAxis(serie, out axis, out relativedAxis);
|
var isY = chart.GetSerieGridCoordAxis(serie, out axis, out relativedAxis);
|
||||||
m_SerieGrid = chart.GetChartComponent<GridCoord>(axis.gridIndex);
|
|
||||||
|
|
||||||
if (axis == null)
|
if (axis == null)
|
||||||
return;
|
return;
|
||||||
if (relativedAxis == null)
|
if (relativedAxis == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
m_SerieGrid = chart.GetChartComponent<GridCoord>(axis.gridIndex);
|
||||||
if (m_SerieGrid == null)
|
if (m_SerieGrid == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var dataZoom = chart.GetDataZoomOfAxis(axis);
|
var dataZoom = chart.GetDataZoomOfAxis(axis);
|
||||||
var showData = serie.GetDataList(dataZoom);
|
var showData = serie.GetDataList(dataZoom);
|
||||||
|
|
||||||
|
|||||||
@@ -330,7 +330,7 @@ namespace XCharts.Runtime
|
|||||||
double max = double.MinValue;
|
double max = double.MinValue;
|
||||||
var series = chart.series;
|
var series = chart.series;
|
||||||
var isPercentStack = SeriesHelper.IsPercentStack<Bar>(series);
|
var isPercentStack = SeriesHelper.IsPercentStack<Bar>(series);
|
||||||
if (!SeriesHelper.IsStack(series) || (isValueAxis && !yValue))
|
if (!SeriesHelper.IsStack(series))
|
||||||
{
|
{
|
||||||
for (int i = 0; i < series.Count; i++)
|
for (int i = 0; i < series.Count; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user