mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-19 15:00:08 +00:00
[improve][heatmap] improve heatmap chart
This commit is contained in:
@@ -58,6 +58,7 @@
|
||||
|
||||
## master
|
||||
|
||||
* (2022.09.02) 优化`HeatmapChart`
|
||||
* (2022.08.30) 优化`RadarChart`
|
||||
* (2022.08.30) 修复`DataZoom`在某些情况下计算范围不准确的问题 (#221)
|
||||
* (2022.08.29) 优化`BarChart`在数据过密时的默认表现
|
||||
|
||||
@@ -36,9 +36,7 @@ namespace XCharts.Runtime
|
||||
Heatmap.AddDefaultSerie(this, GenerateDefaultSerieName());
|
||||
|
||||
var visualMap = GetOrAddChartComponent<VisualMap>();
|
||||
visualMap.max = 10;
|
||||
visualMap.range[0] = 0f;
|
||||
visualMap.range[1] = 10f;
|
||||
visualMap.autoMinMax = true;
|
||||
visualMap.orient = Orient.Vertical;
|
||||
visualMap.calculable = true;
|
||||
visualMap.location.align = Location.Align.BottomLeft;
|
||||
@@ -71,10 +69,7 @@ namespace XCharts.Runtime
|
||||
{
|
||||
for (int j = 0; j < ySplitNumber; j++)
|
||||
{
|
||||
var value = 0f;
|
||||
var rate = Random.Range(0, 101);
|
||||
if (rate > 70) value = Random.Range(8f, 10f);
|
||||
else value = Random.Range(1f, 8f);
|
||||
var value = Random.Range(0, 150);
|
||||
var list = new List<double> { i, j, value };
|
||||
AddData(0, list);
|
||||
}
|
||||
|
||||
@@ -241,7 +241,11 @@ namespace XCharts.Runtime
|
||||
private void UpdateAxisPointerDataIndex(Serie serie, XAxis xAxis, YAxis yAxis, GridCoord grid, bool isTriggerAxis)
|
||||
{
|
||||
serie.context.pointerAxisDataIndexs.Clear();
|
||||
if (yAxis.IsCategory())
|
||||
if (xAxis.IsCategory() && yAxis.IsCategory())
|
||||
{
|
||||
GetSerieDataByXYAxis(serie, xAxis, yAxis);
|
||||
}
|
||||
else if (yAxis.IsCategory())
|
||||
{
|
||||
if (isTriggerAxis)
|
||||
{
|
||||
@@ -277,6 +281,24 @@ namespace XCharts.Runtime
|
||||
}
|
||||
}
|
||||
|
||||
private void GetSerieDataByXYAxis(Serie serie, Axis xAxis, Axis yAxis)
|
||||
{
|
||||
var xAxisIndex = xAxis.context.pointerValue;
|
||||
var yAxisIndex = yAxis.context.pointerValue;
|
||||
serie.context.pointerItemDataIndex = -1;
|
||||
|
||||
foreach (var serieData in serie.data)
|
||||
{
|
||||
var x = serieData.GetData(0);
|
||||
var y = serieData.GetData(1);
|
||||
if (xAxisIndex == x && y == yAxisIndex)
|
||||
{
|
||||
serie.context.pointerItemDataIndex = serieData.index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void GetSerieDataIndexByAxis(Serie serie, Axis axis, GridCoord grid, int dimension = 0)
|
||||
{
|
||||
var currValue = 0d;
|
||||
@@ -418,7 +440,7 @@ namespace XCharts.Runtime
|
||||
{
|
||||
var serie = series[i];
|
||||
serie.context.isTriggerByAxis = isTriggerByAxis;
|
||||
if (isTriggerByAxis && dataIndex >= 0)
|
||||
if (isTriggerByAxis && dataIndex >= 0 && serie.context.pointerItemDataIndex < 0)
|
||||
serie.context.pointerItemDataIndex = dataIndex;
|
||||
serie.handler.UpdateTooltipSerieParams(dataIndex, showCategory, category,
|
||||
tooltip.marker, tooltip.itemFormatter, tooltip.numericFormatter,
|
||||
|
||||
@@ -81,9 +81,9 @@ namespace XCharts.Runtime
|
||||
[SerializeField] private SelectedMode m_SelectedMode = SelectedMode.Multiple;
|
||||
[SerializeField] private int m_SerieIndex = 0;
|
||||
[SerializeField] private double m_Min = 0;
|
||||
[SerializeField] private double m_Max = 100;
|
||||
[SerializeField] private double m_Max = 0;
|
||||
|
||||
[SerializeField] private double[] m_Range = new double[2] { 0, 100 };
|
||||
[SerializeField] private double[] m_Range = new double[2] { 0, 0 };
|
||||
[SerializeField] private string[] m_Text = new string[2] { "", "" };
|
||||
[SerializeField] private float[] m_TextGap = new float[2] { 10f, 10f };
|
||||
[SerializeField] private int m_SplitNumber = 5;
|
||||
@@ -364,7 +364,8 @@ namespace XCharts.Runtime
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_Range[0] < min || m_Range[0] > max) return min;
|
||||
if (m_Range[0] == 0 && m_Range[1] == 0) return min;
|
||||
else if (m_Range[0] < min || m_Range[0] > max) return min;
|
||||
else return m_Range[0];
|
||||
}
|
||||
set
|
||||
@@ -377,6 +378,7 @@ namespace XCharts.Runtime
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_Range[0] == 0 && m_Range[1] == 0) return max;
|
||||
if (m_Range[1] >= m_Range[0] && m_Range[1] < max) return m_Range[1];
|
||||
else return max;
|
||||
}
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace XCharts.Runtime
|
||||
public double pointerValue { get; set; }
|
||||
public bool minDrag { get; internal set; }
|
||||
public bool maxDrag { get; internal set; }
|
||||
public double min { get; set; }
|
||||
public double max { get; set; }
|
||||
|
||||
internal List<Color32> inRangeColors = new List<Color32>();
|
||||
|
||||
|
||||
@@ -177,15 +177,13 @@ namespace XCharts.Runtime
|
||||
return true;
|
||||
}
|
||||
|
||||
public static int GetDimension(VisualMap visualMap, int serieDataCount)
|
||||
public static int GetDimension(VisualMap visualMap, int defaultDimension)
|
||||
{
|
||||
var dimension = visualMap != null && visualMap.dimension >= 0 ?
|
||||
visualMap.dimension : serieDataCount - 1;
|
||||
if (visualMap == null || !visualMap.show)
|
||||
return defaultDimension;
|
||||
|
||||
if (dimension > serieDataCount - 1)
|
||||
dimension = serieDataCount - 1;
|
||||
|
||||
return dimension;
|
||||
return visualMap != null && visualMap.dimension >= 0 ?
|
||||
visualMap.dimension : defaultDimension;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,12 +19,6 @@ namespace XCharts.Runtime
|
||||
serie.itemStyle.show = true;
|
||||
serie.itemStyle.borderWidth = 1;
|
||||
serie.itemStyle.borderColor = Color.clear;
|
||||
|
||||
var emphasis = serie.AddExtraComponent<EmphasisStyle>();
|
||||
emphasis.show = true;
|
||||
emphasis.itemStyle.show = true;
|
||||
emphasis.itemStyle.borderWidth = 1;
|
||||
emphasis.itemStyle.borderColor = Color.black;
|
||||
return serie;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,8 @@ namespace XCharts.Runtime
|
||||
var serieData = serie.GetSerieData(dataIndex);
|
||||
if (serieData == null)
|
||||
return;
|
||||
var visualMap = chart.GetVisualMapOfSerie(serie);
|
||||
var dimension = VisualMapHelper.GetDimension(visualMap, defaultDimension);
|
||||
|
||||
if (string.IsNullOrEmpty(category))
|
||||
{
|
||||
@@ -41,13 +43,12 @@ namespace XCharts.Runtime
|
||||
if (xAxis != null)
|
||||
category = xAxis.GetData((int) serieData.GetData(0));
|
||||
}
|
||||
|
||||
title = serie.serieName;
|
||||
|
||||
var param = serie.context.param;
|
||||
param.serieName = serie.serieName;
|
||||
param.serieIndex = serie.index;
|
||||
param.dimension = defaultDimension;
|
||||
param.dimension = dimension;
|
||||
param.dataCount = serie.dataCount;
|
||||
param.serieData = serieData;
|
||||
param.color = serieData.context.color;
|
||||
@@ -58,7 +59,7 @@ namespace XCharts.Runtime
|
||||
|
||||
param.columns.Add(param.marker);
|
||||
param.columns.Add(category);
|
||||
param.columns.Add(ChartCached.NumberToStr(serieData.GetData(defaultDimension), param.numericFormatter));
|
||||
param.columns.Add(ChartCached.NumberToStr(serieData.GetData(dimension), param.numericFormatter));
|
||||
|
||||
paramList.Add(param);
|
||||
}
|
||||
@@ -121,7 +122,7 @@ namespace XCharts.Runtime
|
||||
|
||||
private void DrawHeatmapSerie(VertexHelper vh, Heatmap serie)
|
||||
{
|
||||
if (serie.animation.HasFadeOut()) return;
|
||||
if (!serie.show || serie.animation.HasFadeOut()) return;
|
||||
XAxis xAxis;
|
||||
YAxis yAxis;
|
||||
if (!chart.TryGetChartComponent<XAxis>(out xAxis, serie.xAxisIndex)) return;
|
||||
@@ -138,8 +139,6 @@ namespace XCharts.Runtime
|
||||
|
||||
var zeroX = m_SerieGrid.context.x;
|
||||
var zeroY = m_SerieGrid.context.y;
|
||||
var rangeMin = visualMap.rangeMin;
|
||||
var rangeMax = visualMap.rangeMax;
|
||||
var color = chart.theme.GetColor(serie.index);
|
||||
var borderWidth = serie.itemStyle.show ? serie.itemStyle.borderWidth : 0;
|
||||
var rectWid = xWidth - 2 * borderWidth;
|
||||
@@ -161,12 +160,21 @@ namespace XCharts.Runtime
|
||||
var dataChanging = false;
|
||||
serie.containerIndex = m_SerieGrid.index;
|
||||
serie.containterInstanceId = m_SerieGrid.instanceId;
|
||||
|
||||
var dimension = VisualMapHelper.GetDimension(visualMap, defaultDimension);
|
||||
if (visualMap.autoMinMax)
|
||||
{
|
||||
double maxValue, minValue;
|
||||
SerieHelper.GetMinMaxData(serie, dimension, out minValue, out maxValue);
|
||||
VisualMapHelper.SetMinMax(visualMap, minValue, maxValue);
|
||||
}
|
||||
var rangeMin = visualMap.rangeMin;
|
||||
var rangeMax = visualMap.rangeMax;
|
||||
for (int n = 0; n < serie.dataCount; n++)
|
||||
{
|
||||
var serieData = serie.data[n];
|
||||
var i = (int) serieData.GetData(0);
|
||||
var j = (int) serieData.GetData(1);
|
||||
var dimension = VisualMapHelper.GetDimension(visualMap, serieData.data.Count);
|
||||
if (serie.IsIgnoreValue(serieData, dimension))
|
||||
{
|
||||
serie.context.dataPoints.Add(Vector3.zero);
|
||||
@@ -184,7 +192,6 @@ namespace XCharts.Runtime
|
||||
|
||||
serieData.context.canShowLabel = false;
|
||||
serieData.context.rect = new Rect(pos.x - rectWid / 2, pos.y - rectHig / 2, rectWid, rectHig);
|
||||
if (value == 0) continue;
|
||||
if ((value < rangeMin && rangeMin != visualMap.min) ||
|
||||
(value > rangeMax && rangeMax != visualMap.max))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user