diff --git a/Runtime/Component/Main/Axis.cs b/Runtime/Component/Main/Axis.cs index d5b4be8b..0d9c501c 100644 --- a/Runtime/Component/Main/Axis.cs +++ b/Runtime/Component/Main/Axis.cs @@ -422,11 +422,12 @@ namespace XCharts /// /// /// - public float GetDataWidth(float coordinateWidth, DataZoom dataZoom) + public float GetDataWidth(float coordinateWidth, int dataCount, DataZoom dataZoom) { - var dataCount = GetDataNumber(dataZoom); - int segment = (m_BoundaryGap ? dataCount : dataCount - 1); - segment = segment <= 0 ? 1 : segment; + if (dataCount < 1) dataCount = 1; + var categoryCount = GetDataNumber(dataZoom); + int segment = (m_BoundaryGap ? categoryCount : categoryCount - 1); + segment = segment <= 0 ? dataCount : segment; return coordinateWidth / segment; } @@ -578,6 +579,13 @@ namespace XCharts } } + internal bool NeedShowSplit() + { + if (!show) return false; + if (IsCategory() && data.Count <= 0) return false; + else return true; + } + /// /// 调整最大最小值 /// diff --git a/Runtime/Internal/CoordinateChart.cs b/Runtime/Internal/CoordinateChart.cs index 20b9c7c4..fc25a548 100644 --- a/Runtime/Internal/CoordinateChart.cs +++ b/Runtime/Internal/CoordinateChart.cs @@ -146,6 +146,7 @@ namespace XCharts else { var isCartesian = IsValue(); + int dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0; for (int i = 0; i < m_XAxises.Count; i++) { var xAxis = m_XAxises[i]; @@ -189,7 +190,7 @@ namespace XCharts for (int j = 0; j < xAxis.GetDataNumber(m_DataZoom); j++) { - float splitWid = xAxis.GetDataWidth(coordinateWidth, m_DataZoom); + float splitWid = xAxis.GetDataWidth(coordinateWidth, dataCount, m_DataZoom); float pX = coordinateX + j * splitWid; if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) || (!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2))) @@ -201,7 +202,7 @@ namespace XCharts } for (int j = 0; j < yAxis.GetDataNumber(m_DataZoom); j++) { - float splitWid = yAxis.GetDataWidth(coordinateHeight, m_DataZoom); + float splitWid = yAxis.GetDataWidth(coordinateHeight, dataCount, m_DataZoom); float pY = coordinateY + j * splitWid; if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) || (!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2))) @@ -218,7 +219,7 @@ namespace XCharts m_Tooltip.yValues[i] = value; for (int j = 0; j < xAxis.GetDataNumber(m_DataZoom); j++) { - float splitWid = xAxis.GetDataWidth(coordinateWidth, m_DataZoom); + float splitWid = xAxis.GetDataWidth(coordinateWidth, dataCount, m_DataZoom); float pX = coordinateX + j * splitWid; if ((xAxis.boundaryGap && (local.x > pX && local.x <= pX + splitWid)) || (!xAxis.boundaryGap && (local.x > pX - splitWid / 2 && local.x <= pX + splitWid / 2))) @@ -236,7 +237,7 @@ namespace XCharts m_Tooltip.xValues[i] = value; for (int j = 0; j < yAxis.GetDataNumber(m_DataZoom); j++) { - float splitWid = yAxis.GetDataWidth(coordinateHeight, m_DataZoom); + float splitWid = yAxis.GetDataWidth(coordinateHeight, dataCount, m_DataZoom); float pY = coordinateY + j * splitWid; if ((yAxis.boundaryGap && (local.y > pY && local.y <= pY + splitWid)) || (!yAxis.boundaryGap && (local.y > pY - splitWid / 2 && local.y <= pY + splitWid / 2))) @@ -328,7 +329,7 @@ namespace XCharts sb.Append("\n") .Append("● ") .Append(key).Append(!string.IsNullOrEmpty(key) ? " : " : "") - .Append(ChartCached.FloatToStr(yValue,0,m_Tooltip.forceENotation)); + .Append(ChartCached.FloatToStr(yValue, 0, m_Tooltip.forceENotation)); } } } @@ -929,7 +930,7 @@ namespace XCharts private void DrawXAxisTickAndSplit(VertexHelper vh, int xAxisIndex, XAxis xAxis) { - if (xAxis.show) + if (xAxis.NeedShowSplit()) { var size = xAxis.GetScaleNumber(coordinateWidth, m_DataZoom); var totalWidth = coordinateX; @@ -1115,13 +1116,13 @@ namespace XCharts { if (!m_Tooltip.show || !m_Tooltip.IsSelected()) return; if (m_Tooltip.type == Tooltip.Type.None) return; - + int dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0; for (int i = 0; i < m_XAxises.Count; i++) { var xAxis = m_XAxises[i]; var yAxis = m_YAxises[i]; if (!xAxis.show) continue; - float splitWidth = xAxis.GetDataWidth(coordinateWidth, m_DataZoom); + float splitWidth = xAxis.GetDataWidth(coordinateWidth, dataCount, m_DataZoom); switch (m_Tooltip.type) { case Tooltip.Type.Corss: @@ -1159,13 +1160,13 @@ namespace XCharts { if (!m_Tooltip.show || !m_Tooltip.IsSelected()) return; if (m_Tooltip.type == Tooltip.Type.None) return; - + int dataCount = m_Series.list.Count > 0 ? m_Series.list[0].GetDataList(dataZoom).Count : 0; for (int i = 0; i < m_YAxises.Count; i++) { var yAxis = m_YAxises[i]; var xAxis = m_XAxises[i]; if (!yAxis.show) continue; - float splitWidth = yAxis.GetDataWidth(coordinateHeight, m_DataZoom); + float splitWidth = yAxis.GetDataWidth(coordinateHeight, dataCount, m_DataZoom); switch (m_Tooltip.type) { case Tooltip.Type.Corss: diff --git a/Runtime/Internal/CoordinateChart_DrawBar.cs b/Runtime/Internal/CoordinateChart_DrawBar.cs index 27d9feee..6fefa517 100644 --- a/Runtime/Internal/CoordinateChart_DrawBar.cs +++ b/Runtime/Internal/CoordinateChart_DrawBar.cs @@ -22,7 +22,8 @@ namespace XCharts var yAxis = m_YAxises[serie.axisIndex]; if (!yAxis.show) yAxis = m_YAxises[(serie.axisIndex + 1) % m_YAxises.Count]; - float categoryWidth = yAxis.GetDataWidth(coordinateHeight, m_DataZoom); + var showData = serie.GetDataList(m_DataZoom); + float categoryWidth = yAxis.GetDataWidth(coordinateHeight,showData.Count, m_DataZoom); float barGap = GetBarGap(); float totalBarWidth = GetBarTotalWidth(categoryWidth, barGap); float barWidth = serie.GetBarWidth(categoryWidth); @@ -30,7 +31,7 @@ namespace XCharts float barGapWidth = barWidth + barWidth * barGap; float space = serie.barGap == -1 ? offset : offset + m_BarLastOffset; - var showData = serie.GetDataList(m_DataZoom); + int maxCount = serie.maxShow > 0 ? (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) : showData.Count; @@ -131,7 +132,7 @@ namespace XCharts var xAxis = m_XAxises[serie.axisIndex]; if (!xAxis.show) xAxis = m_XAxises[(serie.axisIndex + 1) % m_XAxises.Count]; - float categoryWidth = xAxis.GetDataWidth(coordinateWidth, m_DataZoom); + float categoryWidth = xAxis.GetDataWidth(coordinateWidth,showData.Count, m_DataZoom); float barGap = GetBarGap(); float totalBarWidth = GetBarTotalWidth(categoryWidth, barGap); float barWidth = serie.GetBarWidth(categoryWidth); diff --git a/Runtime/Internal/CoordinateChart_DrawLine.cs b/Runtime/Internal/CoordinateChart_DrawLine.cs index 4075b30c..fa0d56cc 100644 --- a/Runtime/Internal/CoordinateChart_DrawLine.cs +++ b/Runtime/Internal/CoordinateChart_DrawLine.cs @@ -91,7 +91,7 @@ namespace XCharts var zeroPos = new Vector3(coordinateX, coordinateY + yAxis.zeroYOffset); var isStack = m_Series.IsStack(serie.stack, SerieType.Line); if (!xAxis.show) xAxis = m_XAxises[(serie.axisIndex + 1) % m_XAxises.Count]; - float scaleWid = xAxis.GetDataWidth(coordinateWidth, m_DataZoom); + float scaleWid = xAxis.GetDataWidth(coordinateWidth, showData.Count, m_DataZoom); float startX = coordinateX + (xAxis.boundaryGap ? scaleWid / 2 : 0); int maxCount = serie.maxShow > 0 ? (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) @@ -330,7 +330,7 @@ namespace XCharts var zeroPos = new Vector3(coordinateX + xAxis.zeroXOffset, coordinateY); var isStack = m_Series.IsStack(serie.stack, SerieType.Line); if (!yAxis.show) yAxis = m_YAxises[(serie.axisIndex + 1) % m_YAxises.Count]; - float scaleWid = yAxis.GetDataWidth(coordinateHeight, m_DataZoom); + float scaleWid = yAxis.GetDataWidth(coordinateHeight, showData.Count, m_DataZoom); float startY = coordinateY + (yAxis.boundaryGap ? scaleWid / 2 : 0); int maxCount = serie.maxShow > 0 ? (serie.maxShow > showData.Count ? showData.Count : serie.maxShow) diff --git a/Runtime/Utility/ChartCached.cs b/Runtime/Utility/ChartCached.cs index 4e346935..006fd1c9 100644 --- a/Runtime/Utility/ChartCached.cs +++ b/Runtime/Utility/ChartCached.cs @@ -40,7 +40,7 @@ namespace XCharts if (f == 0) valueDic[value] = forceE ? value.ToString("E") : value.ToString(); else if (f == 1) valueDic[value] = value.ToString("f1"); else if (f == 2) valueDic[value] = value.ToString("f2"); - else valueDic[value] = (f > 3 || forceE) ? value.ToString("E1") : value.ToString(GetFn(f)); + else valueDic[value] = (f > 3 || forceE) ? value.ToString("E0") : value.ToString(GetFn(f)); return valueDic[value]; } }