[improve][serie] improve min-max data range

This commit is contained in:
monitor1394
2022-08-29 23:02:03 +08:00
parent 6710a52950
commit 5f16685b64
7 changed files with 39 additions and 19 deletions

View File

@@ -58,6 +58,8 @@
## master ## master
* (2022.08.29) 优化`BarChart`在数据过密时的默认表现
* (2022.08.29) 优化`DataZoom`下Y轴的最大最小值计算
* (2022.08.29) 优化`CandlestickChart`大量数据绘制 * (2022.08.29) 优化`CandlestickChart`大量数据绘制
* (2022.08.28) 修复`LineChart`在堆叠和自定义Y轴范围的情况下显示不正常的问题 * (2022.08.28) 修复`LineChart`在堆叠和自定义Y轴范围的情况下显示不正常的问题
* (2022.08.26) 增加`Legend`新图标类型`Candlestick` * (2022.08.26) 增加`Legend`新图标类型`Candlestick`

View File

@@ -29,7 +29,7 @@ namespace XCharts.Runtime
if (axis.IsCategory() || !axis.show) return; if (axis.IsCategory() || !axis.show) return;
double tempMinValue = 0; double tempMinValue = 0;
double tempMaxValue = 0; double tempMaxValue = 0;
SeriesHelper.GetYMinMaxValue(chart.series, null, axis.polarIndex, true, axis.inverse, out tempMinValue, SeriesHelper.GetYMinMaxValue(chart, axis.polarIndex, true, axis.inverse, out tempMinValue,
out tempMaxValue, true); out tempMaxValue, true);
AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true); AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true);
if (tempMinValue != axis.context.minValue || tempMaxValue != axis.context.maxValue) if (tempMinValue != axis.context.minValue || tempMaxValue != axis.context.maxValue)

View File

@@ -50,7 +50,7 @@ namespace XCharts.Runtime
if (axis.IsCategory() || !axis.show) return; if (axis.IsCategory() || !axis.show) return;
double tempMinValue = 0; double tempMinValue = 0;
double tempMaxValue = 0; double tempMaxValue = 0;
SeriesHelper.GetXMinMaxValue(chart.series, null, axis.polarIndex, true, axis.inverse, out tempMinValue, SeriesHelper.GetXMinMaxValue(chart, axis.polarIndex, true, axis.inverse, out tempMinValue,
out tempMaxValue, true); out tempMaxValue, true);
AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true); AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true);
if (tempMinValue != axis.context.minValue || tempMaxValue != axis.context.maxValue) if (tempMinValue != axis.context.minValue || tempMaxValue != axis.context.maxValue)

View File

@@ -464,7 +464,7 @@ namespace XCharts.Runtime
Vector3 np = Vector3.zero; Vector3 np = Vector3.zero;
double minValue = 0; double minValue = 0;
double maxValue = 0; double maxValue = 0;
SeriesHelper.GetYMinMaxValue(chart.series, null, 0, chart.IsAllAxisValue(), axis.inverse, out minValue, out maxValue); SeriesHelper.GetYMinMaxValue(chart, 0, chart.IsAllAxisValue(), axis.inverse, out minValue, out maxValue, false, false);
AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue, true); AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue, true);
int rate = 1; int rate = 1;
@@ -553,7 +553,7 @@ namespace XCharts.Runtime
Vector3 np = Vector3.zero; Vector3 np = Vector3.zero;
double minValue = 0; double minValue = 0;
double maxValue = 0; double maxValue = 0;
SeriesHelper.GetYMinMaxValue(chart.series, null, 0, chart.IsAllAxisValue(), axis.inverse, out minValue, out maxValue); SeriesHelper.GetYMinMaxValue(chart, 0, chart.IsAllAxisValue(), axis.inverse, out minValue, out maxValue);
AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue, true); AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue, true);
int rate = 1; int rate = 1;

View File

@@ -349,6 +349,22 @@ namespace XCharts.Runtime
} }
} }
public DataZoom GetXDataZoomOfSerie(Serie serie)
{
if (serie == null) return null;
foreach (var component in m_Components)
{
if (component is DataZoom)
{
var dataZoom = component as DataZoom;
if (!dataZoom.enable) continue;
if (dataZoom.IsContainsXAxis(serie.xAxisIndex))
return dataZoom;
}
}
return null;
}
/// <summary> /// <summary>
/// reutrn true when all the show axis is `Value` type. /// reutrn true when all the show axis is `Value` type.
/// |纯数值坐标轴(数值轴或对数轴)。 /// |纯数值坐标轴(数值轴或对数轴)。

View File

