protected void AddSerieLabel(Serie serie, SerieData serieData, int count = -1)
        {
            if (m_SerieLabelRoot == null)
            {
                return;
            }
            if (count == -1)
            {
                count = serie.dataCount;
            }
            var serieLabel = SerieHelper.GetSerieLabel(serie, serieData);
            var iconStyle  = SerieHelper.GetIconStyle(serie, serieData);

            if (serie.IsPerformanceMode())
            {
                return;
            }
            if (!serieLabel.show && !iconStyle.show)
            {
                return;
            }
            if (serie.animation.enable && serie.animation.HasFadeOut())
            {
                return;
            }
            var textName = ChartCached.GetSerieLabelName(s_SerieLabelObjectName, serie.index, serieData.index);
            var color    = Color.grey;

            if (serie.type == SerieType.Pie)
            {
                color = (serieLabel.position == SerieLabel.Position.Inside) ? Color.white :
                        (Color)m_Theme.GetColor(count);
            }
            else
            {
                color = !ChartHelper.IsClearColor(serieLabel.textStyle.color) ? serieLabel.textStyle.color :
                        (Color)m_Theme.GetColor(serie.index);
            }
            var labelObj = SerieLabelPool.Get(textName, m_SerieLabelRoot.transform, serieLabel, color,
                                              iconStyle.width, iconStyle.height, theme);
            var iconImage  = labelObj.transform.Find("Icon").GetComponent <Image>();
            var isAutoSize = serieLabel.backgroundWidth == 0 || serieLabel.backgroundHeight == 0;
            var item       = new ChartLabel();

            item.SetLabel(labelObj, isAutoSize, serieLabel.paddingLeftRight, serieLabel.paddingTopBottom);
            item.SetIcon(iconImage);
            item.SetIconActive(iconStyle.show);
            serieData.labelObject = item;
        }
Example #2
0
        internal static Color32 GetItemColor(Serie serie, SerieData serieData, ChartTheme theme, int index, bool highlight)
        {
            if (serie == null)
            {
                return(ChartConst.clearColor32);
            }
            if (highlight)
            {
                var itemStyleEmphasis = GetItemStyleEmphasis(serie, serieData);
                if (itemStyleEmphasis != null && !ChartHelper.IsClearColor(itemStyleEmphasis.color))
                {
                    var color = itemStyleEmphasis.color;
                    ChartHelper.SetColorOpacity(ref color, itemStyleEmphasis.opacity);
                    return(color);
                }
            }
            var itemStyle = GetItemStyle(serie, serieData);

            if (!ChartHelper.IsClearColor(itemStyle.color))
            {
                return(itemStyle.GetColor());
            }
            else
            {
                var color = theme.GetColor(index);
                if (highlight)
                {
                    color = ChartHelper.GetHighlightColor(color);
                }
                ChartHelper.SetColorOpacity(ref color, itemStyle.opacity);
                return(color);
            }
        }
Example #3
0
        internal static Color32 GetLineColor(Serie serie, ChartTheme theme, int index, bool highlight)
        {
            Color32 color = ChartConst.clearColor32;

            if (highlight)
            {
                var itemStyleEmphasis = GetItemStyleEmphasis(serie, null);
                if (itemStyleEmphasis != null && !ChartHelper.IsClearColor(itemStyleEmphasis.color))
                {
                    color = itemStyleEmphasis.color;
                    ChartHelper.SetColorOpacity(ref color, itemStyleEmphasis.opacity);
                    return(color);
                }
            }
            if (!ChartHelper.IsClearColor(serie.lineStyle.color))
            {
                color = serie.lineStyle.GetColor();
            }
            else if (!ChartHelper.IsClearColor(serie.itemStyle.color))
            {
                color = serie.itemStyle.GetColor();
            }
            if (ChartHelper.IsClearColor(color))
            {
                color = theme.GetColor(index);
                ChartHelper.SetColorOpacity(ref color, serie.lineStyle.opacity);
            }
            if (highlight)
            {
                color = ChartHelper.GetHighlightColor(color);
            }
            return(color);
        }
