优化RadarChart在设置max0时可自动刷新最大值

This commit is contained in:
monitor1394
2020-05-30 09:41:46 +08:00
parent b9a11845ef
commit 2c5577f534
8 changed files with 157 additions and 40 deletions

View File

@@ -1,6 +1,7 @@
# 更新日志
* (2020.05.30) 优化`RadarChart`在设置`max``0`时可自动刷新最大值
* (2020.05.29) 修复`PieChart`设置`space`时只有一个数据时绘制异常的问题
* (2020.05.27) 修复调用`UpdateDataName()`接口时不会自动刷新的问题
* (2020.05.27) 优化`柱状图`的渐变色效果

View File

@@ -0,0 +1,80 @@
/******************************************/
/* */
/* Copyright (c) 2018 monitor1394 */
/* https://github.com/monitor1394 */
/* */
/******************************************/
using UnityEngine;
using UnityEngine.UI;
namespace XCharts.Examples
{
[DisallowMultipleComponent]
[ExecuteInEditMode]
public class Example41_RadarUpdate : MonoBehaviour
{
RadarChart chart;
int count = 0;
float max = 0;
void Awake()
{
chart = gameObject.GetComponent<RadarChart>();
if (chart == null)
{
chart = gameObject.AddComponent<RadarChart>();
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
UpdateData();
count++;
}
UpdateMax();
}
void UpdateData()
{
var serieIndex = 0;
var serie = chart.series.GetSerie(serieIndex);
if (serie == null) return;
if (serie.radarType == RadarType.Multiple)
{
for (int i = 0; i < serie.dataCount; i++)
{
var serieData = serie.GetSerieData(i);
for (int j = 0; j < serieData.data.Count; j++)
{
var value = Random.Range(10, 100);
chart.UpdateData(serieIndex, i, j, value);
}
}
}
else
{
for (int i = 0; i < serie.dataCount; i++)
{
var value = Random.Range(10, 100);
chart.UpdateData(serieIndex, i, value);
}
}
chart.title.subText = "max:" + serie.runtimeDataMax;
}
void UpdateMax()
{
var serieIndex = 0;
var serie = chart.series.GetSerie(serieIndex);
if (serie == null) return;
if (serie.runtimeDataMax != max)
{
chart.title.subText = "max:" + serie.runtimeDataMax;
max = serie.runtimeDataMax;
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7a2ad6907bd5045ec920b4f0e359535e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -205,11 +205,11 @@ namespace XCharts
m_SplitNumber = 5,
m_Indicator = true,
m_IndicatorList = new List<Indicator>(5){
new Indicator(){name="indicator1",max = 100},
new Indicator(){name="indicator2",max = 100},
new Indicator(){name="indicator3",max = 100},
new Indicator(){name="indicator4",max = 100},
new Indicator(){name="indicator5",max = 100},
new Indicator(){name="indicator1",max = 0},
new Indicator(){name="indicator2",max = 0},
new Indicator(){name="indicator3",max = 0},
new Indicator(){name="indicator4",max = 0},
new Indicator(){name="indicator5",max = 0},
}
};
radar.center[0] = 0.5f;

View File

@@ -871,9 +871,13 @@ namespace XCharts
/// </summary>
public float runtimeOutsideRadius { get; internal set; }
/// <summary>
/// 饼图的数据项最大
/// 运行时的最大数据
/// </summary>
public float runtimePieDataMax { get; internal set; }
public float runtimeDataMax { get; internal set; }
/// <summary>
/// 运行时的最小数据值
/// </summary>
public float runtimeDataMin { get; internal set; }
/// <summary>
/// 饼图的数据项之和
/// </summary>
@@ -1314,31 +1318,6 @@ namespace XCharts
}
}
/// <summary>
/// 获得指定维数的最大最小值
/// </summary>
/// <param name="dimension"></param>
/// <param name="dataZoom"></param>
/// <returns></returns>
public void GetMinMaxData(int dimension, out float minValue, out float maxValue, DataZoom dataZoom = null)
{
var dataList = GetDataList(dataZoom);
float max = float.MinValue;
float min = float.MaxValue;
for (int i = 0; i < dataList.Count; i++)
{
var serieData = dataList[i];
if (serieData.data.Count > dimension)
{
var value = serieData.data[dimension];
if (value > max) max = value;
if (value < min) min = value;
}
}
maxValue = max;
minValue = min;
}
private List<SerieData> emptyFilter = new List<SerieData>();
/// <summary>
/// 根据dataZoom更新数据列表缓存

View File

@@ -258,5 +258,53 @@ namespace XCharts
serie.runtimeInsideRadius = serie.radius[0] <= 1 ? minWidth * serie.radius[0] : serie.radius[0];
serie.runtimeOutsideRadius = serie.radius[1] <= 1 ? minWidth * serie.radius[1] : serie.radius[1];
}
/// <summary>
/// 获得指定维数的最大最小值
/// </summary>
/// <param name="dimension"></param>
/// <param name="dataZoom"></param>
/// <returns></returns>
public static void GetDimensionMinMaxData(Serie serie, int dimension, int ceilRate = 0, DataZoom dataZoom = null)
{
var dataList = serie.GetDataList(dataZoom);
float max = float.MinValue;
float min = float.MaxValue;
for (int i = 0; i < dataList.Count; i++)
{
var serieData = dataList[i];
if (serieData.show && serieData.data.Count > dimension)
{
var value = serieData.data[dimension];
if (value > max) max = value;
if (value < min) min = value;
}
}
serie.runtimeDataMin = ChartHelper.GetMinDivisibleValue(min, ceilRate);
serie.runtimeDataMax = ChartHelper.GetMaxDivisibleValue(max, ceilRate);
}
public static void GetAllMinMaxData(Serie serie, int ceilRate = 0, DataZoom dataZoom = null)
{
var dataList = serie.GetDataList(dataZoom);
float max = float.MinValue;
float min = float.MaxValue;
for (int i = 0; i < dataList.Count; i++)
{
var serieData = dataList[i];
if (serieData.show)
{
var count = serie.showDataDimension > serieData.data.Count ? serieData.data.Count : serie.showDataDimension;
for (int j = 0; j < count; j++)
{
var value = serieData.data[j];
if (value > max) max = value;
if (value < min) min = value;
}
}
}
serie.runtimeDataMin = ChartHelper.GetMinDivisibleValue(min, ceilRate);
serie.runtimeDataMax = ChartHelper.GetMaxDivisibleValue(max, ceilRate);
}
}
}