@@ -6,8 +6,7 @@ namespace XCharts.Runtime
{ {
public partial class BaseChart public partial class BaseChart
{ {
public virtual void InitAxisRuntimeData(Axis axis) public virtual void InitAxisRuntimeData(Axis axis) { }
{ }
public virtual void GetSeriesMinMaxValue(Axis axis, int axisIndex, out double tempMinValue, out double tempMaxValue) public virtual void GetSeriesMinMaxValue(Axis axis, int axisIndex, out double tempMinValue, out double tempMaxValue)
{ {
@@ -15,16 +14,16 @@ namespace XCharts.Runtime
{ {
if (axis is XAxis) if (axis is XAxis)
{ {
SeriesHelper.GetXMinMaxValue(m_Series, null, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue); SeriesHelper.GetXMinMaxValue(this, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue);
} }
else else
{ {
SeriesHelper.GetYMinMaxValue(m_Series, null, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue); SeriesHelper.GetYMinMaxValue(this, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue);
} }
} }
else else
{ {
SeriesHelper.GetYMinMaxValue(m_Series, null, axisIndex, false, axis.inverse, out tempMinValue, out tempMaxValue); SeriesHelper.GetYMinMaxValue(this, axisIndex, false, axis.inverse, out tempMinValue, out tempMaxValue);
} }
AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true); AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true);
} }

View File

@@ -300,10 +300,10 @@ namespace XCharts.Runtime
/// <param name="axisIndex"></param> /// <param name="axisIndex"></param>
/// <param name="minVaule"></param> /// <param name="minVaule"></param>
/// <param name="maxValue"></param> /// <param name="maxValue"></param>
public static void GetXMinMaxValue(List<Serie> series, DataZoom dataZoom, int axisIndex, bool isValueAxis, public static void GetXMinMaxValue(BaseChart chart, int axisIndex, bool isValueAxis,
bool inverse, out double minVaule, out double maxValue, bool isPolar = false) bool inverse, out double minVaule, out double maxValue, bool isPolar = false, bool filterByDataZoom = true)
{ {
GetMinMaxValue(series, dataZoom, axisIndex, isValueAxis, inverse, false, out minVaule, out maxValue, isPolar); GetMinMaxValue(chart, axisIndex, isValueAxis, inverse, false, out minVaule, out maxValue, isPolar, filterByDataZoom);
} }
/// <summary> /// <summary>
@@ -313,19 +313,22 @@ namespace XCharts.Runtime
/// <param name="axisIndex"></param> /// <param name="axisIndex"></param>
/// <param name="minVaule"></param> /// <param name="minVaule"></param>
/// <param name="maxValue"></param> /// <param name="maxValue"></param>
public static void GetYMinMaxValue(List<Serie> series, DataZoom dataZoom, int axisIndex, bool isValueAxis, public static void GetYMinMaxValue(BaseChart chart, int axisIndex, bool isValueAxis,
bool inverse, out double minVaule, out double maxValue, bool isPolar = false) bool inverse, out double minVaule, out double maxValue, bool isPolar = false, bool filterByDataZoom = true)
{ {
GetMinMaxValue(series, dataZoom, axisIndex, isValueAxis, inverse, true, out minVaule, out maxValue, isPolar); GetMinMaxValue(chart, axisIndex, isValueAxis, inverse, true, out minVaule, out maxValue, isPolar, filterByDataZoom);
} }
private static Dictionary<int, List<Serie>> _stackSeriesForMinMax = new Dictionary<int, List<Serie>>(); private static Dictionary<int, List<Serie>> _stackSeriesForMinMax = new Dictionary<int, List<Serie>>();
private static Dictionary<int, double> _serieTotalValueForMinMax = new Dictionary<int, double>(); private static Dictionary<int, double> _serieTotalValueForMinMax = new Dictionary<int, double>();
public static void GetMinMaxValue(List<Serie> series, DataZoom dataZoom, int axisIndex, bool isValueAxis, private static DataZoom xDataZoom, yDataZoom;
bool inverse, bool yValue, out double minVaule, out double maxValue, bool isPolar = false) public static void GetMinMaxValue(BaseChart chart, int axisIndex, bool isValueAxis,
bool inverse, bool yValue, out double minVaule, out double maxValue, bool isPolar = false,
bool filterByDataZoom = true)
{ {
double min = double.MaxValue; double min = double.MaxValue;
double max = double.MinValue; double max = double.MinValue;
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) || (isValueAxis && !yValue))
{ {
@@ -343,7 +346,7 @@ namespace XCharts.Runtime
} }
else else
{ {
var showData = serie.GetDataList(dataZoom); var showData = serie.GetDataList(filterByDataZoom?chart.GetXDataZoomOfSerie(serie) : null);
if (serie is Candlestick || serie is SimplifiedCandlestick) if (serie is Candlestick || serie is SimplifiedCandlestick)
{ {
foreach (var data in showData) foreach (var data in showData)
@@ -381,7 +384,7 @@ namespace XCharts.Runtime
if ((isPolar && serie.polarIndex != axisIndex) || if ((isPolar && serie.polarIndex != axisIndex) ||
(!isPolar && serie.yAxisIndex != axisIndex) || (!isPolar && serie.yAxisIndex != axisIndex) ||
!serie.show) continue; !serie.show) continue;
var showData = serie.GetDataList(dataZoom); var showData = serie.GetDataList(filterByDataZoom?chart.GetXDataZoomOfSerie(serie) : null);
if (SeriesHelper.IsPercentStack<Bar>(series, serie.stack)) if (SeriesHelper.IsPercentStack<Bar>(series, serie.stack))
{ {
for (int j = 0; j < showData.Count; j++) for (int j = 0; j < showData.Count; j++)