Example #4
0
 public static void ResetLabel(ChartText labelObject, SerieLabel label, ChartTheme theme, int colorIndex)
 {
     if (labelObject == null)
     {
         return;
     }
     labelObject.SetColor(!ChartHelper.IsClearColor(label.textStyle.color) ? label.textStyle.color :
                          (Color)theme.GetColor(colorIndex));
     labelObject.SetFontSize(label.textStyle.GetFontSize(theme.common));
     labelObject.SetFontStyle(label.textStyle.fontStyle);
 }
Example #5
0
 public static Color GetLabelColor(Serie serie, ChartTheme theme, int index)
 {
     if (!ChartHelper.IsClearColor(serie.label.textStyle.color))
     {
         return(serie.label.textStyle.color);
     }
     else
     {
         return(theme.GetColor(index));
     }
 }
Example #6
0
        public static Color GetContentColor(int legendIndex, Legend legend, ChartTheme theme, bool active)
        {
            var textStyle = legend.textStyle;

            if (active)
            {
                if (legend.textAutoColor)
                {
                    return(theme.GetColor(legendIndex));
                }
                else
                {
                    return(!ChartHelper.IsClearColor(textStyle.color) ? textStyle.color : theme.legend.textColor);
                }
            }
            else
            {
                return(theme.legend.unableColor);
            }
        }
        internal Color32 GetPointerColor(ChartTheme theme, int serieIndex, float angle, ItemStyle itemStyle)
        {
            Color32 color;

            if (!ChartHelper.IsClearColor(itemStyle.color))
            {
                return(itemStyle.GetColor());
            }
            for (int i = 0; i < runtimeStageAngle.Count; i++)
            {
                if (angle < runtimeStageAngle[i])
                {
                    color = axisLine.stageColor[i].color;
                    ChartHelper.SetColorOpacity(ref color, itemStyle.opacity);
                    return(color);
                }
            }
            color = theme.GetColor(serieIndex);
            ChartHelper.SetColorOpacity(ref color, itemStyle.opacity);
            return(color);
        }
        public RadarAxisTheme(Theme theme) : base(theme)
        {
            m_SplitAreaColors.Clear();
            switch (theme)
            {
            case Theme.Dark:
                m_SplitAreaColors.Add(ChartTheme.GetColor("#6f6f6f"));
                m_SplitAreaColors.Add(ChartTheme.GetColor("#606060"));
                break;

            case Theme.Default:
                m_SplitAreaColors.Add(ChartTheme.GetColor("#f6f6f6"));
                m_SplitAreaColors.Add(ChartTheme.GetColor("#e7e7e7"));
                break;

            case Theme.Light:
                m_SplitAreaColors.Add(ChartTheme.GetColor("#f6f6f6"));
                m_SplitAreaColors.Add(ChartTheme.GetColor("#e7e7e7"));
                break;
            }
        }
Example #9
0
        internal static Color32 GetItemBackgroundColor(Serie serie, SerieData serieData, ChartTheme theme, int index,
                                                       bool highlight, bool useDefault = true)
        {
            var color = ChartConst.clearColor32;

            if (highlight)
            {
                var itemStyleEmphasis = GetItemStyleEmphasis(serie, serieData);
                if (itemStyleEmphasis != null && !ChartHelper.IsClearColor(itemStyleEmphasis.backgroundColor))
                {
                    color = itemStyleEmphasis.backgroundColor;
                    ChartHelper.SetColorOpacity(ref color, itemStyleEmphasis.opacity);
                    return(color);
                }
            }
            var itemStyle = GetItemStyle(serie, serieData);

            if (!ChartHelper.IsClearColor(itemStyle.backgroundColor))
            {
                color = itemStyle.backgroundColor;
                if (highlight)
                {
                    color = ChartHelper.GetHighlightColor(color);
                }
                ChartHelper.SetColorOpacity(ref color, itemStyle.opacity);
                return(color);
            }
            else if (useDefault)
            {
                color = theme.GetColor(index);
                if (highlight)
                {
                    color = ChartHelper.GetHighlightColor(color);
                }
                color.a = 50;
                return(color);
            }
            return(color);
        }