View File

@@ -65,7 +65,7 @@ namespace XCharts
}
bool isFinish = true;
if (serie.pieClickOffset) isClickOffset = true;
serie.runtimePieDataMax = serie.yMax;
serie.runtimeDataMax = serie.yMax;
serie.runtimePieDataTotal = serie.yTotal;
SerieHelper.UpdateCenter(serie, chartPosition, chartWidth, chartHeight);
@@ -105,7 +105,7 @@ namespace XCharts
serieData.runtimePieToAngle = startDegree + degree;
serieData.runtimePieOutsideRadius = serie.pieRoseType > 0 ?
serie.runtimeInsideRadius + (serie.runtimeOutsideRadius - serie.runtimeInsideRadius) * value / serie.runtimePieDataMax :
serie.runtimeInsideRadius + (serie.runtimeOutsideRadius - serie.runtimeInsideRadius) * value / serie.runtimeDataMax :
serie.runtimeOutsideRadius;
if (serieData.highlighted)
{

View File

@@ -249,6 +249,7 @@ namespace XCharts
var rate = serie.animation.GetCurrRate();
var dataChanging = false;
var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
SerieHelper.GetAllMinMaxData(serie);
for (int j = 0; j < serie.data.Count; j++)
{
var serieData = serie.data[j];
@@ -292,14 +293,12 @@ namespace XCharts
for (int n = 0; n < dataCount; n++)
{
if (n >= serieData.data.Count) break;
float min = radar.GetIndicatorMin(n);
float max = radar.GetIndicatorMax(n);
float value = serieData.GetCurrData(n, dataChangeDuration);
if (serieData.IsDataChanged()) dataChanging = true;
if (max == 0)
{
serie.GetMinMaxData(n, out min, out max);
min = radar.GetIndicatorMin(n);
max = serie.runtimeDataMax;
}
var radius = max < 0 ? radar.runtimeDataRadius - radar.runtimeDataRadius * value / max
: radar.runtimeDataRadius * value / max;
@@ -391,6 +390,7 @@ namespace XCharts
var pointList = radar.runtimeDataPosList[key];
var startIndex = GetStartShowIndex(serie);
var endIndex = GetEndShowIndex(serie);
SerieHelper.GetDimensionMinMaxData(serie, 1);
for (int j = 0; j < serie.data.Count; j++)
{
var serieData = serie.data[j];
@@ -425,14 +425,12 @@ namespace XCharts
int dataCount = radar.indicatorList.Count;
var index = serieData.index;
var p = radar.runtimeCenterPos;
var min = radar.GetIndicatorMin(index);
var max = radar.GetIndicatorMax(index);
var value = serieData.GetCurrData(1, dataChangeDuration);
if (serieData.IsDataChanged()) dataChanging = true;
if (max == 0)
{
serie.GetMinMaxData(index, out min, out max);
min = radar.GetIndicatorMin(index);
max = serie.runtimeDataMax;
}
var radius = max < 0 ? radar.runtimeDataRadius - radar.runtimeDataRadius * value / max
: radar.runtimeDataRadius * value / max;