LineChart和BarChart的X轴支持AxisType.Value模式

This commit is contained in:
monitor1394
2019-05-14 05:24:13 +08:00
parent 1a47dad2a1
commit e8a5d05a2d
7 changed files with 8773 additions and 784 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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);
}
}

View File

@@ -17,7 +17,8 @@ A Simple UGUI Charting Library for Unity
5. 中国地图
# 更新日志
* `LineChart``BarChart`增加负数轴支持2019.05.13
* `LineChart``BarChart`的X轴支持`AxisType.Value`模式2019.05.14
* `LineChart``BarChart`增加负数数值支持2019.05.13
* 0.2版本,重构代码,增加自定义`Editor`编辑参数支持2019.05.11