Example #10
0
        /// <summary>
        /// 替换字符串中的通配符,支持的通配符有{.}、{a}、{b}、{c}、{d}。
        /// </summary>
        /// <param name="content">要替换的字符串</param>
        /// <param name="dataIndex">选中的数据项serieData索引</param>
        /// <param name="numericFormatter">默认的数字格式化</param>
        /// <param name="serie">选中的serie</param>
        /// <param name="series">所有serie</param>
        /// <param name="theme">用来获取指定index的颜色</param>
        /// <param name="category">选中的类目,一般用在折线图和柱状图</param>
        /// <param name="dataZoom">dataZoom</param>
        /// <returns></returns>
        public static bool ReplaceContent(ref string content, int dataIndex, string numericFormatter, Serie serie, Series series,
                                          ChartTheme theme, string category = null, DataZoom dataZoom = null)
        {
            var foundDot = false;
            var mc       = s_Regex.Matches(content);

            foreach (var m in mc)
            {
                var old       = m.ToString();
                var args      = s_RegexSub.Matches(m.ToString());
                var argsCount = args.Count;
                if (argsCount <= 0)
                {
                    continue;
                }
                int  targetIndex = 0;
                char p           = GetSerieIndex(args[0].ToString(), ref targetIndex);
                if (targetIndex >= 0)
                {
                    serie = series.GetSerie(targetIndex);
                    if (serie == null)
                    {
                        continue;
                    }
                }
                else if (serie != null)
                {
                    targetIndex = serie.index;
                }
                else
                {
                    serie       = series.GetSerie(0);
                    targetIndex = 0;
                }
                if (serie == null)
                {
                    continue;
                }
                if (p == '.')
                {
                    var bIndex = targetIndex;
                    if (argsCount >= 2)
                    {
                        var args1Str = args[1].ToString();
                        if (s_RegexN.IsMatch(args1Str))
                        {
                            bIndex = int.Parse(args1Str);
                        }
                    }
                    content  = content.Replace(old, ChartCached.ColorToDotStr(theme.GetColor(bIndex)));
                    foundDot = true;
                }
                else if (p == 'a' || p == 'A')
                {
                    if (argsCount == 1)
                    {
                        content = content.Replace(old, serie.name);
                    }
                }
                else if (p == 'b' || p == 'B')
                {
                    var bIndex = dataIndex;
                    if (argsCount >= 2)
                    {
                        var args1Str = args[1].ToString();
                        if (s_RegexN.IsMatch(args1Str))
                        {
                            bIndex = int.Parse(args1Str);
                        }
                    }
                    var needCategory = serie.type == SerieType.Line || serie.type == SerieType.Bar;
                    if (needCategory)
                    {
                        content = content.Replace(old, category);
                    }
                    else
                    {
                        var serieData = serie.GetSerieData(bIndex, dataZoom);
                        content = content.Replace(old, serieData.name);
                    }
                }
                else if (p == 'c' || p == 'C' || p == 'd' || p == 'D')
                {
                    var isPercent      = p == 'd' || p == 'D';
                    var bIndex         = dataIndex;
                    var dimensionIndex = -1;
                    if (argsCount >= 2)
                    {
                        var args1Str = args[1].ToString();
                        if (s_RegexFn.IsMatch(args1Str))
                        {
                            numericFormatter = args1Str;
                        }
                        else if (s_RegexN_N.IsMatch(args1Str))
                        {
                            var temp = args1Str.Split('-');
                            bIndex         = int.Parse(temp[0]);
                            dimensionIndex = int.Parse(temp[1]);
                        }
                        else if (s_RegexN.IsMatch(args1Str))
                        {
                            dimensionIndex = int.Parse(args1Str);
                        }
                        else
                        {
                            Debug.LogError("unmatch:" + args1Str);
                            continue;
                        }
                    }
                    if (argsCount >= 3)
                    {
                        numericFormatter = args[2].ToString();
                    }
                    if (dimensionIndex == -1)
                    {
                        dimensionIndex = 1;
                    }
                    if (numericFormatter == string.Empty)
                    {
                        numericFormatter = SerieHelper.GetNumericFormatter(serie, serie.GetSerieData(bIndex));
                    }
                    var value = serie.GetData(bIndex, dimensionIndex, dataZoom);
                    if (isPercent)
                    {
                        var total   = serie.GetDataTotal(dimensionIndex);
                        var percent = total == 0 ? 0 : value / serie.yTotal * 100;
                        content = content.Replace(old, ChartCached.FloatToStr(percent, numericFormatter));
                    }
                    else
                    {
                        content = content.Replace(old, ChartCached.FloatToStr(value, numericFormatter));
                    }
                }
            }
            content = s_RegexNewLine.Replace(content, PH_NN);
            return(foundDot);
        }
