mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-17 22:10:11 +00:00
LineChart和BarChart的X轴支持AxisType.Value模式
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -65,7 +65,7 @@ namespace XCharts
|
||||
}
|
||||
float value = serie.data[i];
|
||||
float pX = seriesCurrHig[i] + zeroX + m_Coordinate.tickness;
|
||||
float pY = zeroY + i * scaleWid;
|
||||
float pY = coordinateY + i * scaleWid;
|
||||
if (!m_YAxis.boundaryGap) pY -= scaleWid / 2;
|
||||
float barHig = value / (maxValue - minValue) * coordinateWid;
|
||||
float space = offset + j * (barWid + m_Bar.space);
|
||||
@@ -88,10 +88,10 @@ namespace XCharts
|
||||
if (m_Tooltip.show && m_Tooltip.dataIndex > 0)
|
||||
{
|
||||
float tooltipSplitWid = scaleWid < 1 ? 1 : scaleWid;
|
||||
float pX = zeroX + coordinateWid;
|
||||
float pY = zeroY + scaleWid * (m_Tooltip.dataIndex - 1) - (m_YAxis.boundaryGap ? 0 : scaleWid / 2);
|
||||
Vector3 p1 = new Vector3(zeroX, pY);
|
||||
Vector3 p2 = new Vector3(zeroX, pY + tooltipSplitWid);
|
||||
float pX = coordinateX + coordinateWid;
|
||||
float pY = coordinateY + scaleWid * (m_Tooltip.dataIndex - 1) - (m_YAxis.boundaryGap ? 0 : scaleWid / 2);
|
||||
Vector3 p1 = new Vector3(coordinateX, pY);
|
||||
Vector3 p2 = new Vector3(coordinateX, pY + tooltipSplitWid);
|
||||
Vector3 p3 = new Vector3(pX, pY + tooltipSplitWid);
|
||||
Vector3 p4 = new Vector3(pX, pY);
|
||||
ChartHelper.DrawPolygon(vh, p1, p2, p3, p4, m_ThemeInfo.tooltipFlagAreaColor);
|
||||
@@ -148,12 +148,12 @@ namespace XCharts
|
||||
if (m_Tooltip.show && m_Tooltip.dataIndex > 0)
|
||||
{
|
||||
float tooltipSplitWid = scaleWid < 1 ? 1 : scaleWid;
|
||||
float pX = zeroX + scaleWid * (m_Tooltip.dataIndex - 1) - (m_XAxis.boundaryGap?0:scaleWid/2);
|
||||
float pY = zeroY + coordinateHig;
|
||||
Vector3 p1 = new Vector3(pX, zeroY);
|
||||
float pX = coordinateX + scaleWid * (m_Tooltip.dataIndex - 1) - (m_XAxis.boundaryGap?0:scaleWid/2);
|
||||
float pY = coordinateY + coordinateHig;
|
||||
Vector3 p1 = new Vector3(pX, coordinateY);
|
||||
Vector3 p2 = new Vector3(pX, pY);
|
||||
Vector3 p3 = new Vector3(pX + tooltipSplitWid, pY);
|
||||
Vector3 p4 = new Vector3(pX + tooltipSplitWid, zeroY);
|
||||
Vector3 p4 = new Vector3(pX + tooltipSplitWid, coordinateY);
|
||||
ChartHelper.DrawPolygon(vh, p1, p2, p3, p4, m_ThemeInfo.tooltipFlagAreaColor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,6 +109,7 @@ namespace XCharts
|
||||
|
||||
public int GetSplitNumber()
|
||||
{
|
||||
if (type == AxisType.Value) return m_SplitNumber;
|
||||
if (data.Count > 2 * m_SplitNumber || data.Count <= 0)
|
||||
return m_SplitNumber;
|
||||
else
|
||||
@@ -135,7 +136,10 @@ namespace XCharts
|
||||
if (m_Type == AxisType.Value)
|
||||
{
|
||||
float value = (minValue + (maxValue - minValue) * index / (GetSplitNumber() - 1));
|
||||
return (value).ToString();
|
||||
if (value - (int)value == 0)
|
||||
return (value).ToString();
|
||||
else
|
||||
return (value).ToString("f1");
|
||||
}
|
||||
int dataCount = data.Count;
|
||||
if (dataCount <= 0) return "";
|
||||
@@ -156,6 +160,10 @@ namespace XCharts
|
||||
|
||||
public int GetScaleNumber()
|
||||
{
|
||||
if(type == AxisType.Value)
|
||||
{
|
||||
return m_BoundaryGap ? m_SplitNumber + 1 : m_SplitNumber;
|
||||
}
|
||||
if (data.Count > 2 * splitNumber || data.Count <= 0)
|
||||
return m_BoundaryGap ? m_SplitNumber + 1 : m_SplitNumber;
|
||||
else
|
||||
|
||||
@@ -152,7 +152,7 @@ namespace XCharts
|
||||
m_Tooltip.SetActive(true);
|
||||
if (m_Series.Count == 1)
|
||||
{
|
||||
string txt = tempAxis.GetData(index) + ": " + m_Series.GetData(0,index);
|
||||
string txt = tempAxis.GetData(index) + ": " + m_Series.GetData(0, index);
|
||||
m_Tooltip.UpdateTooltipText(txt);
|
||||
}
|
||||
else
|
||||
@@ -169,7 +169,7 @@ namespace XCharts
|
||||
sb.AppendFormat("<color=#{0}>● </color>", strColor);
|
||||
sb.AppendFormat("{0}: {1}", key, value);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
m_Tooltip.UpdateTooltipText(sb.ToString());
|
||||
}
|
||||
@@ -218,7 +218,7 @@ namespace XCharts
|
||||
|
||||
public void AddXAxisData(string category)
|
||||
{
|
||||
m_XAxis.AddData(category,m_MaxCacheDataNumber);
|
||||
m_XAxis.AddData(category, m_MaxCacheDataNumber);
|
||||
OnXAxisChanged();
|
||||
}
|
||||
|
||||
@@ -238,7 +238,7 @@ namespace XCharts
|
||||
titleObject.transform.localPosition = Vector3.zero;
|
||||
ChartHelper.HideAllObject(titleObject, s_DefaultSplitNameY);
|
||||
|
||||
for (int i = 0; i < m_YAxis.splitNumber; i++)
|
||||
for (int i = 0; i < m_YAxis.GetSplitNumber(); i++)
|
||||
{
|
||||
Text txt = ChartHelper.AddTextObject(s_DefaultSplitNameY + i, titleObject.transform,
|
||||
m_ThemeInfo.font, m_ThemeInfo.textColor, TextAnchor.MiddleRight, Vector2.zero,
|
||||
@@ -261,11 +261,11 @@ namespace XCharts
|
||||
titleObject.transform.localPosition = Vector3.zero;
|
||||
ChartHelper.HideAllObject(titleObject, s_DefaultSplitNameX);
|
||||
|
||||
for (int i = 0; i < m_XAxis.splitNumber; i++)
|
||||
for (int i = 0; i < m_XAxis.GetSplitNumber(); i++)
|
||||
{
|
||||
Text txt = ChartHelper.AddTextObject(s_DefaultSplitNameX + i, titleObject.transform,
|
||||
m_ThemeInfo.font, m_ThemeInfo.textColor, TextAnchor.MiddleCenter, Vector2.zero,
|
||||
Vector2.zero, new Vector2(1, 0.5f), new Vector2(splitWidth, 20),
|
||||
Vector2.zero, new Vector2(1, 0.5f), new Vector2(splitWidth, 20),
|
||||
m_Coordinate.fontSize, m_XAxis.textRotation);
|
||||
|
||||
txt.transform.localPosition = GetSplitXPosition(splitWidth, i);
|
||||
@@ -333,7 +333,7 @@ namespace XCharts
|
||||
{
|
||||
int tempMinValue = 0;
|
||||
int tempMaxValue = 100;
|
||||
if(m_Series != null)
|
||||
if (m_Series != null)
|
||||
{
|
||||
m_Series.GetMinMaxValue(m_Legend, out tempMinValue, out tempMaxValue);
|
||||
}
|
||||
@@ -401,15 +401,17 @@ namespace XCharts
|
||||
{
|
||||
for (int i = 0; i < m_YAxis.GetScaleNumber(); i++)
|
||||
{
|
||||
float pX = coordinateX - m_YAxis.axisTick.length;
|
||||
float pX = 0;
|
||||
float pY = coordinateY + i * m_YAxis.GetScaleWidth(coordinateHig);
|
||||
if (m_YAxis.boundaryGap && m_YAxis.axisTick.alignWithLabel)
|
||||
{
|
||||
pY -= m_YAxis.GetScaleWidth(coordinateHig) / 2;
|
||||
}
|
||||
|
||||
if (m_YAxis.axisTick.show)
|
||||
{
|
||||
ChartHelper.DrawLine(vh, new Vector3(pX, pY), new Vector3(coordinateX, pY),
|
||||
pX += zeroX - m_YAxis.axisTick.length - 2;
|
||||
ChartHelper.DrawLine(vh, new Vector3(zeroX, pY), new Vector3(pX, pY),
|
||||
m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
|
||||
}
|
||||
if (m_YAxis.showSplitLine)
|
||||
@@ -437,7 +439,6 @@ namespace XCharts
|
||||
}
|
||||
if (m_XAxis.showSplitLine)
|
||||
{
|
||||
pY += coordinateY - m_XAxis.axisTick.length - 2;
|
||||
DrawSplitLine(vh, false, m_XAxis.splitLineType, new Vector3(pX, coordinateY),
|
||||
new Vector3(pX, coordinateY + coordinateHig));
|
||||
}
|
||||
@@ -448,15 +449,34 @@ namespace XCharts
|
||||
#region draw x,y axis
|
||||
if (m_YAxis.show)
|
||||
{
|
||||
ChartHelper.DrawLine(vh, new Vector3(coordinateX, coordinateY),
|
||||
new Vector3(coordinateX, coordinateY + coordinateHig), m_Coordinate.tickness,
|
||||
m_ThemeInfo.axisLineColor);
|
||||
if (m_YAxis.type == Axis.AxisType.Value)
|
||||
{
|
||||
ChartHelper.DrawLine(vh, new Vector3(coordinateX, coordinateY - m_Coordinate.tickness),
|
||||
new Vector3(coordinateX, coordinateY + coordinateHig + m_Coordinate.tickness),
|
||||
m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
|
||||
}
|
||||
else
|
||||
{
|
||||
ChartHelper.DrawLine(vh, new Vector3(zeroX, coordinateY - m_Coordinate.tickness),
|
||||
new Vector3(zeroX, coordinateY + coordinateHig + m_Coordinate.tickness),
|
||||
m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
|
||||
}
|
||||
|
||||
}
|
||||
if (m_XAxis.show)
|
||||
{
|
||||
ChartHelper.DrawLine(vh, new Vector3(zeroX - m_XAxis.axisTick.length, zeroY),
|
||||
new Vector3(zeroX + coordinateWid + 2, zeroY), m_Coordinate.tickness,
|
||||
m_ThemeInfo.axisLineColor);
|
||||
if (m_XAxis.type == Axis.AxisType.Value)
|
||||
{
|
||||
ChartHelper.DrawLine(vh, new Vector3(coordinateX - m_Coordinate.tickness, coordinateY),
|
||||
new Vector3(coordinateX + coordinateWid + m_Coordinate.tickness, coordinateY),
|
||||
m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
|
||||
}
|
||||
else
|
||||
{
|
||||
ChartHelper.DrawLine(vh, new Vector3(coordinateX - m_Coordinate.tickness, zeroY),
|
||||
new Vector3(coordinateX + coordinateWid + m_Coordinate.tickness, zeroY),
|
||||
m_Coordinate.tickness, m_ThemeInfo.axisLineColor);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -26,6 +26,19 @@ namespace XCharts
|
||||
protected override void DrawChart(VertexHelper vh)
|
||||
{
|
||||
base.DrawChart(vh);
|
||||
|
||||
if (m_XAxis.type == Axis.AxisType.Category)
|
||||
{
|
||||
DrawXCategory(vh);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawYCategory(vh);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawXCategory(VertexHelper vh)
|
||||
{
|
||||
int seriesCount = m_Series.Count;
|
||||
float scaleWid = m_XAxis.GetDataWidth(coordinateWid);
|
||||
for (int j = 0; j < seriesCount; j++)
|
||||
@@ -40,7 +53,7 @@ namespace XCharts
|
||||
int maxCount = maxShowDataNumber > 0 ?
|
||||
(maxShowDataNumber > serie.data.Count ? serie.data.Count : maxShowDataNumber)
|
||||
: serie.data.Count;
|
||||
|
||||
|
||||
for (int i = minShowDataNumber; i < maxCount; i++)
|
||||
{
|
||||
float value = serie.data[i];
|
||||
@@ -80,7 +93,7 @@ namespace XCharts
|
||||
{
|
||||
float value = serie.data[i];
|
||||
float dataHig = coordinateY + (value - minValue) / (maxValue - minValue) * coordinateHig;
|
||||
Vector3 p = new Vector3(startX + i * scaleWid,dataHig);
|
||||
Vector3 p = new Vector3(startX + i * scaleWid, dataHig);
|
||||
float pointWid = m_Line.pointWidth;
|
||||
if (m_Tooltip.show && i == m_Tooltip.dataIndex - 1)
|
||||
{
|
||||
@@ -106,8 +119,96 @@ namespace XCharts
|
||||
{
|
||||
float splitWidth = m_XAxis.GetSplitWidth(coordinateWid);
|
||||
float px = zeroX + (m_Tooltip.dataIndex - 1) * splitWidth + (m_XAxis.boundaryGap ? splitWidth / 2 : 0);
|
||||
Vector2 sp = new Vector2(px, zeroY);
|
||||
Vector2 ep = new Vector2(px, zeroY + coordinateHig);
|
||||
Vector2 sp = new Vector2(px, coordinateY);
|
||||
Vector2 ep = new Vector2(px, coordinateY + coordinateHig);
|
||||
ChartHelper.DrawLine(vh, sp, ep, m_Coordinate.tickness, m_ThemeInfo.tooltipFlagAreaColor);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawYCategory(VertexHelper vh)
|
||||
{
|
||||
int seriesCount = m_Series.Count;
|
||||
float scaleWid = m_YAxis.GetDataWidth(coordinateHig);
|
||||
for (int j = 0; j < seriesCount; j++)
|
||||
{
|
||||
if (!m_Legend.IsShowSeries(j)) continue;
|
||||
Serie serie = m_Series.series[j];
|
||||
Color32 color = m_ThemeInfo.GetColor(j);
|
||||
Vector3 lp = Vector3.zero;
|
||||
Vector3 np = Vector3.zero;
|
||||
float startY = coordinateY + (m_YAxis.boundaryGap ? scaleWid / 2 : 0);
|
||||
|
||||
int maxCount = maxShowDataNumber > 0 ?
|
||||
(maxShowDataNumber > serie.data.Count ? serie.data.Count : maxShowDataNumber)
|
||||
: serie.data.Count;
|
||||
|
||||
for (int i = minShowDataNumber; i < maxCount; i++)
|
||||
{
|
||||
float value = serie.data[i];
|
||||
float dataHig = coordinateX + (value - minValue) / (maxValue - minValue) * coordinateWid;
|
||||
np = new Vector3(dataHig,startY + i * scaleWid);
|
||||
if (i > 0)
|
||||
{
|
||||
if (m_Line.smooth)
|
||||
{
|
||||
var list = ChartHelper.GetBezierList(lp, np, m_Line.smoothStyle);
|
||||
Vector3 start, to;
|
||||
start = list[0];
|
||||
for (int k = 1; k < list.Length; k++)
|
||||
{
|
||||
to = list[k];
|
||||
ChartHelper.DrawLine(vh, start, to, m_Line.tickness, color);
|
||||
start = to;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ChartHelper.DrawLine(vh, lp, np, m_Line.tickness, color);
|
||||
if (m_Line.area)
|
||||
{
|
||||
ChartHelper.DrawPolygon(vh, lp, np, new Vector3(np.x, zeroY),
|
||||
new Vector3(lp.x, zeroY), color);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
lp = np;
|
||||
}
|
||||
// draw point
|
||||
if (m_Line.point)
|
||||
{
|
||||
for (int i = 0; i < serie.data.Count; i++)
|
||||
{
|
||||
float value = serie.data[i];
|
||||
float dataHig = coordinateX + (value - minValue) / (maxValue - minValue) * coordinateWid;
|
||||
Vector3 p = new Vector3(dataHig,startY + i * scaleWid);
|
||||
float pointWid = m_Line.pointWidth;
|
||||
if (m_Tooltip.show && i == m_Tooltip.dataIndex - 1)
|
||||
{
|
||||
pointWid = pointWid * 1.8f;
|
||||
}
|
||||
if (m_Theme == Theme.Dark)
|
||||
{
|
||||
|
||||
ChartHelper.DrawCricle(vh, p, pointWid, color,
|
||||
(int)m_Line.pointWidth * 5);
|
||||
}
|
||||
else
|
||||
{
|
||||
ChartHelper.DrawCricle(vh, p, pointWid, Color.white);
|
||||
ChartHelper.DrawDoughnut(vh, p, pointWid - m_Line.tickness,
|
||||
pointWid, 0, 360, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//draw tooltip line
|
||||
if (m_Tooltip.show && m_Tooltip.dataIndex > 0)
|
||||
{
|
||||
float splitWidth = m_YAxis.GetSplitWidth(coordinateHig);
|
||||
float pY = zeroY + (m_Tooltip.dataIndex - 1) * splitWidth + (m_YAxis.boundaryGap ? splitWidth / 2 : 0);
|
||||
Vector2 sp = new Vector2(coordinateX,pY);
|
||||
Vector2 ep = new Vector2(coordinateX + coordinateWid, pY);
|
||||
ChartHelper.DrawLine(vh, sp, ep, m_Coordinate.tickness, m_ThemeInfo.tooltipFlagAreaColor);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user