protected virtual void DrawSingAxisScatterSerie(VertexHelper vh, BaseScatter serie)
        {
            if (serie.animation.HasFadeOut())
            {
                return;
            }

            if (!serie.show)
            {
                return;
            }

            var axis = chart.GetChartComponent <SingleAxis>(serie.singleAxisIndex);

            if (axis == null)
            {
                return;
            }

            DataZoom xDataZoom;
            DataZoom yDataZoom;

            chart.GetDataZoomOfSerie(serie, out xDataZoom, out yDataZoom);

            var theme    = chart.theme;
            int maxCount = serie.maxShow > 0 ?
                           (serie.maxShow > serie.dataCount ? serie.dataCount : serie.maxShow) :
                           serie.dataCount;

            serie.animation.InitProgress(0, 1);

            var rate = serie.animation.GetCurrRate();
            var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
            var dataChanging       = false;
            var dataList           = serie.GetDataList(xDataZoom);
            var isEffectScatter    = serie is EffectScatter;
            var colorIndex         = serie.context.colorIndex;

            serie.containerIndex       = axis.index;
            serie.containterInstanceId = axis.instanceId;

            foreach (var serieData in dataList)
            {
                var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
                if (!symbol.ShowSymbol(serieData.index, maxCount))
                {
                    continue;
                }

                var highlight    = serie.highlight || serieData.context.highlight;
                var color        = SerieHelper.GetItemColor(serie, serieData, theme, colorIndex, highlight);
                var toColor      = SerieHelper.GetItemToColor(serie, serieData, theme, colorIndex, highlight);
                var emptyColor   = SerieHelper.GetItemBackgroundColor(serie, serieData, theme, colorIndex, highlight, false);
                var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, theme, highlight);
                var borderColor  = SerieHelper.GetSymbolBorderColor(serie, serieData, theme, highlight);
                var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, highlight);
                var xValue       = serieData.GetCurrData(0, dataChangeDuration, axis.inverse);

                if (serieData.IsDataChanged())
                {
                    dataChanging = true;
                }

                var pos = Vector3.zero;
                if (axis.orient == Orient.Horizonal)
                {
                    var xDataHig = GetDataHig(axis, xValue, axis.context.width);
                    var yDataHig = axis.context.height / 2;
                    pos = new Vector3(axis.context.x + xDataHig, axis.context.y + yDataHig);
                }
                else
                {
                    var yDataHig = GetDataHig(axis, xValue, axis.context.width);
                    var xDataHig = axis.context.height / 2;
                    pos = new Vector3(axis.context.x + xDataHig, axis.context.y + yDataHig);
                }
                serie.context.dataPoints.Add(pos);
                serieData.context.position = pos;

                var datas      = serieData.data;
                var symbolSize = 0f;
                if (serie.highlight || serieData.context.highlight)
                {
                    symbolSize = symbol.GetSelectedSize(datas, theme.serie.scatterSymbolSelectedSize);
                }
                else
                {
                    symbolSize = symbol.GetSize(datas, theme.serie.scatterSymbolSize);
                }
                symbolSize *= rate;

                if (isEffectScatter)
                {
                    if (symbolSize > 100)
                    {
                        symbolSize = 100;
                    }
                    for (int count = 0; count < symbol.animationSize.Count; count++)
                    {
                        var nowSize = symbol.animationSize[count];
                        color.a = (byte)(255 * (symbolSize - nowSize) / symbolSize);
                        chart.DrawSymbol(vh, symbol.type, nowSize, symbolBorder, pos,
                                         color, toColor, emptyColor, borderColor, symbol.gap, cornerRadius);
                    }
                    chart.RefreshPainter(serie);
                }
                else
                {
                    if (symbolSize > 100)
                    {
                        symbolSize = 100;
                    }
                    chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, pos,
                                     color, toColor, emptyColor, borderColor, symbol.gap, cornerRadius);
                }
            }
            if (!serie.animation.IsFinish())
            {
                serie.animation.CheckProgress(1);
                chart.RefreshPainter(serie);
            }
            if (dataChanging)
            {
                chart.RefreshPainter(serie);
            }
        }
        protected virtual void DrawScatterSerie(VertexHelper vh, BaseScatter serie)
        {
            if (serie.animation.HasFadeOut())
            {
                return;
            }

            if (!serie.show)
            {
                return;
            }

            XAxis xAxis;

            if (!chart.TryGetChartComponent <XAxis>(out xAxis, serie.xAxisIndex))
            {
                return;
            }

            YAxis yAxis;

            if (!chart.TryGetChartComponent <YAxis>(out yAxis, serie.yAxisIndex))
            {
                return;
            }

            if (!chart.TryGetChartComponent <GridCoord>(out m_Grid, xAxis.gridIndex))
            {
                return;
            }

            DataZoom xDataZoom;
            DataZoom yDataZoom;

            chart.GetDataZoomOfSerie(serie, out xDataZoom, out yDataZoom);

            var theme    = chart.theme;
            int maxCount = serie.maxShow > 0 ?
                           (serie.maxShow > serie.dataCount ? serie.dataCount : serie.maxShow) :
                           serie.dataCount;

            serie.animation.InitProgress(0, 1);
            var rate = serie.animation.GetCurrRate();
            var dataChangeDuration = serie.animation.GetUpdateAnimationDuration();
            var dataChanging       = false;
            var interacting        = false;
            var dataList           = serie.GetDataList(xDataZoom);
            var isEffectScatter    = serie is EffectScatter;
            var colorIndex         = serie.context.colorIndex;

            serie.containerIndex       = m_Grid.index;
            serie.containterInstanceId = m_Grid.instanceId;

            foreach (var serieData in dataList)
            {
                var symbol = SerieHelper.GetSerieSymbol(serie, serieData);
                if (!symbol.ShowSymbol(serieData.index, maxCount))
                {
                    continue;
                }

                var    highlight    = serie.highlight || serieData.context.highlight;
                var    color        = SerieHelper.GetItemColor(serie, serieData, theme, colorIndex, highlight);
                var    toColor      = SerieHelper.GetItemToColor(serie, serieData, theme, colorIndex, highlight);
                var    emptyColor   = SerieHelper.GetItemBackgroundColor(serie, serieData, theme, colorIndex, highlight, false);
                var    symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, theme, highlight);
                var    borderColor  = SerieHelper.GetSymbolBorderColor(serie, serieData, theme, highlight);
                var    cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, highlight);
                double xValue       = serieData.GetCurrData(0, dataChangeDuration, xAxis.inverse);
                double yValue       = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse);

                if (serieData.IsDataChanged())
                {
                    dataChanging = true;
                }

                float pX       = m_Grid.context.x + xAxis.axisLine.GetWidth(theme.axis.lineWidth);
                float pY       = m_Grid.context.y + yAxis.axisLine.GetWidth(theme.axis.lineWidth);
                float xDataHig = GetDataHig(xAxis, xValue, m_Grid.context.width);
                float yDataHig = GetDataHig(yAxis, yValue, m_Grid.context.height);
                var   pos      = new Vector3(pX + xDataHig, pY + yDataHig);

                if (!m_Grid.Contains(pos))
                {
                    continue;
                }

                serie.context.dataPoints.Add(pos);
                serieData.context.position = pos;
                var datas      = serieData.data;
                var symbolSize = serie.highlight || serieData.context.highlight ?
                                 theme.serie.scatterSymbolSelectedSize :
                                 theme.serie.scatterSymbolSize;
                if (!serieData.interact.TryGetValue(ref symbolSize, ref interacting))
                {
                    symbolSize = highlight ?
                                 symbol.GetSelectedSize(serieData.data, symbolSize) :
                                 symbol.GetSize(serieData.data, symbolSize);
                    serieData.interact.SetValue(ref interacting, symbolSize);
                }

                symbolSize *= rate;

                if (isEffectScatter)
                {
                    for (int count = 0; count < symbol.animationSize.Count; count++)
                    {
                        var nowSize = symbol.animationSize[count];
                        color.a = (byte)(255 * (symbolSize - nowSize) / symbolSize);
                        chart.DrawSymbol(vh, symbol.type, nowSize, symbolBorder, pos,
                                         color, toColor, emptyColor, borderColor, symbol.gap, cornerRadius);
                    }
                    chart.RefreshPainter(serie);
                }
                else
                {
                    if (symbolSize > 100)
                    {
                        symbolSize = 100;
                    }
                    chart.DrawSymbol(vh, symbol.type, symbolSize, symbolBorder, pos,
                                     color, toColor, emptyColor, borderColor, symbol.gap, cornerRadius);
                }
            }
            if (!serie.animation.IsFinish())
            {
                serie.animation.CheckProgress(1);
                chart.RefreshPainter(serie);
            }
            if (dataChanging || interacting)
            {
                chart.RefreshPainter(serie);
            }
        }