Example #11
0
        internal static Color32 GetAreaColor(Serie serie, ChartTheme theme, int index, bool highlight)
        {
            var areaStyle = serie.areaStyle;
            var color     = !ChartHelper.IsClearColor(areaStyle.color) ? areaStyle.color : theme.GetColor(index);

            if (highlight)
            {
                if (!ChartHelper.IsClearColor(areaStyle.highlightColor))
                {
                    color = areaStyle.highlightColor;
                }
                else
                {
                    color = ChartHelper.GetHighlightColor(color);
                }
            }
            ChartHelper.SetColorOpacity(ref color, areaStyle.opacity);
            return(color);
        }
        public static void InitRadarTooltip(ref StringBuilder sb, Tooltip tooltip, Serie serie, Radar radar,
                                            ChartTheme theme)
        {
            if (radar == null)
            {
                return;
            }
            if (!serie.show)
            {
                return;
            }
            if (tooltip.runtimeGridIndex >= 0)
            {
                return;
            }
            if (serie.radarIndex != radar.index)
            {
                return;
            }
            var dataIndex = tooltip.runtimeDataIndex[1];
            var serieData = serie.GetSerieData(dataIndex);

            if (!serieData.show)
            {
                return;
            }
            var numericFormatter = GetItemNumericFormatter(tooltip, serie, serieData);

            switch (serie.radarType)
            {
            case RadarType.Multiple:
                if (radar.isAxisTooltip)
                {
                    var dimension = tooltip.runtimeDataIndex[2];
                    if (!string.IsNullOrEmpty(serie.name))
                    {
                        sb.Append(serie.name).Append("\n");
                    }
                    var total = serie.GetDataTotal(dimension);
                    var first = true;
                    for (int i = 0; i < serie.dataCount; i++)
                    {
                        var sd = serie.GetSerieData(i);
                        if (!sd.show)
                        {
                            continue;
                        }
                        var key           = sd.name;
                        var value         = sd.GetData(dimension);
                        var itemFormatter = GetItemFormatter(tooltip, serie, sd);
                        numericFormatter = GetItemNumericFormatter(tooltip, serie, sd);
                        if (!first)
                        {
                            sb.Append("\n");
                        }
                        first = false;
                        sb.Append("<color=#").Append(theme.GetColorStr(i)).Append(">● </color>");
                        if (string.IsNullOrEmpty(itemFormatter))
                        {
                            if (string.IsNullOrEmpty(key))
                            {
                                key = radar.indicatorList[dataIndex].name;
                            }
                            if (string.IsNullOrEmpty(key))
                            {
                                sb.AppendFormat("{0}\n", ChartCached.FloatToStr(value, numericFormatter));
                            }
                            else
                            {
                                sb.AppendFormat("{0}: {1}\n", key, ChartCached.FloatToStr(value, numericFormatter));
                            }
                        }
                        else
                        {
                            string content = itemFormatter;
                            FormatterHelper.ReplaceSerieLabelContent(ref content, numericFormatter, value, total, serie.name,
                                                                     sd.name, theme.GetColor(i));
                            sb.Append(content);
                        }
                    }
                }
                else
                {
                    if (serie.index != tooltip.runtimeDataIndex[0])
                    {
                        return;
                    }
                    sb.Append(serieData.name);
                    for (int i = 0; i < radar.indicatorList.Count; i++)
                    {
                        var key   = radar.indicatorList[i].name;
                        var value = serieData.GetData(i);
                        if ((i == 0 && !string.IsNullOrEmpty(serieData.name)) || i > 0)
                        {
                            sb.Append(FormatterHelper.PH_NN);
                        }
                        sb.AppendFormat("{0}: {1}", key, ChartCached.FloatToStr(value, numericFormatter));
                    }
                }
                break;

            case RadarType.Single:
                var key2           = serieData.name;
                var value2         = serieData.GetData(1);
                var total2         = serie.GetDataTotal(1);
                var itemFormatter2 = GetItemFormatter(tooltip, serie, serieData);
                if (string.IsNullOrEmpty(itemFormatter2))
                {
                    if (string.IsNullOrEmpty(key2))
                    {
                        key2 = radar.indicatorList[dataIndex].name;
                    }
                    sb.AppendFormat("{0}: {1}", key2, ChartCached.FloatToStr(value2, numericFormatter));
                }
                else
                {
                    string content = itemFormatter2;
                    FormatterHelper.ReplaceSerieLabelContent(ref content, numericFormatter, value2, total2, serie.name,
                                                             serieData.name, theme.GetColor(serie.index));
                    sb.Append(content);
                }
                break;
            }
        }
Example #13
0
        protected override void Reset()
        {
            base.Reset();
            title.text   = "HeatmapChart";
            tooltip.type = Tooltip.Type.None;
            grid.left    = 100;
            grid.right   = 60;
            grid.bottom  = 60;

            m_XAxes[0].type        = Axis.AxisType.Category;
            m_XAxes[0].boundaryGap = true;
            m_YAxes[0].type        = Axis.AxisType.Category;
            m_YAxes[0].boundaryGap = true;
            m_XAxes[0].splitNumber = 10;
            m_YAxes[0].splitNumber = 10;
            RemoveData();
            var heatmapGridWid = 10f;
            int xSplitNumber   = (int)(grid.runtimeWidth / heatmapGridWid);
            int ySplitNumber   = (int)(grid.runtimeHeight / heatmapGridWid);

            SerieTemplate.AddDefaultHeatmapSerie(this, "serie1");

            visualMap.enable          = true;
            visualMap.max             = 10;
            visualMap.range[0]        = 0f;
            visualMap.range[1]        = 10f;
            visualMap.orient          = Orient.Vertical;
            visualMap.calculable      = true;
            visualMap.location.align  = Location.Align.BottomLeft;
            visualMap.location.bottom = 100;
            visualMap.location.left   = 30;
            var colors = new List <string> {
                "#313695", "#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf",
                "#fee090", "#fdae61", "#f46d43", "#d73027", "#a50026"
            };

            visualMap.inRange.Clear();
            foreach (var str in colors)
            {
                visualMap.inRange.Add(ChartTheme.GetColor(str));
            }
            for (int i = 0; i < xSplitNumber; i++)
            {
                m_XAxes[0].data.Add((i + 1).ToString());
            }
            for (int i = 0; i < ySplitNumber; i++)
            {
                m_YAxes[0].data.Add((i + 1).ToString());
            }
            for (int i = 0; i < xSplitNumber; i++)
            {
                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 list = new List <float> {
                        i, j, value
                    };
                    AddData(0, list);
                }
            }
        }
        internal Color32 GetAxisLineColor(ChartTheme theme, int index)
        {
            var color = !ChartHelper.IsClearColor(axisLine.barColor) ? axisLine.barColor : theme.GetColor(index);

            ChartHelper.SetColorOpacity(ref color, axisLine.lineStyle.opacity);
            return(color);
        }
Example #15
0
 public static string GetFormatterContent(Tooltip tooltip, int dataIndex, Series series, ChartTheme theme,
                                          string category = null, DataZoom dataZoom = null, bool isCartesian = false, Radar radar = null)
 {
     if (string.IsNullOrEmpty(tooltip.formatter))
     {
         var sb            = ChartHelper.sb;
         var title         = tooltip.titleFormatter;
         var formatTitle   = !string.IsNullOrEmpty(title);
         var titleIsIgnroe = false;
         var needCategory  = false;
         var first         = true;
         var isScatter     = false;
         sb.Length = 0;
         if ("{i}".Equals(tooltip.titleFormatter))
         {
             title         = string.Empty;
             formatTitle   = false;
             titleIsIgnroe = true;
         }
         for (int i = 0; i < series.Count; i++)
         {
             var serie = series.GetSerie(i);
             if (tooltip.runtimeGridIndex >= 0 && serie.runtimeGridIndex != tooltip.runtimeGridIndex)
             {
                 continue;
             }
             if (serie.type == SerieType.Scatter || serie.type == SerieType.EffectScatter)
             {
                 if (serie.show && IsSelectedSerie(tooltip, serie.index))
                 {
                     isScatter = true;
                     var itemFormatter = GetItemFormatter(tooltip, serie, null);
                     if (string.IsNullOrEmpty(itemFormatter))
                     {
                         if (!first)
                         {
                             sb.Append(FormatterHelper.PH_NN);
                         }
                         InitDefaultContent(ref sb, tooltip, serie, dataIndex, category, theme, dataZoom, isCartesian, radar);
                         first = false;
                         continue;
                     }
                     var itemTitle = title;
                     if (!string.IsNullOrEmpty(itemTitle))
                     {
                         FormatterHelper.ReplaceContent(ref itemTitle, dataIndex, tooltip.numericFormatter, serie, series, theme, category, dataZoom);
                         sb.Append(itemTitle).Append(FormatterHelper.PH_NN);
                     }
                     var dataIndexList = tooltip.runtimeSerieIndex[serie.index];
                     foreach (var tempIndex in dataIndexList)
                     {
                         string content  = itemFormatter;
                         var    foundDot = FormatterHelper.ReplaceContent(ref content, tempIndex, tooltip.numericFormatter, serie, series, theme, category, dataZoom);
                         if (!foundDot)
                         {
                             sb.Append(ChartCached.ColorToDotStr(theme.GetColor(serie.index)));
                         }
                         sb.Append(content).Append(FormatterHelper.PH_NN);
                     }
                 }
             }
             else if (IsNeedTooltipSerie(serie, tooltip))
             {
                 var itemFormatter = string.Empty;
                 if (serie.type == SerieType.Gauge)
                 {
                     var serieData = serie.GetSerieData(0, dataZoom);
                     if (serieData == null)
                     {
                         continue;
                     }
                     itemFormatter = GetItemFormatter(tooltip, serie, serieData);
                 }
                 else
                 {
                     var serieData = serie.GetSerieData(dataIndex, dataZoom);
                     if (serieData == null)
                     {
                         continue;
                     }
                     itemFormatter = GetItemFormatter(tooltip, serie, serieData);
                 }
                 needCategory = needCategory || (serie.type == SerieType.Line || serie.type == SerieType.Bar);
                 if (formatTitle)
                 {
                     FormatterHelper.ReplaceContent(ref title, dataIndex, tooltip.numericFormatter, serie, series, theme, category, dataZoom);
                 }
                 if (serie.show)
                 {
                     if (string.IsNullOrEmpty(itemFormatter) || serie.type == SerieType.Radar)
                     {
                         if (!first)
                         {
                             sb.Append(FormatterHelper.PH_NN);
                         }
                         InitDefaultContent(ref sb, tooltip, serie, dataIndex, category, theme, dataZoom, isCartesian, radar);
                         first = false;
                         continue;
                     }
                     string content = itemFormatter;
                     FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, serie, series, theme, category, dataZoom);
                     if (!first)
                     {
                         sb.Append(FormatterHelper.PH_NN);
                     }
                     var dotColorIndex = serie.type == SerieType.Pie || serie.type == SerieType.Radar || serie.type == SerieType.Ring ? dataIndex : i;
                     sb.Append(ChartCached.ColorToDotStr(theme.GetColor(dotColorIndex)));
                     sb.Append(content);
                     first = false;
                 }
             }
         }
         if (isScatter)
         {
             return(FormatterHelper.TrimAndReplaceLine(sb));
         }
         else if (string.IsNullOrEmpty(title))
         {
             if (needCategory && !titleIsIgnroe)
             {
                 return(category + FormatterHelper.PH_NN + FormatterHelper.TrimAndReplaceLine(sb));
             }
             else
             {
                 return(FormatterHelper.TrimAndReplaceLine(sb));
             }
         }
         else
         {
             title = FormatterHelper.TrimAndReplaceLine(title);
             return(title + FormatterHelper.PH_NN + FormatterHelper.TrimAndReplaceLine(sb));
         }
     }
     else
     {
         string content = tooltip.formatter;
         FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, null, series, theme, category, dataZoom);
         return(content);
     }
 }
Example #16
0
        public static string GetPolarFormatterContent(Tooltip tooltip, Series series, ChartTheme theme, AngleAxis angleAxis)
        {
            if (string.IsNullOrEmpty(tooltip.formatter))
            {
                var sb = ChartHelper.sb;
                sb.Length = 0;
                var title       = tooltip.titleFormatter;
                var formatTitle = !string.IsNullOrEmpty(title);
                if ("{i}".Equals(tooltip.titleFormatter))
                {
                    title       = string.Empty;
                    formatTitle = false;
                }
                else if (string.IsNullOrEmpty(title))
                {
                    var angle = angleAxis.clockwise ? tooltip.runtimeAngle : 360 - tooltip.runtimeAngle;
                    title = ChartCached.FloatToStr(angle);
                }
                foreach (var serie in series.list)
                {
                    if (serie.show && IsSelectedSerie(tooltip, serie.index))
                    {
                        if (formatTitle)
                        {
                            FormatterHelper.ReplaceContent(ref title, 0, tooltip.numericFormatter, serie, series, theme, null, null);
                        }
                        var dataIndexList = tooltip.runtimeSerieIndex[serie.index];

                        for (int i = 0; i < dataIndexList.Count; i++)
                        {
                            var   dataIndex = dataIndexList[i];
                            var   serieData = serie.GetSerieData(dataIndex);
                            var   itemFormatter = GetItemFormatter(tooltip, serie, serieData);
                            var   numericFormatter = GetItemNumericFormatter(tooltip, serie, serieData);
                            float xValue, yValue;
                            serie.GetXYData(dataIndex, null, out xValue, out yValue);
                            if (string.IsNullOrEmpty(itemFormatter))
                            {
                                sb.Append("<color=#").Append(theme.GetColorStr(serie.index)).Append(">● </color>");
                                if (!string.IsNullOrEmpty(serie.name))
                                {
                                    sb.Append(serie.name).Append(": ");
                                }
                                sb.AppendFormat("{0}", ChartCached.FloatToStr(xValue, numericFormatter));
                                if (i != dataIndexList.Count - 1)
                                {
                                    sb.Append(FormatterHelper.PH_NN);
                                }
                            }
                            else
                            {
                                string content = itemFormatter;
                                FormatterHelper.ReplaceContent(ref content, dataIndex, tooltip.numericFormatter, serie, series, theme, null, null);
                                var dotColorIndex = serie.type == SerieType.Pie || serie.type == SerieType.Radar || serie.type == SerieType.Ring ? dataIndex : serie.index;
                                sb.Append(ChartCached.ColorToDotStr(theme.GetColor(dotColorIndex)));
                                sb.Append(content);
                            }
                        }
                        sb.Append(FormatterHelper.PH_NN);
                    }
                }
                if (string.IsNullOrEmpty(title))
                {
                    return(FormatterHelper.TrimAndReplaceLine(sb));
                }
                else
                {
                    title = FormatterHelper.TrimAndReplaceLine(title);
                    return(title + FormatterHelper.PH_NN + FormatterHelper.TrimAndReplaceLine(sb));
                }
            }
            else
            {
                string content = tooltip.formatter;
                FormatterHelper.ReplaceContent(ref content, 0, tooltip.numericFormatter, null, series, theme, null, null);
                return(content);
            }
        }